[Scummvm-git-logs] scummvm master -> 3018522b20e517a03db37fa7566d906af45514c8

mduggan noreply at scummvm.org
Sat May 23 05:22:32 UTC 2026


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

Summary:
4297968f0a ACCESS: Start work on support for Noctropolis
08c809d331 ACCESS: More work on Noctropolis, nearly working intro
ffc51120ee ACCESS: More fixes for high-res mode
98f5de4512 ACCESS: Fix remaining issues with intro
94c00e5f0c ACCESS: Add startup splash screens for Noctropolis
992574aff3 ACCESS: WIP for Noctropolis font loading
00476ffdc2 ACCESS: Completed Noctropolis font loading
283e07d7c0 ACCESS: Start work on loading room data for Noctropolis
2b477970ce ACCESS: Add script to parse Noctropolis room data
d425243823 ACCESS: Add room/sound/music loading code for Noctropolis
ff822a7703 ACCESS: Add mouse cursor extraction for Noctropolis
9f9a2af971 ACCESS: Add stubs for Noctropolis-specific script cmds
ce07683e87 ACCESS: Initialize Noctropols timers correctly
198b25949f ACCESS: Correct ego name logic for Noctropolis
04d48d9d37 ACCESS: Add initial reloadRoom1 for Noctropolis
1787cbbef2 ACCESS: Initial implementation of text drawing ops
4d7cc2d9b5 ACCESS: Fix noctropolis extractor
c7b90b2629 ACCESS: Fix noctropolis room 3 loading
79d76ccb8a ACCESS: Revert file ident change
e150f2ce8c ACCESS: Start to implement more Noctropolis commands
30329c91f9 ACCESS: Add additional Noctropolis filenames
79a2790017 ACCESS: WIP loading for Noctropolis player data
6874f1c50a ACCESS: Implement a few more Noctropolis opcodes
5a9d1c0d23 ACCESS: More wip for loading noctropolis player data
1891872015 ACCESS: Sync volume after main menu opened
d3a7415853 ACCESS: Add a few more Noctropolis script stubs
d2503eb7af ACCESS: Properly load Noctropolis data and player animations
e59824db7c ACCESS: Fix Noctropolis cursors
1119d110cd ACCESS: Add Noctropolis action codes
62404365b0 ACCESS: Various fixes for dialog rendering (still not complete)
f3ef8730d9 ACCESS: Further progress on noctropolis
b41400e8c0 ACCESS: Skip intro sequence fully if skip_intro is set
ade5ba42d4 ACCESS: Implement anim8 for Noctropolis
ca6f3c8806 ACCESS: Fix which player model to load
208cedd4f4 ACCESS: Actually play music in Noctropolis intro.
5a9174a844 ACCESS: Add comments
3226de821c ACCESS: Add startMusicFade for Noctropolis
a0269ea274 ACCESS: Add palette functions for Noctropolis
aaa66ef174 ACCESS: const correctness for comic viewer
e3335f312c ACCESS: Add a bunch more resources for Noctropolis
86d9963d34 ACCESS: Implement more pieces of Noctropolis
41da7e27b3 ACCESS: Fix some variable shadowing
e7afe42ee3 ACCESS: Add comic data for Noctropolis
ee1d4a7f95 ACCESS: Begin implementing Noctropolis inventory
dba98d86d5 ACCESS: Implement Noctropolis inventory
b3c3e6773c ACCESS: Fix wrapping in comics
d822d5e67a ACCESS: Start support for Noctropolis videos
40999e394a ACCESS: Fixes for comic rendering. Now matches original
9bf4b170ba ACCESS: More progress on Noctropolis scripts and videos
035dafef04 ACCESS: Fix access video timing a bit
d59b56d241 ACCESS: Fix noctropolis dialog clearing
7067f95b6c ACCESS: Fix noctropolis videos slightly
ca6616db81 ACCESS: Many improvements, can now get to Noctropolis in the game.
3af926f351 ACCESS: Fixes for noctropolis ask box
daa2dd203e ACCESS: Fix some misc Noctropolis pal/fade issues
fd337da36d ACCESS: Make Noctropolis travel work
abf79cbe2d ACCESS: Load Stiletto data correctly
ca04a107a8 ACCESS: Fix msvc build
efe2bb81f8 ACCESS: Partially fix Stiletto in Noctropolis
ee6c0fdc06 ACCESS: More Stiletto fixes for Noctropolis
524d663c3e ACCESS: Fixes for Noctropolis travel
9c2db3ad25 ACCESS: Clean up resources a bit
28728dc3a0 ACCESS: Misc fixes for Noctropolis
e2e40d33af ACCESS: Mark some consts as constexpr
8e8f4ecd4a ACCESS: Add frame to video playback
051c1de0b0 ACCESS: Fix some compiler warnings, more const
33cdfe7917 ACCESS: add debugger command to show hotspots
2f36e80646 ACCESS: Fix small Noctropolis bugs
2fefed8833 ACCESS: Implement death screens for Noctropolis
971eea0e55 ACCESS: Fix various Noctropolis drawing issues
5df868517c ACCESS: Fix compile after rebase
25e01f3411 ACCESS: Follow per-frame delays in Noctropolis
05eed7cb3c ACCESS: Fix switching to Darksheer in Noctropolis
8d91a3a9f5 ACCESS: Fix player direction usage in Noctropolis
1db9c762d8 ACCESS: Remove member var that can just be local
c368cd658c ACCESS: Allow video skip while interface is off
462d9f12db ACCESS: Fix small stil scale issues
eb3ce5e5be ACCESS: Fix Noctropolis Shoto cutscene
957cf0a634 ACCESS: Fix Noctropolis Stiletto scaling
3c7f7376f3 ACCESS: Fix fade in Noctropolis greenhouse´
7cf8ce7179 ACCESS: Misc fixes, Noctropolis can now be completed
4293ebe5c9 ACCESS: Cleanup sound handling a bit
17dcea9447 ACCESS: Clean up Noctropolis restart issues
0a0539639f ACCESS: Small fixes for Noctropolis death screen
b7be69dc26 ACCESS: Fix cmdRetPos in MM
ec15fef92a ACCESS: Fix v1 video player
7fd8c6aab6 ACCESS: Fix build after rebase
d6fc8b3ec3 ACCESS: Fix whitespace and remove unused files
4840b82578 ACCESS: Remove unused _frameScale
7c514ab5ce ACCESS: Remove redundant comment
7b7cc074bf ACCESS: Add support for Noctropolis demo and original release
3df694c6f3 ACCESS: Cleanup redundant comments and warnings
2ccaf9caa3 ACCESS: Fix delay in some Noct special functions
6f52ecaaa1 ACCESS: Fix debugger for Noctropolis
4d7ec40e5c ACCESS: Fix Noctropolis end credits
2b5b953f4f ACCESS: Fix Stiletto y offset in Noctropolis
fc58b68623 ACCESS: Fix Noctropolis inv scrolling
27d17566c8 ACCESS: Add Nightdive credits for Noctropolis
3018522b20 ACCESS: Fix paths for Noctropolis demo


Commit: 4297968f0a7ad3d713d3e38688ac4f84cfe1418b
    https://github.com/scummvm/scummvm/commit/4297968f0a7ad3d713d3e38688ac4f84cfe1418b
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Start work on support for Noctropolis

Changed paths:
  A engines/access/noctropolis/noctropolis_comicviewer.cpp
  A engines/access/noctropolis/noctropolis_comicviewer.h
  A engines/access/noctropolis/noctropolis_game.cpp
  A engines/access/noctropolis/noctropolis_game.h
  A engines/access/noctropolis/noctropolis_intro.cpp
  A engines/access/noctropolis/noctropolis_inventory.cpp
  A engines/access/noctropolis/noctropolis_map.cpp
  A engines/access/polygon.cpp
  A engines/access/polygon.h
    engines/access/access.cpp
    engines/access/access.h
    engines/access/amazon/amazon_game.cpp
    engines/access/amazon/amazon_game.h
    engines/access/amazon/amazon_room.cpp
    engines/access/data.h
    engines/access/detection.cpp
    engines/access/detection_tables.h
    engines/access/events.cpp
    engines/access/events.h
    engines/access/files.cpp
    engines/access/files.h
    engines/access/font.h
    engines/access/martian/martian_game.cpp
    engines/access/martian/martian_game.h
    engines/access/martian/martian_scripts.cpp
    engines/access/metaengine.cpp
    engines/access/module.mk
    engines/access/player.cpp
    engines/access/video.cpp


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 133596aff45..287a95a10b8 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -209,7 +209,7 @@ void AccessEngine::initialize() {
 
 const SpriteResource *AccessEngine::getIcons() {
 	if (!_icons) {
-		Resource *iconData = _files->loadFile("ICONS.LZ");
+		Resource *iconData = _files->loadRawFile("ICONS.LZ");
 		_icons = new SpriteResource(this, iconData);
 		delete iconData;
 	}
@@ -226,6 +226,9 @@ Common::Error AccessEngine::run() {
 
 	setVGA();
 	initialize();
+	
+	initObjects();
+	setupGame();
 
 	playGame();
 
diff --git a/engines/access/access.h b/engines/access/access.h
index 1a4323f96a6..a38d3e21da1 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -185,6 +185,16 @@ protected:
 	* Synchronize savegame data
 	*/
 	virtual Common::Error synchronize(Common::Serializer &s);
+	
+	/**
+	 * Create game-specific objects, called just before setupGame.
+	 */
+	virtual void initObjects() = 0;
+
+	/**
+	 * Set up the game game-specific objects, called just before playGame.
+	 */
+	virtual void setupGame() = 0;
 
 public:
 	AnimationManager *_animation;
diff --git a/engines/access/amazon/amazon_game.cpp b/engines/access/amazon/amazon_game.cpp
index 22f955cd9b3..e82c05af6a3 100644
--- a/engines/access/amazon/amazon_game.cpp
+++ b/engines/access/amazon/amazon_game.cpp
@@ -216,7 +216,7 @@ void AmazonEngine::loadEstablish(int estabIndex) {
 		int oldGroup = _establishGroup;
 		_establishGroup = 0;
 
-		_establish = _files->loadFile(EST_TABLE[oldGroup]);
+		_establish = _files->loadRawFile(EST_TABLE[oldGroup]);
 		_establishCtrlTblOfs = READ_LE_UINT16(_establish->data());
 
 		int ofs = _establishCtrlTblOfs + (estabIndex * 2);
@@ -235,7 +235,7 @@ void AmazonEngine::loadEstablish(int estabIndex) {
 		_narateFile = 0;
 		_txtPages = 0;
 		_sndSubFile = 0;
-		_establish = _files->loadFile("ETEXT.DAT");
+		_establish = _files->loadRawFile("ETEXT.DAT");
 	}
 }
 
@@ -307,7 +307,7 @@ void AmazonEngine::tileScreen() {
 	if (!_files->existFile(_tileFiles[idx]))
 		return;
 
-	Resource *res = _files->loadFile(_tileFiles[idx]);
+	Resource *res = _files->loadRawFile(_tileFiles[idx]);
 	int x = res->_stream->readSint16LE();
 	int y = res->_stream->readSint16LE();
 	int size = ((x + 2) * y) + 10;
diff --git a/engines/access/amazon/amazon_game.h b/engines/access/amazon/amazon_game.h
index 1ce27ae8e46..71355c5087b 100644
--- a/engines/access/amazon/amazon_game.h
+++ b/engines/access/amazon/amazon_game.h
@@ -39,7 +39,7 @@ private:
 	/**
 	 * Setup variables for the game
 	 */
-	void setupGame();
+	void setupGame() override;
 
 	/**
 	 * Initialize variables found in the config file
@@ -47,7 +47,7 @@ private:
 	void configSelect();
 
 	void initVariables();
-	void initObjects();
+	void initObjects() override;
 	void calcIQ();
 	void helpTitle();
 	void drawHelpText(const Common::String &msg);
diff --git a/engines/access/amazon/amazon_room.cpp b/engines/access/amazon/amazon_room.cpp
index 006ea207ea1..cbbd2e466ca 100644
--- a/engines/access/amazon/amazon_room.cpp
+++ b/engines/access/amazon/amazon_room.cpp
@@ -76,7 +76,7 @@ void AmazonRoom::reloadRoom() {
 void AmazonRoom::reloadRoom1() {
 	if (_vm->_player->_roomNumber == 29 || _vm->_player->_roomNumber == 31
 			|| _vm->_player->_roomNumber == 42 || _vm->_player->_roomNumber == 44) {
-		Resource *spriteData = _vm->_files->loadFile("MAYA.LZ");
+		Resource *spriteData = _vm->_files->loadRawFile("MAYA.LZ");
 		_game->_inactive._altSpritesPtr = new SpriteResource(_vm, spriteData);
 		delete spriteData;
 		_vm->_currentCharFlag = false;
diff --git a/engines/access/data.h b/engines/access/data.h
index a2b56a9445b..fcc8ed305ce 100644
--- a/engines/access/data.h
+++ b/engines/access/data.h
@@ -45,6 +45,13 @@ struct TimerEntry {
 	int _initTm;
 	int _timer;
 	byte _flag;
+	
+	bool isActive() const { return _flag != 0; }
+
+	void reset() {
+		_timer = _initTm;
+		_flag = 1;
+	}
 
 	TimerEntry() : _flag(0), _initTm(0), _timer(0) { }
 };
diff --git a/engines/access/detection.cpp b/engines/access/detection.cpp
index a2aa876ec2d..caa4ba98768 100644
--- a/engines/access/detection.cpp
+++ b/engines/access/detection.cpp
@@ -27,6 +27,7 @@
 static const PlainGameDescriptor AccessGames[] = {
 	{"amazon", "Amazon: Guardians of Eden"},
 	{"martian", "Martian Memorandum"},
+	{"noctropolis", "Noctropolis"},
 	{nullptr, nullptr}
 };
 
diff --git a/engines/access/detection_tables.h b/engines/access/detection_tables.h
index b3e9d198ac5..77e0dc4e08c 100644
--- a/engines/access/detection_tables.h
+++ b/engines/access/detection_tables.h
@@ -129,6 +129,21 @@ static const AccessGameDescription gameDescriptions[] = {
 		kGameMartianMemorandum,
 		0
 	},
+	
+	{
+		// Noctropolis (sum from GOG macOS version)
+		{
+			"noctropolis",
+			nullptr,
+			AD_ENTRY1s("dark/scene01.ap", "3a154bf58e10cd7ace14cab1bf5adf4a", 147954),
+			Common::EN_ANY,
+			Common::kPlatformWindows,
+			ADGF_UNSTABLE,
+			GUIO1(GUIO_NONE)
+		},
+		kGameNoctropolis,
+		0
+	},
 
 	{ AD_TABLE_END_MARKER, 0, 0 }
 };
diff --git a/engines/access/events.cpp b/engines/access/events.cpp
index e68505420a2..362a6433a1b 100644
--- a/engines/access/events.cpp
+++ b/engines/access/events.cpp
@@ -329,6 +329,12 @@ void EventsManager::debounceLeft() {
 	}
 }
 
+void EventsManager::debounceRight() {
+	while (_rightButton && !_vm->shouldQuit()) {
+		pollEventsAndWait();
+	}
+}
+
 void EventsManager::clearEvents() {
 	_leftButton = _rightButton = false;
 	zeroKeysActions();
diff --git a/engines/access/events.h b/engines/access/events.h
index c99a6b5f547..48845ac5e9b 100644
--- a/engines/access/events.h
+++ b/engines/access/events.h
@@ -143,6 +143,8 @@ public:
 
 	void debounceLeft();
 
+	void debounceRight();
+
 	void clearEvents();
 
 	void waitKeyActionMouse();
diff --git a/engines/access/files.cpp b/engines/access/files.cpp
index 2a74446308b..009ee485d7b 100644
--- a/engines/access/files.cpp
+++ b/engines/access/files.cpp
@@ -87,7 +87,6 @@ byte *Resource::data() {
 /*------------------------------------------------------------------------*/
 
 FileManager::FileManager(AccessEngine *vm) : _vm(vm) {
-	_fileNumber = -1;
 	_setPaletteFlag = true;
 }
 
@@ -95,8 +94,12 @@ FileManager::~FileManager() {
 }
 
 Resource *FileManager::loadFile(int fileNum, int subfile) {
+	return loadSubFile(_vm->_res->FILENAMES[fileNum], subfile);
+}
+
+Resource *FileManager::loadSubFile(const Common::Path &filename, int subfile) {
 	Resource *res = new Resource();
-	setAppended(res, fileNum);
+	setAppended(res, filename);
 	gotoAppended(res, subfile);
 
 	handleFile(res);
@@ -107,7 +110,7 @@ Resource *FileManager::loadFile(const FileIdent &fileIdent) {
 	return loadFile(fileIdent._fileNum, fileIdent._subfile);
 }
 
-Resource *FileManager::loadFile(const Common::Path &filename) {
+Resource *FileManager::loadRawFile(const Common::Path &filename) {
 	Resource *res = new Resource();
 
 	// Open the file
@@ -127,7 +130,7 @@ bool FileManager::existFile(const Common::Path &filename) {
 
 void FileManager::openFile(Resource *res, const Common::Path &filename) {
 	// Open up the file
-	_fileNumber = -1;
+	_indexedFilename.clear();
 	if (!res->_file.open(filename))
 		error("Could not open file - %s", filename.toString().c_str());
 }
@@ -167,7 +170,7 @@ void FileManager::loadScreen(int fileNum, int subfile) {
 }
 
 void FileManager::loadScreen(const Common::Path &filename) {
-	Resource *res = loadFile(filename);
+	Resource *res = loadRawFile(filename);
 	handleScreen(_vm->_screen, res);
 	delete res;
 }
@@ -198,24 +201,27 @@ void FileManager::handleFile(Resource *res) {
 	}
 }
 
-void FileManager::setAppended(Resource *res, int fileNum) {
+void FileManager::setAppended(Resource *res, const Common::Path &fileName) {
 	// Open the file for access
-	if (!res->_file.open(_vm->_res->FILENAMES[fileNum]))
-		error("Could not open file %s", _vm->_res->FILENAMES[fileNum].toString().c_str());
+	if (!res->_file.open(fileName))
+		error("Could not open file %s", fileName.toString().c_str());
 
 	// If a different file has been opened then previously, load its index
-	if (_fileNumber != fileNum) {
-		_fileNumber = fileNum;
-
-		// Read in the file index
-		int count = res->_file.readUint16LE();
-		assert(count <= 100);
-		_fileIndex.resize(count);
-		for (int i = 0; i < count; ++i)
-			_fileIndex[i] = res->_file.readUint32LE();
+	if (_indexedFilename != fileName) {
+		_indexedFilename = fileName;
+		readIndex(res);
 	}
 }
 
+void FileManager::readIndex(Resource *res) {
+	// Read in the file index
+	int count = res->_file.readUint16LE();
+	assert(count <= 100);
+	_fileIndex.resize(count);
+	for (int i = 0; i < count; ++i)
+		_fileIndex[i] = res->_file.readUint32LE();
+}
+
 void FileManager::gotoAppended(Resource *res, int subfile) {
 	uint32 offset = _fileIndex[subfile];
 	uint32 size = (subfile == (int)_fileIndex.size() - 1) ? res->_file.size() - offset :
diff --git a/engines/access/files.h b/engines/access/files.h
index bc976fa393c..06e9e410b59 100644
--- a/engines/access/files.h
+++ b/engines/access/files.h
@@ -72,6 +72,9 @@ class FileManager {
 private:
 	AccessEngine *_vm;
 
+	/**
+	 * Open a raw file, no index data is read.
+	 */
 	void openFile(Resource *res, const Common::Path &filename);
 
 	/**
@@ -85,16 +88,22 @@ private:
 	void handleScreen(Graphics::ManagedSurface *dest, Resource *res);
 
 	/**
-	* Open up a sub-file container file
-	*/
-	void setAppended(Resource *file, int fileNum);
+	 * Open up a sub-file container file
+	 */
+	void setAppended(Resource *file, const Common::Path &fileName);
 
 	/**
-	* Open up a sub-file resource within an alrady opened container file.
-	*/
+	 * Open up a sub-file resource within an alrady opened container file.
+	 */
 	void gotoAppended(Resource *file, int subfile);
+	
+	/**
+	 * Read index data from the container file
+	 */
+	void readIndex(Resource *res);
+
 public:
-	int _fileNumber;
+	Common::Path _indexedFilename;
 	Common::Array<uint32> _fileIndex;
 	bool _setPaletteFlag;
 public:
@@ -117,9 +126,14 @@ public:
 	Resource *loadFile(const FileIdent &fileIdent);
 
 	/**
-	 * Load a given file by name
+	 * Load a given subfile from a container file by name.
+	 */
+	Resource *loadSubFile(const Common::Path &containerFile, int subfile);
+
+	/**
+	 * Load a given *non-container* file by name directly.
 	 */
-	Resource *loadFile(const Common::Path &filename);
+	Resource *loadRawFile(const Common::Path &filename);
 
 	/**
 	 * Load a given scren from a container file
diff --git a/engines/access/font.h b/engines/access/font.h
index f94a740c0cb..f3800d0400f 100644
--- a/engines/access/font.h
+++ b/engines/access/font.h
@@ -66,6 +66,11 @@ public:
 	 */
 	int stringWidth(const Common::String &msg) const;
 
+	/**
+	 * Get the height of a given string
+	 */
+	virtual int stringHeight(const Common::String &msg) const { return _height; };
+
 	/**
 	 * Type of line wrapping - Martian wraps based on chars, Amazon based on px.
 	 *
diff --git a/engines/access/martian/martian_game.cpp b/engines/access/martian/martian_game.cpp
index c35eedbdd92..2eb3c2ef619 100644
--- a/engines/access/martian/martian_game.cpp
+++ b/engines/access/martian/martian_game.cpp
@@ -138,12 +138,12 @@ void MartianEngine::doSpecial5(int param1) {
 	_screen->setIconPalette();
 	_screen->forceFadeIn();
 
-	Resource *cellsRes = _files->loadFile("CELLS00.LZ");
+	Resource *cellsRes = _files->loadRawFile("CELLS00.LZ");
 	_objectsTable[0] = new SpriteResource(this, cellsRes);
 	delete cellsRes;
 
 	_timers[20]._timer = _timers[20]._initTm = 30;
-	Resource *notesRes = _files->loadFile("NOTES.DAT");
+	Resource *notesRes = _files->loadRawFile("NOTES.DAT");
 	notesRes->_stream->skip(param1 * 2);
 	int pos = notesRes->_stream->readUint16LE();
 	notesRes->_stream->seek(pos);
@@ -158,11 +158,7 @@ void MartianEngine::doSpecial5(int param1) {
 }
 
 void MartianEngine::playGame() {
-	// Initialize Martian Memorandum game-specific objects
-	initObjects();
-
 	// Setup the game
-	setupGame();
 	configSelect();
 
 	if (_loadSaveSlot == -1) {
@@ -372,7 +368,7 @@ void MartianEngine::establish(int estabIndex, int sub) {
 
 	// TODO: Original has a small delay here.
 
-	Resource *notesRes = _files->loadFile("ETEXT.DAT");
+	Resource *notesRes = _files->loadRawFile("ETEXT.DAT");
 	notesRes->_stream->seek(2 * sub);
 	uint16 msgOffset = notesRes->_stream->readUint16LE();
 	if (msgOffset == 0 || msgOffset >= notesRes->_stream->size()) {
diff --git a/engines/access/martian/martian_game.h b/engines/access/martian/martian_game.h
index af1a8506bd4..ed618ef7f1d 100644
--- a/engines/access/martian/martian_game.h
+++ b/engines/access/martian/martian_game.h
@@ -43,9 +43,9 @@ private:
 	/**
 	 * Setup variables for the game
 	 */
-	void setupGame();
+	void setupGame() override;
 
-	void initObjects();
+	void initObjects() override;
 	void configSelect();
 	void initVariables();
 	void setupTimers();
diff --git a/engines/access/martian/martian_scripts.cpp b/engines/access/martian/martian_scripts.cpp
index 51ea2f883e1..e9fab6b6da7 100644
--- a/engines/access/martian/martian_scripts.cpp
+++ b/engines/access/martian/martian_scripts.cpp
@@ -148,7 +148,7 @@ void MartianScripts::cmdSpecial6() {
 	_vm->_screen->setIconPalette();
 	_vm->_screen->forceFadeIn();
 
-	Resource *cellsRes = _vm->_files->loadFile("CELLS00.LZ");
+	Resource *cellsRes = _vm->_files->loadRawFile("CELLS00.LZ");
 	_vm->_objectsTable[0] = new SpriteResource(_vm, cellsRes);
 	delete cellsRes;
 
@@ -161,7 +161,7 @@ void MartianScripts::cmdSpecial6() {
 	_vm->_screen->_maxChars = 50;
 	_vm->_screen->_printOrg = _vm->_screen->_printStart = Common::Point(24, 18);
 
-	Resource *notesRes = _vm->_files->loadFile("ETEXT.DAT");
+	Resource *notesRes = _vm->_files->loadRawFile("ETEXT.DAT");
 	notesRes->_stream->seek(72);
 	uint16 offset = notesRes->_stream->readUint16LE();
 	notesRes->_stream->seek(offset);
diff --git a/engines/access/metaengine.cpp b/engines/access/metaengine.cpp
index 513441a3db9..6446dfde769 100644
--- a/engines/access/metaengine.cpp
+++ b/engines/access/metaengine.cpp
@@ -30,6 +30,7 @@
 #include "access/access.h"
 #include "access/amazon/amazon_game.h"
 #include "access/martian/martian_game.h"
+#include "access/noctropolis/noctropolis_game.h"
 
 #include "access/detection.h"
 
@@ -109,6 +110,9 @@ Common::Error AccessMetaEngine::createInstance(OSystem *syst, Engine **engine, c
 	case Access::kGameMartianMemorandum:
 		*engine = new Access::Martian::MartianEngine(syst, gd);
 		break;
+	case Access::kGameNoctropolis:
+		*engine = new Access::Noctropolis::NoctropolisEngine(syst, gd);
+		break;
 	default:
 		return Common::kUnsupportedGameidError;
 	}
diff --git a/engines/access/module.mk b/engines/access/module.mk
index cf861d4d48f..219fbe8d612 100644
--- a/engines/access/module.mk
+++ b/engines/access/module.mk
@@ -15,6 +15,7 @@ MODULE_OBJS := \
 	inventory.o \
 	metaengine.o \
 	player.o \
+	polygon.o \
 	resources.o \
 	room.o \
 	screen.o \
@@ -27,12 +28,14 @@ MODULE_OBJS := \
 	amazon/amazon_resources.o \
 	amazon/amazon_room.o \
 	amazon/amazon_scripts.o \
+	martian/martian_duct.o \
 	martian/martian_game.o \
 	martian/martian_player.o \
 	martian/martian_resources.o \
-	martian/martian_duct.o \
 	martian/martian_room.o \
 	martian/martian_scripts.o \
+	noctropolis/noctropolis_comicviewer.o \
+	noctropolis/noctropolis_game.o \
 	martian/midiparser_bemd.o \
 	video/movie_decoder.o
 
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
new file mode 100644
index 00000000000..08233a3c783
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -0,0 +1,224 @@
+#include "access/noctropolis/noctropolis_comicviewer.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+int PolygonResource::findPolygonAt(int16 x, int16 y) const {
+	for (uint i = 0; i < _polygons.size(); i++) {
+		if (_polygons[i].pointInside(x, y))
+			return i;
+	}
+	return -1;
+}
+      
+void PolygonResource::internalLoad(Common::SeekableReadStream &source, uint32 size) {
+	int polygonCount = source.readUint32LE();
+	while (polygonCount--) {
+		Polygon polygon;
+		int pointsCount = source.readUint16LE();
+		while (pointsCount--) {
+			Common::Point point;
+			point.x = source.readUint16LE();
+			point.y = source.readUint16LE();
+			polygon.points.push_back(point);
+		}
+		_polygons.push_back(polygon);
+	}
+}
+  
+void PolygonResource::free() {
+	_polygons.clear();
+}
+
+
+ComicViewer::ComicViewer(NoctropolisEngine *vm)
+	: _vm(vm)
+{
+}
+
+ComicViewer::~ComicViewer() {
+}
+
+void ComicViewer::run(ComicResource *comic) {
+
+	PageResult result = kPageResultNone;
+
+	_currPage = 0;
+	
+	debug("ComicViewer::run() getCount() = %d", comic->getCount());
+
+	while (result != kPageResultExit) {
+		result = runPage(comic->getPage(_currPage));
+		if (result == kPageResultNextPage && _currPage + 1 < comic->getCount()) {
+			_currPage++;
+		} else if (result == kPageResultPrevPage && _currPage > 0) {
+			_currPage--;
+		}
+	}
+
+}
+
+PageResult ComicViewer::runPage(ComicPage *page) {
+
+	PageResult result = kPageResultNone;
+
+	_vm->_files->loadScreen(Common::Path(page->filename.baseName()));
+	_vm->_buffer2.blitFrom(*_vm->_screen);
+
+	Resource *bubbleData = _vm->_files->loadRawFile("comic.ap");
+	_bubbleSprites = new SpriteResource(_vm, bubbleData);
+	delete bubbleData;
+
+	// TODO: Copy the palette else the fade out will be wrong
+	//_vm->_screen->palPaletteRange(pagePicture->getPalette(), 0, 256);
+	//_vm->copySystemPalette();
+	//_vm->setMainPalette();
+
+	//vgaScreen->drawScreen(pagePicture, 640, 400);
+
+	while (result == kPageResultNone) {
+	
+		_vm->_events->pollEvents();
+		_vm->_events->delayUntilNextFrame();
+
+		if (_vm->_events->_mousePos.y >= 389) {
+			PageResult naviResult = kPageResultNone;
+			if (_vm->_events->_mousePos.x < 59)
+				naviResult = kPageResultPrevPage;
+			else if (_vm->_events->_mousePos.x >= 580)
+				naviResult = kPageResultNextPage;
+			if (naviResult != kPageResultNone) {
+				_vm->_events->setCursor(CURSOR_CROSSHAIRS);
+				if (_vm->_events->_leftButton) {
+					_vm->_events->debounceLeft();
+					result = naviResult;
+					break;
+				}
+				continue;
+			}
+		}
+
+		int hotspotIndex = -1;
+		for (uint i = 0; i < page->hotspots.size(); i++) {
+			const ComicPageHotspot &hotspot = page->hotspots[i];
+			if (hotspot.polygons.findPolygonAt(_vm->_events->_mousePos.x, _vm->_events->_mousePos.y) != -1) {
+				hotspotIndex = i;
+				break;
+			}
+		}
+
+		if (hotspotIndex != -1) {
+			_vm->_events->setCursor(CURSOR_CROSSHAIRS);
+			if (_vm->_events->_leftButton) {
+				_vm->_events->debounceLeft();
+				const ComicPageHotspot &hotspot = page->hotspots[hotspotIndex];
+				// TODO: Play hotspot sound
+				for (uint bubbleIndex = 0; bubbleIndex < hotspot.bubbles.size(); bubbleIndex++) {
+					const ComicPageBubble &bubble = hotspot.bubbles[bubbleIndex];
+					drawBubble(bubble);
+					_vm->_events->waitKeyActionMouse();
+					//_vm->drawScreen(pagePicture, 640, 400);
+				}
+			}
+		} else {
+			_vm->_events->setCursor(CURSOR_ARROW);
+		}
+		
+		if (_vm->_events->_rightButton) {
+			result = kPageResultExit;
+			_vm->_events->debounceLeft();
+		}
+
+		_vm->_events->delay();
+
+	}
+
+	delete _bubbleSprites;
+
+	return result;
+
+}
+
+void ComicViewer::drawBubble(const ComicPageBubble &bubble) {
+
+	static const struct {
+		struct { int16 px, py; } positions[4];
+		int16 sprites[3];
+	} kBubbleDef[] = {
+		{{{-43, -13}, {+159, -9}, {-44, +63}, {+150, +61}}, {3, 6, 0}},
+		{{{-48, -15}, {+147, -13}, {-54, +42}, {+139, +44}}, {4, 7, 1}},
+		{{{-53, -17}, {+148, -14}, {-58, +27}, {+143, +28}}, {5, 8, 2}}
+	};
+
+	const Font *font;
+	uint16 textWidth, textHeight;
+	uint16 bubbleX = bubble.x;
+	uint16 bubbleY = bubble.y;
+
+	// TODO: is this the right font choice?
+	if (bubble.style == 0) {
+		font = _vm->_fonts._font1;
+	} else {
+		font = _vm->_fonts._font2;
+	}
+
+	textWidth = font->stringWidth(bubble.text);
+	textHeight = font->stringHeight(bubble.text);
+
+	if (bubble.style == 0) {
+		_vm->_screen->fillRect(Common::Rect(bubble.x - 4, bubble.y - 4, bubble.x + 4 + textWidth, bubble.y + 4 + textHeight), 243);
+		_vm->_screen->frameRect(Common::Rect(bubble.x - 4, bubble.y - 4, bubble.x + 4 + textWidth, bubble.y + 4 + textHeight), 244);
+		// TODO: is this color the one to set?
+		Font::_fontColors[0] = bubble.textColor;
+		font->drawString(_vm->_screen, bubble.text, Common::Point(bubble.x, bubble.y));
+	} else {
+
+		int spriteIndex1, spriteIndex2, style, defIndex;
+		byte color = bubble.textColor;
+		byte textColor;
+
+		if (bubble.style < 5) {
+			style = bubble.style - 1;
+			spriteIndex1 = style + 0;
+		} else {
+			style = bubble.style - 5;
+			spriteIndex1 = style + 8;
+		}
+
+		if (textHeight > 40)
+			defIndex = 0;
+		else if (textHeight > 28)
+			defIndex = 1;
+		else
+			defIndex = 2;
+		
+		bubbleX += kBubbleDef[defIndex].positions[style].px;
+		bubbleY += kBubbleDef[defIndex].positions[style].py;
+
+		if (color == 246) {
+			textColor = 255;
+			spriteIndex2 = kBubbleDef[defIndex].sprites[0];
+			spriteIndex1 += 13;
+		} else if (color == 244) {
+			textColor = 255;
+			spriteIndex2 = kBubbleDef[defIndex].sprites[1];
+			spriteIndex1 += 13;
+		} else {
+			textColor = 246;
+			spriteIndex2 = kBubbleDef[defIndex].sprites[2];
+			spriteIndex1 += 9;
+		}
+		
+		_vm->_screen->plotImage(_bubbleSprites, spriteIndex2, Common::Point(bubble.x, bubble.y));
+		_vm->_screen->plotImage(_bubbleSprites, spriteIndex1, Common::Point(bubbleX, bubbleY));
+		Font::_fontColors[0] = textColor;
+		font->drawString(_vm->_screen, bubble.text, Common::Point(bubble.x + 7, bubble.y + 10));
+
+	}
+
+}
+
+}
+
+}
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.h b/engines/access/noctropolis/noctropolis_comicviewer.h
new file mode 100644
index 00000000000..3bd908fcd42
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_comicviewer.h
@@ -0,0 +1,80 @@
+#ifndef ACCESS_NOCTROPOLIS_NOCTROPOLIS_COMICVIEWER_H
+#define ACCESS_NOCTROPOLIS_NOCTROPOLIS_COMICVIEWER_H
+
+#include "access/noctropolis/noctropolis_game.h"
+#include "access/resources.h"
+#include "access/polygon.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+struct ComicPageBubble {
+    byte style;
+    byte textColor;
+    int16 x, y;
+    Common::String text;
+};
+
+class PolygonResource : public Resource {
+public:
+    int findPolygonAt(int16 x, int16 y) const;
+    void free();
+protected:
+    typedef Common::Array<Polygon> PolygonArray;
+    PolygonArray _polygons;
+    void internalLoad(Common::SeekableReadStream &source, uint32 size);
+};
+
+struct ComicPageHotspot {
+    PolygonResource polygons;
+    int32 soundFileIndex, soundResIndex;
+    Common::Array<ComicPageBubble> bubbles;
+};
+
+struct ComicPage {
+    Common::Path filename;
+    int32 musicFileIndex, musicResIndex;
+    Common::Array<ComicPageHotspot> hotspots;
+};
+
+class ComicResource : public Resource {
+public:
+    uint16 getCount() const { return _pages.size(); }
+    ComicPage *getPage(int index) const { return _pages[index]; }
+    void free();
+protected:
+    Common::Array<ComicPage*> _pages;
+    ComicPageHotspot loadHotspot(Common::SeekableReadStream &source);
+    void internalLoad(Common::SeekableReadStream &source, uint32 size);
+};
+
+
+enum PageResult {
+	kPageResultNone,
+	kPageResultExit,
+	kPageResultNextPage,
+	kPageResultPrevPage
+};
+
+class ComicViewer {
+public:
+	ComicViewer(NoctropolisEngine *vm);
+	~ComicViewer();
+	
+	void run(ComicResource *comic);
+	
+protected:
+	NoctropolisEngine *_vm;
+	ComicResource *_comic;
+	SpriteResource *_bubbleSprites;
+	int _currPage;
+	PageResult runPage(ComicPage *page);
+	void drawBubble(const ComicPageBubble &bubble);
+};
+
+} // end namespace Noctropolis
+
+} // end namespace Access
+
+#endif // ACCESS_NOCTROPOLIS_NOCTROPOLIS_COMICVIEWER_H
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
new file mode 100644
index 00000000000..12ed5338f93
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -0,0 +1,145 @@
+/* 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 "access/noctropolis/noctropolis_game.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+
+NoctropolisEngine::NoctropolisEngine(OSystem *syst, const AccessGameDescription *gameDesc) :
+AccessEngine(syst, gameDesc)
+{
+}
+
+NoctropolisEngine::~NoctropolisEngine() {
+}
+
+void NoctropolisEngine::playGame() {
+	doIntro();
+}
+
+void NoctropolisEngine::doIntro() {
+	static const int lettersX[] = {106, 153, 197, 229, 271, 309, 357, 394, 443, 476, 504};
+	static const int titlesSpriteX[] = {238, 237, 237, 200, 200, 216, 231, 207, 198, 201, 234, 200, 220, 235, 214};
+	static const int titlesSpriteY[] = {108, 112, 125, 128, 128, 124, 128, 115, 131, 130, 102, 112, 112, 102, 112};
+
+	int16 skylineSpriteOfsX1 = 740;
+	int16 skylineSpriteOfsX2 = 1050;
+	int16 skylineSpriteOfsX3 = 1250;
+	int16 skylineSpriteOfsX4 = 1300;
+	int16 skylineSpriteOfsX5 = 1500;
+	int16 titlesSpriteIndex = 0;
+	int lettersMax = 0;
+
+	_timers[26]._initTm = 45;
+	_timers[27]._initTm = 7;
+	_timers[28]._initTm = 240;
+
+	// TODO: Music 98, 1
+	Resource *sceneRes = _files->loadSubFile("scene01.ap", 0);
+	
+	//_room->loadRoom();
+
+	Resource *spriteRes = _files->loadSubFile("scene01.ap", 1);
+	SpriteResource *sprites = new SpriteResource(this, spriteRes);
+	delete spriteRes;
+
+	// TODO: Check these fades
+	_screen->fadeOut();
+	_screen->setPalette();
+	_screen->fadeIn();
+	copyBF1BF2();
+	copyBF2Vid();
+
+	_timers[26].reset();
+	_timers[27].reset();
+
+	while (true) {
+
+		if (!_timers[27].isActive()) {
+			_timers[27].reset();
+			if (_scrollX == _room->_playFieldWidth - _screen->w || _events->_leftButton || _events->_rightButton)
+				break;
+
+			_scrollX += 2;
+			
+			copyBF1BF2();
+			
+			for (int i = 0; i < lettersMax; i++) {
+				_buffer2.plotImage(sprites, i + 8, Common::Point(lettersX[i], 40));
+			}
+
+			if (!_timers[26].isActive()) {
+				if (lettersMax <= 10) {
+					if (lettersMax == 9)
+						_timers[28].reset();
+					_timers[26].reset();
+					lettersMax++;
+				} else if (titlesSpriteIndex < 25) {
+					_buffer2.plotImage(sprites, titlesSpriteIndex + 19, Common::Point(titlesSpriteX[titlesSpriteIndex], titlesSpriteY[titlesSpriteIndex]));
+					if (!_timers[28].isActive()) {
+						titlesSpriteIndex++;
+						_timers[26].reset();
+						_timers[28].reset();
+					}
+				}
+
+			}
+			
+			if (skylineSpriteOfsX1 > -100) {
+				_buffer2.plotImage(sprites, 0, Common::Point(skylineSpriteOfsX1, 60));
+				skylineSpriteOfsX1 -= 5;
+			}
+			if (skylineSpriteOfsX2 > -100) {
+				_buffer2.plotImage(sprites, 3, Common::Point(skylineSpriteOfsX2, 16));
+				skylineSpriteOfsX2 -= 8;
+			}
+			if (skylineSpriteOfsX4 > -100) {
+				_buffer2.plotImage(sprites, 1, Common::Point(skylineSpriteOfsX4, 145));
+				skylineSpriteOfsX4 -= 7;
+			}
+			if (skylineSpriteOfsX3 > -100) {
+				_buffer2.plotImage(sprites, 4, Common::Point(skylineSpriteOfsX3, 115));
+				skylineSpriteOfsX3 -= 5;
+			}
+			if (skylineSpriteOfsX5 > -100) {
+				_buffer2.plotImage(sprites, 2, Common::Point(skylineSpriteOfsX5, 126));
+				skylineSpriteOfsX5 -= 7;
+			}
+
+			copyBF2Vid();
+
+		}
+
+		_events->pollEventsAndWait();
+	}
+
+	_screen->fadeOut();
+
+	delete sprites;
+
+}
+
+} // end namespace Noctropolis
+
+} // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
new file mode 100644
index 00000000000..1e37a4e3738
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -0,0 +1,54 @@
+/* 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 ACCESS_NOCTROPOLIS_NOCTROPOLIS_GAME_H
+#define ACCESS_NOCTROPOLIS_NOCTROPOLIS_GAME_H
+
+#include "access/access.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+class NoctropolisEngine : public AccessEngine {
+public:
+	NoctropolisEngine(OSystem *syst, const AccessGameDescription *gameDesc);
+
+	~NoctropolisEngine();
+
+	void playGame() override;
+	void dead(int deathId) override {};
+	void establish(int esatabIndex, int sub) override {};
+
+protected:
+	void setupGame() override {};
+	void initObjects() override {};
+
+private:
+	void doIntro();
+
+};
+
+} // end namespace Noctropolis
+
+} // end namespace Access
+
+#endif // ACCESS_NOCTROPOLIS_NOCTROPOLIS_GAME_H
diff --git a/engines/access/noctropolis/noctropolis_intro.cpp b/engines/access/noctropolis/noctropolis_intro.cpp
new file mode 100644
index 00000000000..def5ca38e46
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_intro.cpp
@@ -0,0 +1,106 @@
+#include "access/access.h"
+#include "access/access_noctropolis.h"
+#include "access/timer.h"
+
+namespace Access {
+
+void AccessEngine_Noctropolis::runIntro() {
+
+	static const int lettersX[] = {106, 153, 197, 229, 271, 309, 357, 394, 443, 476, 504};
+	static const int titlesSpriteX[] = {238, 237, 237, 200, 200, 216, 231, 207, 198, 201, 234, 200, 220, 235, 214};
+	static const int titlesSpriteY[] = {108, 112, 125, 128, 128, 124, 128, 115, 131, 130, 102, 112, 112, 102, 112};
+
+	int16 skylineSpriteOfsX1 = 740;
+	int16 skylineSpriteOfsX2 = 1050;
+	int16 skylineSpriteOfsX3 = 1250;
+	int16 skylineSpriteOfsX4 = 1300;
+	int16 skylineSpriteOfsX5 = 1500;
+	int16 titlesSpriteIndex = 0;
+	int lettersMax = 0;
+
+	SpriteResource *sprites = new SpriteResource();
+
+	_timer->set(26, 45);
+	_timer->set(27, 7);
+	_timer->set(28, 240);
+
+	// TODO: Music 98, 1
+	_res->load(_scene, "scene01.ap", 0);
+	_res->load(sprites, "scene01.ap", 1);
+	// TODO: Fade to black and fade to scene palette
+	setPalette(_scene->getPalette());
+	copySceneBackgroundToWorkScreen();
+	copyWorkScreenToVgaScreen();
+
+	_timer->reset(26);
+	_timer->reset(27);
+
+	while (1) {
+
+		if (!_timer->isActive(27)) {
+			_timer->reset(27);
+			if (_cameraX == _scene->getWidth() - _scene->getDisplayWidth() || _leftMouseButton || _rightMouseButton)
+				break;
+
+			scrollCameraRight(2);
+			
+			copySceneBackgroundToWorkScreen();
+			
+			for (int i = 0; i < lettersMax; i++) {
+				_workScreen->drawSprite(sprites, i + 8, lettersX[i], 40);
+			}
+
+			if (!_timer->isActive(26)) {
+				if (lettersMax <= 10) {
+					if (lettersMax == 9)
+						_timer->reset(28);
+					_timer->reset(26);
+					lettersMax++;
+				} else if (titlesSpriteIndex < 25) {
+					_workScreen->drawSprite(sprites, titlesSpriteIndex + 19, titlesSpriteX[titlesSpriteIndex], titlesSpriteY[titlesSpriteIndex]);
+					if (!_timer->isActive(28)) {
+						titlesSpriteIndex++;
+						_timer->reset(26);
+						_timer->reset(28);
+					}
+				}
+
+			}
+			
+			if (skylineSpriteOfsX1 > -100) {
+				_workScreen->drawSprite(sprites, 0, skylineSpriteOfsX1, 60);
+				skylineSpriteOfsX1 -= 5;
+			}
+			if (skylineSpriteOfsX2 > -100) {
+				_workScreen->drawSprite(sprites, 3, skylineSpriteOfsX2, 16);
+				skylineSpriteOfsX2 -= 8;
+			}
+			if (skylineSpriteOfsX4 > -100) {
+				_workScreen->drawSprite(sprites, 1, skylineSpriteOfsX4, 145);
+				skylineSpriteOfsX4 -= 7;
+			}
+			if (skylineSpriteOfsX3 > -100) {
+				_workScreen->drawSprite(sprites, 4, skylineSpriteOfsX3, 115);
+				skylineSpriteOfsX3 -= 5;
+			}
+			if (skylineSpriteOfsX5 > -100) {
+				_workScreen->drawSprite(sprites, 2, skylineSpriteOfsX5, 126);
+				skylineSpriteOfsX5 -= 7;
+			}
+
+			copyWorkScreenToVgaScreen();
+
+		}
+
+		_timer->update();
+		updateEvents();
+		_system->updateScreen();
+	}
+
+	// TODO: Fade to black
+
+	delete sprites;
+
+}
+
+}
diff --git a/engines/access/noctropolis/noctropolis_inventory.cpp b/engines/access/noctropolis/noctropolis_inventory.cpp
new file mode 100644
index 00000000000..86d6e0a40b7
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_inventory.cpp
@@ -0,0 +1,166 @@
+#include "common/array.h"
+#include "common/endian.h"
+#include "common/file.h"
+#include "common/func.h"
+#include "common/util.h"
+
+#include "access/access_noctropolis.h"
+#include "access/graphics.h"
+#include "access/resource.h"
+
+namespace Access {
+
+void AccessEngine_Noctropolis::runInventory() {
+
+	const byte kDownArrow	= 1;
+	const byte kUpArrow		= 2;
+
+	int hoveredItem = -1;
+	byte slotItems[20];
+	Common::Array<byte> items;
+	SpriteResource *inventorySprites;
+	StringResource *inventoryItemNames;
+	int selectedItem = -1;
+	GrabRect savedRect;
+	bool upArrow, downArrow;
+	uint prevInventoryTopItemIndex = -1;
+
+	if (!_keepInventoryPosition) {
+		int16 warpMouseX, warpMouseY;
+		_inventoryBaseX = clipMouseCenter(_mouseX, 252, 640, warpMouseX);
+		_inventoryBaseY = clipMouseCenter(_mouseY, 220, 400, warpMouseY);
+		_keepInventoryPosition = true;
+		if (warpMouseX != _mouseX || warpMouseY != _mouseY)
+			_system->warpMouse(warpMouseX, warpMouseY);
+	}
+
+	// TODO: Maybe move/load these globally?
+
+	inventorySprites = new SpriteResource();
+	_res->load(inventorySprites, "INV.AP");
+	
+	inventoryItemNames = new StringResource();
+	_res->load(inventoryItemNames, GID_NOCTROPOLIS, kResStringTable, 3);
+	
+	// Build the list of available inventory items
+	for (int i = 0; i < 256; i++)
+		if (getInventoryItem(i) == 1)
+			items.push_back(i);
+
+	_vgaScreen->lock();
+	// Grab screen background
+	_vgaScreen->saveRect(savedRect, _inventoryBaseX, _inventoryBaseY, 252, 220);
+	// Draw inventory panel
+	_vgaScreen->drawSprite(_icons, 0, _inventoryBaseX, _inventoryBaseY);
+	_vgaScreen->unlock();
+
+	prevInventoryTopItemIndex = -1;
+
+	while (selectedItem == -1) {
+
+		int x = _mouseX - _inventoryBaseX - 23;
+		int y = _mouseY - _inventoryBaseY - 26;
+
+		if (prevInventoryTopItemIndex != _inventoryTopItemIndex) {
+
+			int slotIndex = 0, slotCount = 20, skipIndex = 0;
+
+			memset(slotItems, 0, 20);
+			
+			prevInventoryTopItemIndex = _inventoryTopItemIndex;
+			upArrow = false;
+			downArrow = false;
+
+			if (_inventoryTopItemIndex > 0) {
+				upArrow = true;
+				slotItems[slotIndex++] = kUpArrow;
+				slotCount--;
+				skipIndex = 1;
+			}
+
+			if (_inventoryTopItemIndex + slotCount + skipIndex < items.size()) {
+				downArrow = true;
+				slotItems[19] = kDownArrow;
+				slotCount--;
+			} else {
+				slotCount = items.size() - _inventoryTopItemIndex - skipIndex;
+			}
+
+			for (int i = 0; i < slotCount; i++)
+				slotItems[slotIndex++] = items[skipIndex + _inventoryTopItemIndex + i];
+
+			_vgaScreen->lock();
+			for (int slotNum = 0; slotNum < 20; slotNum++) {
+				int spriteIndex = slotItems[slotNum];
+				if (spriteIndex > 2)
+					spriteIndex++;
+				uint16 slotX = _inventoryBaseX + 23 + (slotNum % 5) * 41;
+				uint16 slotY = _inventoryBaseY + 26 + (slotNum / 5) * 38;
+				_vgaScreen->drawSprite(inventorySprites, 3, slotX, slotY); // draw empty slot
+				slotX += 20 - inventorySprites->getSprite(spriteIndex)->width / 2;
+				slotY += MAX(0, 38 - inventorySprites->getSprite(spriteIndex)->height) / 2;
+				_vgaScreen->drawSprite(inventorySprites, spriteIndex, slotX, slotY);
+				//_vgaScreen->drawText(_fonts[1], (const byte*)Common::String::format("%d", spriteIndex).c_str(), slotX, slotY, 238, 246, kFontBackground);
+			}
+			_vgaScreen->unlock();
+
+		}
+		
+		// Support the mouse wheel for scrolling through the inventory items
+		if (upArrow && _mouseWheelDelta < 0) {
+			_inventoryTopItemIndex = MAX<int>(_inventoryTopItemIndex - 1, 0);
+		} else if (downArrow && _mouseWheelDelta > 0) {
+			_inventoryTopItemIndex = MIN<int>(_inventoryTopItemIndex + 1, items.size());
+		}
+		
+		if (x >= 0 && x < 205 && y >= 0 && y < 152) {
+			int slotIndex = (x / 41) + (y / 38) * 5;
+			int item = slotItems[slotIndex];
+
+			if (hoveredItem != item) {
+				//debug("slotIndex = %d; item = %d", slotIndex, item);
+				hoveredItem = item;
+				_vgaScreen->lock();
+				_vgaScreen->fillRect(_inventoryBaseX + 66, _inventoryBaseY + 184, _inventoryBaseX + 66 + 146, _inventoryBaseY + 184 + 8, 246);
+				if (item != 0) {
+					_vgaScreen->drawText(_fonts[1], inventoryItemNames->getString(item), _inventoryBaseX + 66, _inventoryBaseY + 184, 238, 246, kFontBackground);
+				}
+				_vgaScreen->unlock();
+			}
+
+			if (leftMouseButton()) {
+				if (item == kDownArrow)
+	 				_inventoryTopItemIndex = MIN<int>(_inventoryTopItemIndex + 1, items.size());
+				else if (item == kUpArrow)
+	 				_inventoryTopItemIndex = MAX<int>(_inventoryTopItemIndex - 1, 0);
+				else
+					selectedItem = item;
+				waitUntilLeftButtonIsReleased();
+			}
+
+		}
+
+		if (rightMouseButton()) {
+			selectedItem = 255;
+			waitUntilRightButtonIsReleased();
+			_keepInventoryPosition = false;
+		}
+
+		updateEvents();
+		updateScreen();
+
+	}
+	
+	setVariable(99, selectedItem);
+
+	// Restore screen background
+	_vgaScreen->lock();
+	_vgaScreen->restoreRect(savedRect);
+	_vgaScreen->unlock();
+
+	delete inventorySprites;
+	delete inventoryItemNames;
+	
+}
+
+}
diff --git a/engines/access/noctropolis/noctropolis_map.cpp b/engines/access/noctropolis/noctropolis_map.cpp
new file mode 100644
index 00000000000..c015be9a2bb
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_map.cpp
@@ -0,0 +1,155 @@
+#include "common/array.h"
+#include "common/endian.h"
+#include "common/file.h"
+#include "common/func.h"
+#include "common/util.h"
+
+#include "access/graphics.h"
+#include "access/script_noctropolis.h"
+#include "access/timer.h"
+
+namespace Access {
+
+void AccessEngine_Noctropolis::runMap() {
+
+	const int kMapLocationCount = 14;
+
+	static const struct { int x, y; } kPlayerMapEntryPositions[kMapLocationCount] = {
+		{280, 390},
+		{372, 338},
+		{414, 201},
+		{253, 387},
+		{72, 371},
+		{471, 340},
+		{70, 380},
+		{0, 0},
+		{85, 378},
+		{194, 347},
+		{73, 370},
+		{323, 386},
+		{43, 362},
+		{0, 0}
+	};
+
+	static const int kMapLocationRoomNumbers[kMapLocationCount] = {
+		12, 28, 11, 41, 17, 51, 43, 15, 27, 85, 32, 37, 26, 33
+	};
+
+	static const struct { int x, y, spriteIndex; } kDrawMapLocationsInfos[kMapLocationCount] = {
+		{259, 98, 0},
+		{487, 297, 1},
+		{272, 491, 2},
+		{323, 658, 3},
+		{466, 115, 4},
+		{333, 150, 5},
+		{42, 106, 6},
+		{28, 449, 7},
+		{49, 727, 8},
+		{390, 380, 9},
+		{152, 282, 10},
+		{179, 25, 11},
+		{114, 193, 12},
+		{201, 242, 13}
+	};
+
+	SpriteResource *locationIcons;
+	StringResource *locationNames;
+
+	int selectedLocationNum = -1, locationNum = -1;
+	bool needRedraw = true, needFadeIn = true;
+
+	setMouseCursor(0);
+	_player.disabled = true;
+	_stiletto.disabled = true;
+
+	_res->load(_scene, "map.ap", 0);
+	
+	_sceneCenterX = 0;
+	_sceneCenterY = 0;
+	// TODO: Restore current map position
+	_cameraX = 0;
+	_cameraY = 0;
+
+	locationIcons = new SpriteResource();
+	_res->load(locationIcons, "map.ap", 1);
+
+	locationNames = new StringResource();
+	_res->load(locationNames, GID_NOCTROPOLIS, kResStringTable, 2);
+
+	fadeToBlack();
+	clearVgaScreen();
+
+	startPaletteCycle(181, 190, 5, 6);
+
+	while (selectedLocationNum == -1) {
+	
+		if (needRedraw) {
+			copySceneBackgroundToWorkScreen();
+			for (int i = 0; i < kMapLocationCount; i++) {
+				_workScreen->drawSprite(locationIcons, kDrawMapLocationsInfos[i].spriteIndex,
+					kDrawMapLocationsInfos[i].x - _cameraX, kDrawMapLocationsInfos[i].y - _cameraY);
+			}
+			copyWorkScreenToVgaScreen();
+			if (needFadeIn) {
+				memcpy(_mainPalette, _scene->getPalette(), 768);
+				copySystemPalette();
+				fadeToPalette();
+				needFadeIn = false;
+			}
+		}
+
+		updatePaletteCycle();
+
+		int hoveredLocationNum = _scene->findHotspotAt(_cameraX + _mouseX, _cameraY + _mouseY);
+		//debug("hoveredLocationNum = %d", hoveredLocationNum);
+
+		// TODO: location available?
+		
+		if (locationNum != hoveredLocationNum) {
+			locationNum = hoveredLocationNum;
+			_vgaScreen->lock();
+			_vgaScreen->fillRect(220, 380, 220 + 300, 380 + 16, 246);
+			if (locationNum != -1)
+				_vgaScreen->drawText(_fonts[3], locationNames->getString(locationNum), 220, 380, 181, 0, kFontBackground);
+			_vgaScreen->unlock();
+		}
+
+		if (leftMouseButton() && locationNum != -1) {
+			selectedLocationNum = locationNum;
+		}
+		
+		if ((_mouseWheelDelta < 0 || _mouseY < 32) && _cameraY > 0) {
+			scrollCameraUp(8);
+			needRedraw = true;
+		} else if ((_mouseWheelDelta > 0 || _mouseY > 368) && _cameraY < _scene->getHeight() - _scene->getDisplayHeight()) {
+			scrollCameraDown(8);
+			needRedraw = true;
+		}
+
+		_timer->update();	
+		updateEvents();
+		updateScreen();
+
+		// TODO: Change to getMillis scrolling time delta
+		_system->delayMillis(50);
+
+	}
+
+	delete locationIcons;
+	delete locationNames;
+
+	if (selectedLocationNum >= 0) {
+		waitUntilLeftButtonIsReleased();
+		_currSceneNum = kMapLocationRoomNumbers[selectedLocationNum];
+		debug("_currSceneNum = %d", _currSceneNum);
+		// TODO: Save current map position
+		// TODO: Restore timer 18
+		_player.x1 = _player.x2 = kPlayerMapEntryPositions[selectedLocationNum].x;
+		_player.y1 = _player.y2 = kPlayerMapEntryPositions[selectedLocationNum].y;
+		// TODO: initStilettoPosition();
+		_gameState = AccessEngine_Noctropolis::GS_CHANGE_SCENE;
+	}
+
+}
+
+}
diff --git a/engines/access/player.cpp b/engines/access/player.cpp
index 4f72b89543e..bdae2602c73 100644
--- a/engines/access/player.cpp
+++ b/engines/access/player.cpp
@@ -140,7 +140,7 @@ void Player::load() {
 }
 
 void Player::loadTexPalette() {
-	Resource *texPal = _vm->_files->loadFile("TEXPAL.COL");
+	Resource *texPal = _vm->_files->loadRawFile("TEXPAL.COL");
 	int size = texPal->_size;
 	assert(size == 768);
 	_manPal1 = new byte[size];
@@ -150,7 +150,7 @@ void Player::loadTexPalette() {
 void Player::loadSprites(const Common::Path &name) {
 	freeSprites();
 
-	Resource *data = _vm->_files->loadFile(name);
+	Resource *data = _vm->_files->loadRawFile(name);
 
 #if 0
 	Common::DumpFile *outFile = new Common::DumpFile();
diff --git a/engines/access/polygon.cpp b/engines/access/polygon.cpp
new file mode 100644
index 00000000000..2d4712a4b4f
--- /dev/null
+++ b/engines/access/polygon.cpp
@@ -0,0 +1,44 @@
+/* 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 "access/polygon.h"
+
+namespace Access {
+
+bool Polygon::pointInside(int16 x, int16 y) const {
+	bool result = false;
+	int16 j = points.size() - 1;
+	for (uint k = 0; k < points.size(); k++) {
+		if ((points[k].y <= y && y < points[j].y) ||
+			(points[j].y <= y && y < points[k].y)) {
+			if (x < (points[j].x - points[k].x) * (y - points[k].y) /
+			  (points[j].y - points[k].y) + points[k].x) {
+			  result = !result;
+			}
+		}
+		j = k;
+	}
+	return result;
+}
+
+// TODO: Add more functions here.
+
+} // end namespace Access
diff --git a/engines/access/polygon.h b/engines/access/polygon.h
new file mode 100644
index 00000000000..ad302b07e27
--- /dev/null
+++ b/engines/access/polygon.h
@@ -0,0 +1,39 @@
+/* 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 ACCESS_POLYGON_H
+#define ACCESS_POLYGON_H
+
+#include "common/types.h"
+#include "common/array.h"
+#include "common/rect.h"
+
+namespace Access {
+
+struct Polygon {
+    Common::Array<Common::Point> points;
+    bool pointInside(int16 x, int16 y) const;
+};
+
+
+} // end namespace Access
+
+#endif // ACCESS_POLYGON_H
diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index 5fd56e203a3..8498213f9ae 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -91,7 +91,7 @@ void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, int
 
 void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, const Common::Path &filename, int rate) {
 	// Open up video stream
-	_videoData = _vm->_files->loadFile(filename);
+	_videoData = _vm->_files->loadRawFile(filename);
 
 	setVideo(vidSurface, pt, rate);
 }


Commit: 08c809d331fe9be7941502981ccd3370ce5b2a5e
    https://github.com/scummvm/scummvm/commit/08c809d331fe9be7941502981ccd3370ce5b2a5e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: More work on Noctropolis, nearly working intro

Changed paths:
  A engines/access/noctropolis/noctropolis_resources.cpp
  A engines/access/noctropolis/noctropolis_resources.h
  A engines/access/noctropolis/noctropolis_room.cpp
  A engines/access/noctropolis/noctropolis_room.h
    engines/access/access.cpp
    engines/access/access.h
    engines/access/detection_tables.h
    engines/access/files.cpp
    engines/access/files.h
    engines/access/module.mk
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/resources.cpp
    engines/access/room.cpp
    engines/access/room.h
    engines/access/screen.cpp


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 287a95a10b8..4565f16a5a6 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -104,7 +104,6 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_startTravelItem = _startTravelBox = 0;
 	ARRAYCLEAR(_ask);
 	_startAboutItem = _startAboutBox = 0;
-	_byte26CB5 = 0;
 	_bcnt = 0;
 	_boxDataStart = 0;
 	_boxDataEnd = false;
@@ -146,7 +145,7 @@ AccessEngine::~AccessEngine() {
 }
 
 void AccessEngine::setVGA() {
-	initGraphics(320, 200);
+	initGraphics(getScreenWidth(), getScreenHeight());
 }
 
 void AccessEngine::initialize() {
diff --git a/engines/access/access.h b/engines/access/access.h
index a38d3e21da1..58dda2267ea 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -280,7 +280,6 @@ public:
 	int _boxSelectY;
 	int _boxSelectYOld;
 	int _numLines;
-	byte _byte26CB5;
 	int _bcnt;
 
 	bool _vidEnd;
@@ -334,6 +333,9 @@ public:
 	void copyBF2Vid();
 
 	void freeChar();
+	
+	virtual int16 getScreenWidth() const { return 320; }
+	virtual int16 getScreenHeight() const { return 200; }
 
 	/**
 	 * Draw a string on a given surface and update text positioning
diff --git a/engines/access/detection_tables.h b/engines/access/detection_tables.h
index 77e0dc4e08c..89baf75435a 100644
--- a/engines/access/detection_tables.h
+++ b/engines/access/detection_tables.h
@@ -135,7 +135,7 @@ static const AccessGameDescription gameDescriptions[] = {
 		{
 			"noctropolis",
 			nullptr,
-			AD_ENTRY1s("dark/scene01.ap", "3a154bf58e10cd7ace14cab1bf5adf4a", 147954),
+			AD_ENTRY1s("scene01.ap", "3a154bf58e10cd7ace14cab1bf5adf4a", 147954),
 			Common::EN_ANY,
 			Common::kPlatformWindows,
 			ADGF_UNSTABLE,
diff --git a/engines/access/files.cpp b/engines/access/files.cpp
index 009ee485d7b..d7b2a22bd4f 100644
--- a/engines/access/files.cpp
+++ b/engines/access/files.cpp
@@ -94,12 +94,8 @@ FileManager::~FileManager() {
 }
 
 Resource *FileManager::loadFile(int fileNum, int subfile) {
-	return loadSubFile(_vm->_res->FILENAMES[fileNum], subfile);
-}
-
-Resource *FileManager::loadSubFile(const Common::Path &filename, int subfile) {
 	Resource *res = new Resource();
-	setAppended(res, filename);
+	setAppended(res, _vm->_res->FILENAMES[fileNum]);
 	gotoAppended(res, subfile);
 
 	handleFile(res);
diff --git a/engines/access/files.h b/engines/access/files.h
index 06e9e410b59..298566e9c11 100644
--- a/engines/access/files.h
+++ b/engines/access/files.h
@@ -125,11 +125,6 @@ public:
 	 */
 	Resource *loadFile(const FileIdent &fileIdent);
 
-	/**
-	 * Load a given subfile from a container file by name.
-	 */
-	Resource *loadSubFile(const Common::Path &containerFile, int subfile);
-
 	/**
 	 * Load a given *non-container* file by name directly.
 	 */
diff --git a/engines/access/module.mk b/engines/access/module.mk
index 219fbe8d612..7f0f42b1f84 100644
--- a/engines/access/module.mk
+++ b/engines/access/module.mk
@@ -36,6 +36,8 @@ MODULE_OBJS := \
 	martian/martian_scripts.o \
 	noctropolis/noctropolis_comicviewer.o \
 	noctropolis/noctropolis_game.o \
+	noctropolis/noctropolis_resources.o \
+	noctropolis/noctropolis_room.o \
 	martian/midiparser_bemd.o \
 	video/movie_decoder.o
 
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index 08233a3c783..fdca08877f7 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -60,7 +60,6 @@ void ComicViewer::run(ComicResource *comic) {
 }
 
 PageResult ComicViewer::runPage(ComicPage *page) {
-
 	PageResult result = kPageResultNone;
 
 	_vm->_files->loadScreen(Common::Path(page->filename.baseName()));
@@ -70,7 +69,7 @@ PageResult ComicViewer::runPage(ComicPage *page) {
 	_bubbleSprites = new SpriteResource(_vm, bubbleData);
 	delete bubbleData;
 
-	// TODO: Copy the palette else the fade out will be wrong
+	// TODO: Copy the palette else the fade out will be wrong?
 	//_vm->_screen->palPaletteRange(pagePicture->getPalette(), 0, 256);
 	//_vm->copySystemPalette();
 	//_vm->setMainPalette();
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 12ed5338f93..bf309bc810d 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "access/noctropolis/noctropolis_game.h"
+#include "access/noctropolis/noctropolis_room.h"
 
 namespace Access {
 
@@ -34,6 +35,22 @@ AccessEngine(syst, gameDesc)
 NoctropolisEngine::~NoctropolisEngine() {
 }
 
+void NoctropolisEngine::initObjects() {
+	_room = new NoctropolisRoom(this);
+}
+
+void NoctropolisEngine::setupGame() {
+	_timers.clear();
+	for (int i = 0; i < 32; ++i) {
+		TimerEntry te;
+		te._initTm = 1;
+		te._timer = 1;
+		te._flag = false;
+		_timers.push_back(te);
+	}
+	
+}
+
 void NoctropolisEngine::playGame() {
 	doIntro();
 }
@@ -55,17 +72,20 @@ void NoctropolisEngine::doIntro() {
 	_timers[27]._initTm = 7;
 	_timers[28]._initTm = 240;
 
-	// TODO: Music 98, 1
-	Resource *sceneRes = _files->loadSubFile("scene01.ap", 0);
-	
-	//_room->loadRoom();
+	_screen->clearScreen();
+	_screen->forceFadeOut();
 
-	Resource *spriteRes = _files->loadSubFile("scene01.ap", 1);
+	// TODO: midi files have been split into MUSIC/Mxx.MID files
+	//_midi->loadMusic(98, 1);
+	_room->loadPlayField(1, 0);
+	_buffer2.copyFrom(*_screen);
+	_buffer1.copyFrom(*_screen);
+
+	Resource *spriteRes = _files->loadFile(1, 1);
 	SpriteResource *sprites = new SpriteResource(this, spriteRes);
 	delete spriteRes;
 
 	// TODO: Check these fades
-	_screen->fadeOut();
 	_screen->setPalette();
 	_screen->fadeIn();
 	copyBF1BF2();
@@ -78,7 +98,7 @@ void NoctropolisEngine::doIntro() {
 
 		if (!_timers[27].isActive()) {
 			_timers[27].reset();
-			if (_scrollX == _room->_playFieldWidth - _screen->w || _events->_leftButton || _events->_rightButton)
+			if (_screen->_vWindowWidth + _scrollCol == _room->_playFieldWidth || _events->_leftButton || _events->_rightButton)
 				break;
 
 			_scrollX += 2;
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index 1e37a4e3738..f6b016632fe 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -38,9 +38,12 @@ public:
 	void dead(int deathId) override {};
 	void establish(int esatabIndex, int sub) override {};
 
+	virtual int16 getScreenWidth() const { return 640; }
+	virtual int16 getScreenHeight() const { return 400; }
+
 protected:
-	void setupGame() override {};
-	void initObjects() override {};
+	void setupGame() override;
+	void initObjects() override;
 
 private:
 	void doIntro();
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
new file mode 100644
index 00000000000..399e223900e
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -0,0 +1,78 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 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 "access/noctropolis/noctropolis_resources.h"
+#include "access/noctropolis/noctropolis_game.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+static const char *NOCT_FILES[] = {
+	"DARK/MAP.AP", "DARK/SCENE01.AP", "DARK/SCENE02.AP", "DARK/SCENE03.AP",
+	"DARK/SCENE04.AP", "R05.AP", "R06.AP", "R07.AP",
+	"R08.AP", "R09.AP", "R10.AP", "DARK/SCENE11.AP",
+	"DARK/SCENE12.AP", "DARK/SCENE13.AP", "DARK/SCENE14.AP", "DARK/SCENE15.AP",
+	"DARK/SCENE16.AP", "DARK/SCENE17.AP", "DARK/SCENE18.AP", "R19.AP",
+	"DARK/SCENE20.AP", "R21.AP", "DARK/SCENE22.AP", "R23.AP",
+	"DARK/SCENE24.AP", "R25.AP", "DARK/SCENE26.AP", "DARK/SCENE27.AP",
+	"DARK/SCENE28.AP", "DARK/SCENE29.AP", "DARK/SCENE30.AP", "DARK/SCENE31.AP",
+	"DARK/SCENE32.AP", "DARK/SCENE33.AP", "DARK/SCENE34.AP", "DARK/SCENE35.AP",
+	"R36.AP", "DARK/SCENE37.AP", "DARK/SCENE38.AP", "DARK/SCENE39.AP",
+	"R40.AP", "DARK/SCENE41.AP", "DARK/SCENE42.AP", "DARK/SCENE43.AP",
+	"DARK/SCENE44.AP", "DARK/SCENE45.AP", "DARK/SCENE46.AP", "R47.AP",
+	"DARK/SCENE48.AP", "DARK/SCENE49.AP", "DARK/SCENE50.AP", "DARK/SCENE51.AP",
+	"DARK/SCENE52.AP", "DARK/SCENE53.AP", "DARK/SCENE54.AP", "DARK/SCENE55.AP",
+	"R56.AP", "DARK/SCENE57.AP", "DARK/SCENE58.AP", "DARK/SCENE59.AP",
+	"DARK/SCENE60.AP", "DARK/SCENE61.AP", "DARK/SCENE62.AP", "DARK/SCENE63.AP",
+	"DARK/SCENE64.AP", "DARK/SCENE65.AP", "R66.AP", "DARK/SCENE67.AP",
+	"DARK/SCENE68.AP", "DARK/SCENE69.AP", "DARK/SCENE70.AP", "DARK/SCENE71.AP",
+	"DARK/SCENE72.AP", "DARK/SCENE73.AP", "DARK/SCENE74.AP", "R75.AP",
+	"R76.AP", "R77.AP", "R78.AP", "R79.AP",
+	"R80.AP", "DARK/SCENE81.AP", "DARK/SCENE82.AP", "R83.AP",
+	"R84.AP", "DARK/SCENE85.AP", "DARK/SCENE86.AP", "DARK/SCENE87.AP",
+	"R88.AP", "DARK/SCENE89.AP", "DARK/SCENE90.AP", "DARK/SCENE91.AP",
+	"DARK/SCENE92.AP", "DARK/SCENE93.AP", "DARK/SCENE94.AP", "DARK/SCENE95.AP",
+	"DARK/SCENE96.AP", "DARK/SCENE97.AP", "DARK/MUSIC.AP", "DARK/SOUND.AP",
+	nullptr,
+};
+
+NoctropolisResources::NoctropolisResources(AccessEngine *_vm) : Resources(_vm) {
+}
+
+const char *NoctropolisResources::getEgoName() const {
+	return _vm->_flags[1] == 0 ? "PETER" : "DARKSHEER";
+}
+
+void NoctropolisResources::load(Common::SeekableReadStream &s) {
+	// Note: *don't* call the base class here. Noctropolis doesn't have data in access.dat.
+	
+	// TODO: For non-EN variants we want to use something other than DARK/ as the path.
+	for (int i = 0; i < ARRAYSIZE(NOCT_FILES); i++) {
+		Common::Path filename = Common::Path(NOCT_FILES[i]).getLastComponent();
+		FILENAMES.push_back(filename);
+	}
+}
+
+
+} // end namespace Noctropolis
+
+} // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_resources.h b/engines/access/noctropolis/noctropolis_resources.h
new file mode 100644
index 00000000000..069824395c4
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_resources.h
@@ -0,0 +1,57 @@
+/* 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 ACCESS_NOCTROPOLIS_NOCTROPOLIS_RESOURCES_H
+#define ACCESS_NOCTROPOLIS_NOCTROPOLIS_RESOURCES_H
+
+#include "access/resources.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+class NoctropolisEngine;
+
+class NoctropolisResources : public Resources {
+public:
+	NoctropolisResources(AccessEngine *_vm);
+
+	// TODO implement these for real.
+	const byte *getCursor(int num) const override { return nullptr; }
+	const char *getEgoName() const override;
+	int getRMouse(int i, int j) const override { return 0; };
+	int inButtonXRange(int x) const override { return 0; };
+
+	/**
+	 * Load data from the access.dat file
+	 */
+	void load(Common::SeekableReadStream &s) override;
+
+private:
+	// TODO add private members
+
+};
+
+} // end namespace Noctropolis
+
+} // end namespace Access
+
+#endif // ACCESS_NOCTROPOLIS_NOCTROPOLIS_RESOURCES_H
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
new file mode 100644
index 00000000000..0d818c0d698
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -0,0 +1,35 @@
+/* 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 "access/noctropolis/noctropolis_room.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+NoctropolisRoom::NoctropolisRoom(AccessEngine *vm): Room(vm) {
+}
+
+// TODO: Add more functions here.
+
+} // end namespace Noctropolis
+
+} // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_room.h b/engines/access/noctropolis/noctropolis_room.h
new file mode 100644
index 00000000000..fca5586f756
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_room.h
@@ -0,0 +1,54 @@
+/* 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 ACCESS_NOCTROPOLIS_NOCTROPOLIS_ROOM_H
+#define ACCESS_NOCTROPOLIS_NOCTROPOLIS_ROOM_H
+
+#include "access/room.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+class NoctropolisRoom : public Room {
+public:
+	NoctropolisRoom(AccessEngine *vm);
+
+	void loadRoom(int roomNumber) override {};
+
+	void roomMenu() override {};
+
+	void init4Quads() override {};
+
+protected:
+	void reloadRoom() override {};
+	
+	void reloadRoom1() override {};
+
+	void mainAreaClick() override {}
+
+};
+
+} // end namespace Noctropolis
+
+} // end namespace Access
+
+#endif // ACCESS_NOCTROPOLIS_NOCTROPOLIS_ROOM_H
diff --git a/engines/access/resources.cpp b/engines/access/resources.cpp
index 2fb34396f29..c7e9176aee3 100644
--- a/engines/access/resources.cpp
+++ b/engines/access/resources.cpp
@@ -23,6 +23,7 @@
 #include "access/access.h"
 #include "access/amazon/amazon_resources.h"
 #include "access/martian/martian_resources.h"
+#include "access/noctropolis/noctropolis_resources.h"
 #include "common/translation.h"
 
 namespace Access {
@@ -32,6 +33,8 @@ Resources *Resources::init(AccessEngine *vm) {
 		return new Amazon::AmazonResources(vm);
 	else if (vm->getGameID() == kGameMartianMemorandum)
 		return new Martian::MartianResources(vm);
+	else if (vm->getGameID() == kGameNoctropolis)
+		return new Noctropolis::NoctropolisResources(vm);
 
 	error("Unknown game");
 }
@@ -97,6 +100,8 @@ bool Resources::load(Common::U32String &errorMessage) {
 
 void Resources::load(Common::SeekableReadStream &s) {
 	uint count;
+	
+	assert(_vm->getGameID() != kGameNoctropolis);
 
 	// Get the offset of the data for the game
 	uint entryOffset = findEntry(_vm->getGameID(), _vm->isCD() ? 1 : 0,
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index c93c9253b66..cc7a85842f8 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -490,36 +490,70 @@ void Room::buildRow(int playY, int screenY) {
 	}
 }
 
+struct RoomHeader {
+	byte _tilesWidth;
+	byte _tilesHeight;
+	int16 _tilesCount;
+	byte _tilesDisplayWidth;
+	byte _tilesDisplayHeight;
+	byte _unused1;
+	int16 _wallCount;
+	int16 _blockCount;
+};
+
+static void loadHeader(RoomHeader &hdr, Common::SeekableReadStream *stream, uint32 gameId) {
+	hdr._tilesWidth = stream->readByte();
+	hdr._tilesHeight = stream->readByte();
+	if (gameId == kGameNoctropolis) {
+		hdr._tilesCount = stream->readUint16LE();
+		hdr._tilesDisplayWidth = stream->readByte();
+		hdr._tilesDisplayHeight = stream->readByte();
+		hdr._unused1 = stream->readByte();
+		hdr._wallCount = stream->readUint16LE();
+		hdr._blockCount = stream->readUint16LE();
+		stream->skip(8);
+	} else {
+		hdr._tilesCount = (int16)stream->readByte() << 8;
+		hdr._tilesDisplayWidth = stream->readByte();
+		hdr._tilesDisplayHeight = stream->readByte();
+		hdr._unused1 = stream->readByte();
+		hdr._wallCount = stream->readUint16LE();
+		hdr._blockCount = stream->readUint16LE();
+		stream->skip(6);
+	}
+}
+
 void Room::loadPlayField(int fileNum, int subfile) {
 	Resource *playData = _vm->_files->loadFile(fileNum, subfile);
-	byte header[16];
-	playData->_stream->read(&header[0], 16);
+
+	RoomHeader header;
+	loadHeader(header, playData->_stream, _vm->getGameID());
 	Screen &screen = *_vm->_screen;
 
 	// Copy the new palette
 	screen.loadRawPalette(playData->_stream);
 
 	// Copy off the tile data
-	int tileSize = (int)header[2] << 8;
+	int tileSize = header._tilesCount;
 	_tile = new byte[tileSize];
 	playData->_stream->read(_tile, tileSize);
 
 	// Copy off the playfield data
-	_matrixSize = header[0] * header[1];
+	_matrixSize = (int)header._tilesWidth * header._tilesHeight;
 	_playField = new byte[_matrixSize];
 	playData->_stream->read(_playField, _matrixSize);
 
 	// Load the plotter data
-	int numWalls = READ_LE_UINT16(&header[6]);
-	int numBlocks = header[8];
+	int numWalls = header._wallCount;
+	int numBlocks = header._blockCount;
 	_plotter.load(playData->_stream, numWalls, numBlocks);
 
-	_playFieldWidth = header[0];
-	_playFieldHeight = header[1];
-	screen._vWindowWidth = header[3];
+	_playFieldWidth = header._tilesWidth;
+	_playFieldHeight = header._tilesHeight;
+	screen._vWindowWidth = header._tilesDisplayWidth;
 	screen._vWindowBytesWide = screen._vWindowWidth << 4;
 	screen._bufferBytesWide = screen._vWindowBytesWide + 16;
-	screen._vWindowHeight = header[4];
+	screen._vWindowHeight = header._tilesDisplayHeight;
 	screen._vWindowLinesTall = screen._vWindowHeight << 4;
 
 	_vm->_screen->setBufferScan();
diff --git a/engines/access/room.h b/engines/access/room.h
index 82d9a31ffa9..6e618334180 100644
--- a/engines/access/room.h
+++ b/engines/access/room.h
@@ -63,8 +63,6 @@ class Room : public Manager {
 private:
 	void roomLoop();
 
-	void loadPlayField(int fileNum, int subfile);
-
 	void commandOff();
 
 	void swapOrg();
@@ -173,6 +171,8 @@ public:
 	* Switch to a given command mode
 	*/
 	void handleCommand(int commandId);
+
+	void loadPlayField(int fileNum, int subfile);
 };
 
 class RoomInfo {
diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp
index b12e3b451b0..ed338fb99b2 100644
--- a/engines/access/screen.cpp
+++ b/engines/access/screen.cpp
@@ -48,7 +48,7 @@ ScreenSave::ScreenSave() : _clipWidth(0), _clipHeight(0), _windowXAdd(0), _windo
 }
 
 Screen::Screen(AccessEngine *vm) : _vm(vm) {
-	Graphics::Screen::create(320, 200);
+	Graphics::Screen::create(_vm->getScreenWidth(), _vm->getScreenHeight());
 	Common::fill(&_tempPalette[0], &_tempPalette[Graphics::PALETTE_SIZE], 0);
 	Common::fill(&_manPal[0], &_manPal[0x60], 0);
 	Common::fill(&_scaleTable1[0], &_scaleTable1[256], 0);


Commit: ffc51120ee632b773c738feeb351c64383dd89e3
    https://github.com/scummvm/scummvm/commit/ffc51120ee632b773c738feeb351c64383dd89e3
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: More fixes for high-res mode

Changed paths:
    engines/access/noctropolis/noctropolis_game.h
    engines/access/room.cpp
    engines/access/screen.cpp
    engines/access/scripts.cpp
    engines/access/video.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index f6b016632fe..671bae7ecbd 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -38,8 +38,8 @@ public:
 	void dead(int deathId) override {};
 	void establish(int esatabIndex, int sub) override {};
 
-	virtual int16 getScreenWidth() const { return 640; }
-	virtual int16 getScreenHeight() const { return 400; }
+	virtual int16 getScreenWidth() const override { return 640; }
+	virtual int16 getScreenHeight() const override { return 400; }
 
 protected:
 	void setupGame() override;
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index cc7a85842f8..ecd0979027d 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -493,7 +493,7 @@ void Room::buildRow(int playY, int screenY) {
 struct RoomHeader {
 	byte _tilesWidth;
 	byte _tilesHeight;
-	int16 _tilesCount;
+	uint16 _tilesCount;
 	byte _tilesDisplayWidth;
 	byte _tilesDisplayHeight;
 	byte _unused1;
diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp
index ed338fb99b2..3201cc1e739 100644
--- a/engines/access/screen.cpp
+++ b/engines/access/screen.cpp
@@ -239,10 +239,18 @@ void Screen::copyBuffer(const byte *data) {
 }
 
 void Screen::setBufferScan() {
+	int16 scanBottom;
+	switch (_vm->getGameID()) {
+	case kGameMartianMemorandum: 	scanBottom = 184; break;
+	case kGameAmazon:				scanBottom = 176; break;
+	case kGameNoctropolis:			scanBottom = 400; break;
+	default:						error("Unsupported game");
+	}
+
 	_clipWidth = _vWindowBytesWide - 1;
-	_windowXAdd = (320 - _clipWidth) >> 1;
+	_windowXAdd = (w - _clipWidth) >> 1;
 	_clipHeight = _vWindowLinesTall - 1;
-	_windowYAdd = (176 - _clipHeight) >> 1;
+	_windowYAdd = (scanBottom - _clipHeight) >> 1;
 }
 
 void Screen::setScaleTable(int scale) {
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 361ddcc39e6..16355970fdf 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -764,7 +764,8 @@ void Scripts::cmdSaveRect() {
 	int y = _vm->_screen->_lastBoundsY;
 	int w = _vm->_screen->_lastBoundsW;
 	int h = _vm->_screen->_lastBoundsH;
-	assert(x >= 0 && y >= 0 && x < 320 && y < 200 && w > 0 && h > 0 && w <= 320 && h <= 200);
+	assert(x >= 0 && y >= 0 && x < _vm->_screen->w && y < _vm->_screen->h
+			&& w > 0 && h > 0 && w <= _vm->_screen->w && h <= _vm->_screen->h);
 	_vm->_newRects.push_back(Common::Rect(x, y, x + w, y + h));
 }
 
diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index 8498213f9ae..d3e8403c7dc 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -78,8 +78,8 @@ void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, int
 		}
 
 		if (vidSurface == _vm->_screen) {
-			assert(pt.x >= 0 && pt.y >= 0 && pt.x < 320 && pt.y < 200 &&
-				_xCount > 0 && _xCount <= 320 && _scanCount > 0 && _scanCount <= 200);
+			assert(pt.x >= 0 && pt.y >= 0 && pt.x < _vm->_screen->w && pt.y < _vm->_screen->h &&
+				_xCount > 0 && _xCount <= _vm->_screen->w && _scanCount > 0 && _scanCount <= _vm->_screen->h);
 			_vm->_newRects.push_back(Common::Rect(pt.x, pt.y, pt.x + _xCount, pt.y + _scanCount));
 		}
 
@@ -184,8 +184,8 @@ void VideoPlayer::copyVideo() {
 		_vm->_vidY - _vm->_screen->_bufferStart.y + _header._height);
 	if (_vm->_screen->clip(r))
 		return;
-	assert(r.left >= 0 && r.left < 320 && r.top >= 0 && r.top < 200 &&
-		r.right > 0 && r.right <= 320 && r.bottom > 0 && r.bottom <= 200);
+	assert(r.left >= 0 && r.left < _vm->_screen->w && r.top >= 0 && r.top < _vm->_screen->h &&
+		r.right > 0 && r.right <= _vm->_screen->w && r.bottom > 0 && r.bottom <= _vm->_screen->h);
 	_vm->_newRects.push_back(r);
 
 	// Draw the clipped video to the buffer


Commit: 98f5de451222f5cd1cf47146b6e1b06c5187dac7
    https://github.com/scummvm/scummvm/commit/98f5de451222f5cd1cf47146b6e1b06c5187dac7
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix remaining issues with intro

Changed paths:
    engines/access/asurface.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/noctropolis/noctropolis_room.h
    engines/access/room.cpp
    engines/access/room.h


diff --git a/engines/access/asurface.cpp b/engines/access/asurface.cpp
index 4420be87fe7..c8481f3ac14 100644
--- a/engines/access/asurface.cpp
+++ b/engines/access/asurface.cpp
@@ -226,7 +226,7 @@ void BaseSurface::flipHorizontal(BaseSurface &dest) {
 
 void BaseSurface::moveBufferLeft() {
 	byte *p = (byte *)getPixels();
-	Common::copy(p + TILE_WIDTH, p + (w * h), p);
+	Common::copy(p + TILE_WIDTH, p + (pitch * h), p);
 }
 
 void BaseSurface::moveBufferRight() {
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index bf309bc810d..2b4fcc2e517 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -87,14 +87,14 @@ void NoctropolisEngine::doIntro() {
 
 	// TODO: Check these fades
 	_screen->setPalette();
-	_screen->fadeIn();
-	copyBF1BF2();
+	((NoctropolisRoom *)_room)->buildScreenXScroll();
 	copyBF2Vid();
+	_screen->fadeIn();
 
 	_timers[26].reset();
 	_timers[27].reset();
 
-	while (true) {
+	while (!shouldQuit()) {
 
 		if (!_timers[27].isActive()) {
 			_timers[27].reset();
@@ -102,9 +102,17 @@ void NoctropolisEngine::doIntro() {
 				break;
 
 			_scrollX += 2;
-			
-			copyBF1BF2();
-			
+
+			if (_scrollX >= TILE_WIDTH) {
+				_scrollX -= TILE_WIDTH;
+				++_scrollCol;
+			}
+
+			((NoctropolisRoom *)_room)->buildScreenXScroll();
+
+			// Don't use copyBF1BF2() here as we want to do sub-tile scrolling.
+			_buffer2.copyFrom(_buffer1);
+
 			for (int i = 0; i < lettersMax; i++) {
 				_buffer2.plotImage(sprites, i + 8, Common::Point(lettersX[i], 40));
 			}
@@ -115,7 +123,7 @@ void NoctropolisEngine::doIntro() {
 						_timers[28].reset();
 					_timers[26].reset();
 					lettersMax++;
-				} else if (titlesSpriteIndex < 25) {
+				} else if (titlesSpriteIndex < ARRAYSIZE(titlesSpriteX)) {
 					_buffer2.plotImage(sprites, titlesSpriteIndex + 19, Common::Point(titlesSpriteX[titlesSpriteIndex], titlesSpriteY[titlesSpriteIndex]));
 					if (!_timers[28].isActive()) {
 						titlesSpriteIndex++;
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 0d818c0d698..30bcdeee7ea 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "access/noctropolis/noctropolis_room.h"
+#include "access/access.h"
 
 namespace Access {
 
@@ -28,6 +29,62 @@ namespace Noctropolis {
 NoctropolisRoom::NoctropolisRoom(AccessEngine *vm): Room(vm) {
 }
 
+void NoctropolisRoom::buildScreenXScroll() {
+	int drawCol = _vm->_scrollCol;
+	int offset = -_vm->_scrollX;
+
+	// Clear current background buffer
+	_vm->_buffer1.clearBuffer();
+
+	int w = MIN(_vm->_screen->_vWindowWidth + 1, _playFieldWidth);
+
+	// Loop through drawing each column of tiles forming the background
+	for (int idx = 0; idx < w; offset += TILE_WIDTH, ++idx) {
+		buildColumnXScroll(drawCol, offset);
+		++drawCol;
+	}
+}
+
+void NoctropolisRoom::buildColumnXScroll(int playX, int screenX) {
+	if (playX < 0 || playX >= _playFieldWidth)
+		return;
+
+	const uint16 *pSrc = _playField + _vm->_scrollRow *
+		_playFieldWidth + playX;
+
+	// WORKAROUND: Original's use of '+ 1' would frequently cause memory overruns
+	int h = MIN(_vm->_screen->_vWindowHeight + 1, _playFieldHeight - _vm->_scrollRow);
+
+	int colWidth = MIN(_vm->_screen->w - screenX, TILE_WIDTH);
+
+	if (colWidth == 0)
+		return;
+
+	int xo = 0;
+	if (screenX < 0) {
+		xo = -screenX;
+		screenX = 0;
+	}
+	
+	if (colWidth <= xo)
+		return;
+
+	for (int y = 0; y < h; ++y) {
+		uint16 tileNum = *pSrc;
+		const byte *pTile = _tile + tileNum * TILE_WIDTH * TILE_HEIGHT;
+		byte *pDest = (byte *)_vm->_buffer1.getBasePtr(screenX, y * TILE_HEIGHT);
+
+		for (int tileY = 0; tileY < TILE_HEIGHT; ++tileY) {
+			Common::copy(pTile + xo, pTile + colWidth, pDest);
+			pTile += TILE_WIDTH;
+			pDest += _vm->_buffer1.pitch;
+		}
+
+		pSrc += _playFieldWidth;
+	}
+}
+
+
 // TODO: Add more functions here.
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_room.h b/engines/access/noctropolis/noctropolis_room.h
index fca5586f756..5ade7ef9a8f 100644
--- a/engines/access/noctropolis/noctropolis_room.h
+++ b/engines/access/noctropolis/noctropolis_room.h
@@ -38,6 +38,11 @@ public:
 
 	void init4Quads() override {};
 
+	/**
+	 * Like Room::buildScreen, but adds vm->_scrollX for sub-tile scrolling.
+	 */
+	void buildScreenXScroll();
+
 protected:
 	void reloadRoom() override {};
 	
@@ -45,6 +50,10 @@ protected:
 
 	void mainAreaClick() override {}
 
+private:
+	// Like buildColumn but can handle negative playX.
+	// TODO: Can we just replace Room::buildColumn with this one?
+	void buildColumnXScroll(int playX, int screenX);
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index ecd0979027d..7e0fc508bad 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -446,14 +446,15 @@ void Room::buildColumn(int playX, int screenX) {
 	if (playX < 0 || playX >= _playFieldWidth)
 		return;
 
-	const byte *pSrc = _playField + _vm->_scrollRow *
+	const uint16 *pSrc = _playField + _vm->_scrollRow *
 		_playFieldWidth + playX;
 
 	// WORKAROUND: Original's use of '+ 1' would frequently cause memory overruns
 	int h = MIN(_vm->_screen->_vWindowHeight + 1, _playFieldHeight - _vm->_scrollRow);
 
 	for (int y = 0; y < h; ++y) {
-		byte *pTile = _tile + (*pSrc << 8);
+		uint16 tileNum = *pSrc;
+		const byte *pTile = _tile + tileNum * TILE_WIDTH * TILE_HEIGHT;
 		byte *pDest = (byte *)_vm->_buffer1.getBasePtr(screenX, y * TILE_HEIGHT);
 
 		for (int tileY = 0; tileY < TILE_HEIGHT; ++tileY) {
@@ -471,13 +472,14 @@ void Room::buildRow(int playY, int screenY) {
 		return;
 	assert(screenY <= (_vm->_screen->h - TILE_HEIGHT));
 
-	const byte *pSrc = _playField + playY * _playFieldWidth + _vm->_scrollCol;
+	const uint16 *pSrc = _playField + playY * _playFieldWidth + _vm->_scrollCol;
 
 	// WORKAROUND: Original's use of '+ 1' would frequently cause memory overruns
 	int w = MIN(_vm->_screen->_vWindowWidth + 1, _playFieldWidth - _vm->_scrollCol);
 
 	for (int x = 0; x < w; ++x) {
-		byte *pTile = _tile + (*pSrc << 8);
+		uint16 tileNum = *pSrc;
+		byte *pTile = _tile + tileNum * TILE_WIDTH * TILE_HEIGHT;
 		byte *pDest = (byte *)_vm->_buffer1.getBasePtr(x * TILE_WIDTH, screenY);
 
 		for (int tileY = 0; tileY < TILE_HEIGHT; ++tileY) {
@@ -513,7 +515,7 @@ static void loadHeader(RoomHeader &hdr, Common::SeekableReadStream *stream, uint
 		hdr._blockCount = stream->readUint16LE();
 		stream->skip(8);
 	} else {
-		hdr._tilesCount = (int16)stream->readByte() << 8;
+		hdr._tilesCount = stream->readByte();
 		hdr._tilesDisplayWidth = stream->readByte();
 		hdr._tilesDisplayHeight = stream->readByte();
 		hdr._unused1 = stream->readByte();
@@ -534,14 +536,22 @@ void Room::loadPlayField(int fileNum, int subfile) {
 	screen.loadRawPalette(playData->_stream);
 
 	// Copy off the tile data
-	int tileSize = header._tilesCount;
+	int tileSize = (int)header._tilesCount * TILE_WIDTH * TILE_HEIGHT;
 	_tile = new byte[tileSize];
 	playData->_stream->read(_tile, tileSize);
 
 	// Copy off the playfield data
 	_matrixSize = (int)header._tilesWidth * header._tilesHeight;
-	_playField = new byte[_matrixSize];
-	playData->_stream->read(_playField, _matrixSize);
+	_playField = new uint16[_matrixSize];
+	if (_vm->getGameID() == kGameNoctropolis) {
+		for (int i = 0; i < _matrixSize; i++) {
+			_playField[i] = playData->_stream->readUint16LE();
+		}
+	} else {
+		for (int i = 0; i < _matrixSize; i++) {
+			_playField[i] = playData->_stream->readByte();
+		}
+	}
 
 	// Load the plotter data
 	int numWalls = header._wallCount;
diff --git a/engines/access/room.h b/engines/access/room.h
index 6e618334180..5bb83baa3b0 100644
--- a/engines/access/room.h
+++ b/engines/access/room.h
@@ -122,7 +122,7 @@ public:
 	Common::Array<JetFrame> _jetFrame;
 	Function _function;
 	int _roomFlag;
-	byte *_playField;
+	uint16 *_playField;
 	int _matrixSize;
 	int _playFieldWidth;
 	int _playFieldHeight;


Commit: 94c00e5f0c0f5f9d1d4bb44da4b03ab823f392ee
    https://github.com/scummvm/scummvm/commit/94c00e5f0c0f5f9d1d4bb44da4b03ab823f392ee
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add startup splash screens for Noctropolis

Changed paths:
    engines/access/detection_tables.h
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_comicviewer.h
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/screen.cpp
    engines/access/screen.h


diff --git a/engines/access/detection_tables.h b/engines/access/detection_tables.h
index 89baf75435a..22de7784469 100644
--- a/engines/access/detection_tables.h
+++ b/engines/access/detection_tables.h
@@ -131,7 +131,7 @@ static const AccessGameDescription gameDescriptions[] = {
 	},
 	
 	{
-		// Noctropolis (sum from GOG macOS version)
+		// Noctropolis (Sum from GOG Windows and macOS versions)
 		{
 			"noctropolis",
 			nullptr,
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index fdca08877f7..9f23afe010f 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -1,3 +1,24 @@
+/* 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 "access/noctropolis/noctropolis_comicviewer.h"
 
 namespace Access {
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.h b/engines/access/noctropolis/noctropolis_comicviewer.h
index 3bd908fcd42..c2b5940581b 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.h
+++ b/engines/access/noctropolis/noctropolis_comicviewer.h
@@ -1,3 +1,24 @@
+/* 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 ACCESS_NOCTROPOLIS_NOCTROPOLIS_COMICVIEWER_H
 #define ACCESS_NOCTROPOLIS_NOCTROPOLIS_COMICVIEWER_H
 
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 2b4fcc2e517..339c3fe88e8 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -21,6 +21,8 @@
 
 #include "access/noctropolis/noctropolis_game.h"
 #include "access/noctropolis/noctropolis_room.h"
+#include "image/png.h"
+#include "graphics/color_quantizer.h"
 
 namespace Access {
 
@@ -52,7 +54,89 @@ void NoctropolisEngine::setupGame() {
 }
 
 void NoctropolisEngine::playGame() {
-	doIntro();
+	if (_loadSaveSlot == -1) {
+		doFlashLogo();
+		if (shouldQuit())
+			return;
+
+		doPublisherLogo();
+		if (shouldQuit())
+			return;
+
+		doIntro();
+		if (shouldQuit())
+			return;
+
+		_screen->forceFadeOut();
+	}
+
+}
+
+void NoctropolisEngine::doFlashLogo() {
+	_events->hideCursor();
+
+	// TODO: should be "DARK/FLASH.SCN".
+	_files->loadScreen(Common::Path("FLASH.SCN"));
+	_screen->fadeIn();
+	if (shouldQuit())
+		return;
+
+	_events->_vbCount = 0x7e;
+	while (!shouldQuit() && (_events->_vbCount > 0) && !_events->isKeyActionMousePressed()) {
+		_events->pollEventsAndWait();
+	}
+	if (shouldQuit())
+		return;
+	_screen->fadeOut();
+}
+
+void NoctropolisEngine::doPublisherLogo() {
+	Common::File pngFile;
+	// TODO: should be "DARK/nds.png".
+	pngFile.open(Common::Path("nds.png"));
+
+	// TODO: Original has a movie here instead of PNG, will need an update.
+	// The version on GOG has PNG for both windows and mac.
+	Image::PNGDecoder decoder;
+	decoder.loadStream(pngFile);
+
+	// Find the best 8-bit palette for this logo as the png is 24-bit and we're
+	// not changing the output surface format for this one logo at the start!
+	Graphics::ColorQuantizer quant(256);
+	const Graphics::Surface *pngSurf = decoder.getSurface();
+	// The image comes in a bit big too
+	Graphics::Surface *scaledPng = pngSurf->scale(640, 360, true);
+	Graphics::PixelFormat format = scaledPng->format;
+	assert(format.bytesPerPixel == 3);
+	for (int y = 0; y < scaledPng->h; y++) {
+		for (int x = 0; x < scaledPng->w; x++) {
+			byte r,g,b;
+			format.colorToRGB(scaledPng->getPixel(x, y), r, g, b);
+			quant.addColor(r, g, b);
+		}
+	}
+	Graphics::Palette *bestPal = quant.getPalette();
+	_screen->clearScreen();
+	_screen->setRawPalette(*bestPal);
+	_screen->setPalette();
+	for (int y = 0; y < MIN(scaledPng->h, _screen->h); y++) {
+		for (int x = 0; x < MIN(scaledPng->w, _screen->w); x++) {
+			byte r,g,b;
+			format.colorToRGB(scaledPng->getPixel(x, y), r, g, b);
+			byte col = bestPal->findBestColor(r, g, b);
+			_screen->setPixel(x, y, col);
+		}
+	}
+	delete bestPal;
+	_screen->fadeIn();
+
+	_events->_vbCount = 0x7e;
+	while (!shouldQuit() && (_events->_vbCount > 0) && !_events->isKeyActionMousePressed()) {
+		_events->pollEventsAndWait();
+	}
+	if (shouldQuit())
+		return;
+	_screen->fadeOut();
 }
 
 void NoctropolisEngine::doIntro() {
@@ -94,7 +178,7 @@ void NoctropolisEngine::doIntro() {
 	_timers[26].reset();
 	_timers[27].reset();
 
-	while (!shouldQuit()) {
+	while (!shouldQuit() && !_events->isKeyActionMousePressed()) {
 
 		if (!_timers[27].isActive()) {
 			_timers[27].reset();
@@ -165,7 +249,6 @@ void NoctropolisEngine::doIntro() {
 	_screen->fadeOut();
 
 	delete sprites;
-
 }
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index 671bae7ecbd..cb23b425f05 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -47,7 +47,8 @@ protected:
 
 private:
 	void doIntro();
-
+	void doFlashLogo();
+	void doPublisherLogo();
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp
index 3201cc1e739..8f8bb44ca6a 100644
--- a/engines/access/screen.cpp
+++ b/engines/access/screen.cpp
@@ -158,6 +158,10 @@ void Screen::setPalette() {
 	g_system->getPaletteManager()->setPalette(&_rawPalette[0], 0, Graphics::PALETTE_COUNT);
 }
 
+void Screen::setRawPalette(const Graphics::Palette &p) {
+	p.grab(_rawPalette, 0, 256);
+}
+
 void Screen::loadRawPalette(Common::SeekableReadStream *stream) {
 	stream->read(&_rawPalette[0], Graphics::PALETTE_SIZE);
 	for (byte *p = &_rawPalette[0]; p < &_rawPalette[Graphics::PALETTE_SIZE]; ++p)
diff --git a/engines/access/screen.h b/engines/access/screen.h
index 735db92d88d..5e4abadd977 100644
--- a/engines/access/screen.h
+++ b/engines/access/screen.h
@@ -137,6 +137,8 @@ public:
 
 	void setPalette();
 
+	void setRawPalette(const Graphics::Palette &p);
+
 	void loadRawPalette(Common::SeekableReadStream *stream);
 
 	void savePalette();


Commit: 992574aff3551aa3f0cc182add93ff047053ef01
    https://github.com/scummvm/scummvm/commit/992574aff3551aa3f0cc182add93ff047053ef01
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: WIP for Noctropolis font loading

Changed paths:
  A engines/access/noctropolis/noctropolis_font.cpp
  A engines/access/noctropolis/noctropolis_font.h
    engines/access/amazon/amazon_logic.cpp
    engines/access/bubble_box.cpp
    engines/access/font.cpp
    engines/access/font.h
    engines/access/inventory.cpp
    engines/access/module.mk
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_resources.h


diff --git a/engines/access/amazon/amazon_logic.cpp b/engines/access/amazon/amazon_logic.cpp
index c4083c28f48..c433b42c16f 100644
--- a/engines/access/amazon/amazon_logic.cpp
+++ b/engines/access/amazon/amazon_logic.cpp
@@ -1742,7 +1742,7 @@ void River::plotRiver() {
 	}
 
 	// Draw the text for skipping the river
-	Font &font2 = *_vm->_fonts._font2;
+	const Font &font2 = *_vm->_fonts._font2;
 	font2.drawString(_vm->_screen, "SKIP", Common::Point(5, 5));
 }
 
diff --git a/engines/access/bubble_box.cpp b/engines/access/bubble_box.cpp
index 3f18d73de93..1222d6ee55f 100644
--- a/engines/access/bubble_box.cpp
+++ b/engines/access/bubble_box.cpp
@@ -182,7 +182,7 @@ void BubbleBox::printBubble_v1(const Common::String &msg) {
 	bool lastLine;
 	do {
 		// Get next line
-		Font &font1 = *_vm->_fonts._font1;
+		const Font &font1 = *_vm->_fonts._font1;
 		lastLine = font1.getLine(s, _vm->_screen->_maxChars, line, width, Font::kWidthInChars);
 		// Draw the text
 		printString(line);
@@ -204,7 +204,7 @@ void BubbleBox::printBubble_v2(const Common::String &msg) {
 	bool lastLine;
 	do {
 		// Get next line
-		Font &font2 = *_vm->_fonts._font2;
+		const Font &font2 = *_vm->_fonts._font2;
 		lastLine = font2.getLine(s, _vm->_screen->_maxChars * 6, line, width);
 
 		// Set font colors
@@ -316,7 +316,7 @@ void BubbleBox::doBox(int item, int box) {
 
 	// Handle drawing title
 	int titleWidth = _vm->_fonts._font2->stringWidth(_bubbleDisplStr);
-	Font &font2 = *_vm->_fonts._font2;
+	const Font &font2 = *_vm->_fonts._font2;
 	font2._fontColors[0] = 0;
 	font2._fontColors[1] = 3;
 	font2._fontColors[2] = 2;
diff --git a/engines/access/font.cpp b/engines/access/font.cpp
index 5d09c9a19cd..a33163a5082 100644
--- a/engines/access/font.cpp
+++ b/engines/access/font.cpp
@@ -256,7 +256,7 @@ FontManager::FontManager() : _font1(nullptr), _font2(nullptr), _bitFont(nullptr)
 	Common::fill(&Font::_fontColors[0], &Font::_fontColors[4], 0);
 }
 
-void FontManager::load(Font *font1, Font *font2, Font *bitFont) {
+void FontManager::load(const Font *font1, const Font *font2, const Font *bitFont) {
 	_font1 = font1;
 	_font2 = font2;
 	_bitFont = bitFont;
diff --git a/engines/access/font.h b/engines/access/font.h
index f3800d0400f..31fd162957e 100644
--- a/engines/access/font.h
+++ b/engines/access/font.h
@@ -151,9 +151,14 @@ public:
 	FontVal _charSet;
 	FontVal _charFor;
 	int _printMaxX;
-	Font *_font1;
-	Font *_font2;
-	Font *_bitFont;
+
+	/** These fonts are used in Amazon/MM */
+	const Font *_font1;
+	const Font *_font2;
+	const Font *_bitFont;
+
+	/** Noctropolis has a list of fonts used by number */
+	Common::Array<const Font *> _fonts;
 public:
 	/**
 	 * Constructor
@@ -163,7 +168,15 @@ public:
 	/**
 	 * Set the fonts
 	 */
-	void load(Font *font1, Font *font2, Font *bitFont);
+	void load(const Font *font1, const Font *font2, const Font *bitFont);
+
+	void addFont(const Font *font) {
+		_fonts.push_back(font);
+	}
+
+	const Font *getFont(int num) {
+		return _fonts[num];
+	}
 };
 
 } // End of namespace Access
diff --git a/engines/access/inventory.cpp b/engines/access/inventory.cpp
index bd9bc7ad2b0..23d9a686010 100644
--- a/engines/access/inventory.cpp
+++ b/engines/access/inventory.cpp
@@ -410,7 +410,7 @@ void InventoryManager::outlineIcon(int itemIndex) {
 	screen.frameRect(_invCoords[itemIndex], 7);
 
 	Common::String s = _tempLOff[itemIndex];
-	Font &font = *_vm->_fonts._font2;
+	const Font &font = *_vm->_fonts._font2;
 	int strWidth = font.stringWidth(s);
 
 	font._fontColors[0] = 0;
diff --git a/engines/access/module.mk b/engines/access/module.mk
index 7f0f42b1f84..c4639dab9b2 100644
--- a/engines/access/module.mk
+++ b/engines/access/module.mk
@@ -35,6 +35,7 @@ MODULE_OBJS := \
 	martian/martian_room.o \
 	martian/martian_scripts.o \
 	noctropolis/noctropolis_comicviewer.o \
+	noctropolis/noctropolis_font.o \
 	noctropolis/noctropolis_game.o \
 	noctropolis/noctropolis_resources.o \
 	noctropolis/noctropolis_room.o \
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index 9f23afe010f..9e8940736ef 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -178,9 +178,9 @@ void ComicViewer::drawBubble(const ComicPageBubble &bubble) {
 
 	// TODO: is this the right font choice?
 	if (bubble.style == 0) {
-		font = _vm->_fonts._font1;
+		font = _vm->_fonts.getFont(5);
 	} else {
-		font = _vm->_fonts._font2;
+		font = _vm->_fonts.getFont(6);
 	}
 
 	textWidth = font->stringWidth(bubble.text);
diff --git a/engines/access/noctropolis/noctropolis_font.cpp b/engines/access/noctropolis/noctropolis_font.cpp
new file mode 100644
index 00000000000..ee9596a47f9
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_font.cpp
@@ -0,0 +1,225 @@
+/* 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 "access/noctropolis/noctropolis_font.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+
+NoctropolisFont::NoctropolisFont(int16 height, byte firstchar, byte numchars, const uint16 *offsets, const byte *data) : Font(firstchar), _numchars(numchars), _height(height), _offsets(offsets), _data(data) {
+}
+
+
+// TODO: Fill out the data for these
+const uint16 CHALETEU_OFFSETS[] = {
+    0x0,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+    0x5,     0x8,     0xE,     0x15,    0x1B,    0x23,    0x2A,    0x2D,
+    0x30,    0x33,    0x39,    0x40,    0x43,    0x48,    0x4B,    0x50,
+    0x58,    0x5C,    0x62,    0x68,    0x6E,    0x74,    0x7A,    0x80,
+    0x86,    0x8C,    0x8F,    0x92,    0x96,    0x9B,    0x9F,    0xA5,
+    0xAD,    0xB5,    0xBB,    0xC3,    0xCA,    0xD0,    0xD6,    0xDF,
+    0xE6,    0xE9,    0xEE,    0xF4,    0xFA,    0x103,   0x10B,   0x114,
+    0x11A,   0x123,   0x129,   0x12F,   0x135,   0x13D,   0x145,   0x150,
+    0x159,   0x161,   0x168,   0x16B,   0x170,   0x173,   0x178,   0x17A,
+    0x17D,   0x184,   0x18B,   0x192,   0x199,   0x1A0,   0x1A4,   0x1AB,
+    0x1B2,   0x1B5,   0x1BA,   0x1C0,   0x1C3,   0x1CD,   0x1D4,   0x1DB,
+    0x1E2,   0x1E9,   0x1EE,   0x1F3,   0x1F7,   0x1FE,   0x204,   0x20E,
+    0x215,   0x21B,   0x221,   0x225,   0x227,   0x22B,   0x230,   0x230,
+    0x237,   0x23E,   0x245,   0x24C,   0x253,   0x25A,   0x261,   0x268,
+    0x26F,   0x276,   0x27D,   0x282,   0x289,   0x28D,   0x295,   0x29B,
+    0x2A2,   0x2AA,   0x2B0,   0x2B7,   0x2BE,   0x2C5,   0x2CC,   0x2D3,
+    0x2D9,   0x2DF,   0x2E7,   0x2E7,   0x2E7,   0x2E7,   0x2EE,   0x2EE,
+    0x2F5,   0x2F9,   0x300,   0x307,   0x30E,   0x315,   0x31B,   0x320,
+    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+    0x320,   0x326
+};
+const byte   CHALETEU_DATA[] = {0};
+
+const uint16 SYSTEMEU_OFFSETS[] = {
+    0x0,     0x5,     0xA,     0x10,    0x18,    0x1F,    0x26,    0x26,
+    0x2A,    0x2F,    0x34,    0x34,    0x3A,    0x3E,    0x44,    0x48,
+    0x4E,    0x54,    0x59,    0x5F,    0x65,    0x6B,    0x71,    0x77,
+    0x7D,    0x83,    0x89,    0x8C,    0x8F,    0x8F,    0x95,    0x95,
+    0x9B,    0xA1,    0xA7,    0xAD,    0xB3,    0xB9,    0xBF,    0xC5,
+    0xCB,    0xD1,    0xD6,    0xDC,    0xE2,    0xE8,    0xF0,    0xF6,
+    0xFC,    0x102,   0x108,   0x10E,   0x114,   0x119,   0x11F,   0x125,
+    0x12D,   0x133,   0x139,   0x13F,   0x144,   0x14A,   0x14F,   0x155,
+    0x15C,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,
+    0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,
+    0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,
+    0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,
+    0x161,   0x167,   0x16D,   0x173,   0x179,   0x17F,   0x185,   0x18B,
+    0x191,   0x197,   0x19D,   0x1A3,   0x1A9,   0x1AF,   0x1B5,   0x1BB,
+    0x1C1,   0x1C7,   0x1CE,   0x1D5,   0x1DB,   0x1E1,   0x1E7,   0x1ED,
+    0x1F3,   0x1F9,   0x1FF,   0x205,   0x205,   0x205,   0x205,   0x205,
+    0x205,   0x20B,   0x210,   0x216,   0x21C,   0x222,   0x228,   0x22D,
+    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+    0x232,   0x232,   0x237,
+};
+const byte   SYSTEMEU_DATA[] = {0};
+
+const uint16 SML3X5_OFFSETS[] = {
+    0x0,     0x2,     0x4,     0x8,     0x8,     0x8,     0xC,     0xC,
+    0xF,     0x12,    0x15,    0x15,    0x19,    0x1C,    0x20,    0x22,
+    0x26,    0x2A,    0x2E,    0x32,    0x36,    0x3A,    0x3E,    0x42,
+    0x46,    0x4A,    0x4E,    0x50,    0x53,    0x57,    0x5B,    0x5F,
+    0x64,    0x64,    0x68,    0x6C,    0x70,    0x74,    0x78,    0x7C,
+    0x81,    0x85,    0x89,    0x8E,    0x92,    0x96,    0x9C,    0xA0,
+    0xA4,    0xA8,    0xAD,    0xB1,    0xB5,    0xB9,    0xBD,    0xC1,
+    0xC7,    0xCB,    0xCF,    0xD3,    0xD7,    0xDB,    0xDF,    0xE3,
+    0xE7,    0xEA,
+};
+const byte   SML3X5_DATA[] = {0};
+
+const uint16 NAPLES12_OFFSETS[] = {
+    0x0,     0x6,     0xB,     0x14,    0x1D,    0x25,    0x31,    0x3B,
+    0x40,    0x46,    0x4C,    0x56,    0x5F,    0x64,    0x6D,    0x74,
+    0x7E,    0x86,    0x8E,    0x96,    0x9E,    0xA7,    0xAF,    0xB7,
+    0xBF,    0xC7,    0xCF,    0xD4,    0xD9,    0xE0,    0xE8,    0xEF,
+    0xF8,    0x103,   0x110,   0x11A,   0x122,   0x12D,   0x137,   0x140,
+    0x14A,   0x156,   0x15E,   0x165,   0x171,   0x17A,   0x188,   0x194,
+    0x19D,   0x1A7,   0x1B0,   0x1BC,   0x1C4,   0x1CD,   0x1D8,   0x1E2,
+    0x1EF,   0x1FC,   0x205,   0x20E,   0x214,   0x21C,   0x222,   0x22A,
+    0x233,   0x233,   0x23C,   0x244,   0x24B,   0x255,   0x25C,   0x263,
+    0x26B,   0x274,   0x27A,   0x280,   0x289,   0x28E,   0x29D,   0x2A7,
+    0x2AF,   0x2B8,   0x2C0,   0x2C7,   0x2CE,   0x2D4,   0x2DE,   0x2E7,
+    0x2F5,   0x2FF,   0x308,   0x310,   0x317,   0x31C,   0x323,   0x32C,
+};
+const byte   NAPLES12_DATA[] = {0};
+
+const uint16 GOTHICEU_OFFSETS[] = {
+    0x0,     0x5,     0x8,     0xF,     0x16,    0x1D,    0x27,    0x2F,
+    0x33,    0x38,    0x3D,    0x46,    0x4F,    0x53,    0x5B,    0x5E,
+    0x66,    0x6E,    0x71,    0x78,    0x7F,    0x87,    0x8E,    0x95,
+    0x9C,    0xA3,    0xAA,    0xAD,    0xB1,    0xB9,    0xC1,    0xC9,
+    0xD0,    0xD9,    0xE0,    0xE7,    0xEE,    0xF5,    0xFB,    0x101,
+    0x108,   0x10F,   0x112,   0x118,   0x11F,   0x124,   0x12B,   0x132,
+    0x13A,   0x141,   0x149,   0x150,   0x156,   0x15D,   0x164,   0x16B,
+    0x176,   0x17D,   0x184,   0x18B,   0x190,   0x198,   0x19D,   0x1A6,
+    0x1AF,   0x1B4,   0x1BB,   0x1C2,   0x1C9,   0x1D0,   0x1D7,   0x1DC,
+    0x1E3,   0x1E9,   0x1EC,   0x1F0,   0x1F7,   0x1FA,   0x203,   0x209,
+    0x211,   0x218,   0x21F,   0x225,   0x22B,   0x230,   0x237,   0x23E,
+    0x247,   0x24E,   0x255,   0x25B,   0x261,   0x264,   0x26A,   0x272,
+    0x272,   0x279,   0x280,   0x287,   0x28E,   0x295,   0x29C,   0x2A3,
+    0x2AA,   0x2B1,   0x2B8,   0x2BF,   0x2C6,   0x2CD,   0x2D2,   0x2D9,
+    0x2E0,   0x2E7,   0x2EE,   0x2F6,   0x2FE,   0x306,   0x30E,   0x315,
+    0x31C,   0x323,   0x32A,   0x334,   0x334,   0x334,   0x33B,   0x343,
+    0x343,   0x34A,   0x34F,   0x357,   0x35E,   0x364,   0x36B,   0x372,
+    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+    0x379,   0x379,   0x37F,   0x385,   0x385,   0x385,   0x38E,   0x395,
+    0x395,   0x395,   0x395,   0x395,   0x39C,
+};
+const byte   GOTHICEU_DATA[] = {0};
+
+const uint16 CHALETSE_OFFSETS[] = {
+    0x0,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+    0x5,     0x8,     0xE,     0x15,    0x1B,    0x23,    0x2A,    0x2D,
+    0x30,    0x33,    0x39,    0x3F,    0x42,    0x47,    0x4A,    0x4F,
+    0x56,    0x5B,    0x61,    0x67,    0x6D,    0x73,    0x79,    0x7F,
+    0x85,    0x8B,    0x8E,    0x91,    0x95,    0x9A,    0x9E,    0xA4,
+    0xAC,    0xB2,    0xB8,    0xBE,    0xC4,    0xCA,    0xD0,    0xD7,
+    0xDD,    0xDF,    0xE4,    0xEA,    0xF0,    0xF8,    0xFF,    0x107,
+    0x10D,   0x114,   0x11A,   0x120,   0x126,   0x12D,   0x133,   0x13D,
+    0x145,   0x14D,   0x154,   0x157,   0x15C,   0x15F,   0x164,   0x166,
+    0x169,   0x170,   0x177,   0x17E,   0x185,   0x18C,   0x190,   0x197,
+    0x19E,   0x1A1,   0x1A6,   0x1AC,   0x1AF,   0x1B9,   0x1C0,   0x1C7,
+    0x1CE,   0x1D5,   0x1DA,   0x1DF,   0x1E3,   0x1EA,   0x1F0,   0x1FA,
+    0x201,   0x207,   0x20D,   0x211,   0x213,   0x217,   0x21C,   0x21C,
+    0x223,   0x22A,   0x231,   0x239,   0x240,   0x247,   0x24E,   0x255,
+    0x25D,   0x264,   0x26B,   0x271,   0x277,   0x27B,   0x281,   0x287,
+    0x28D,   0x294,   0x29B,   0x2A2,   0x2A9,   0x2B0,   0x2B7,   0x2BE,
+    0x2C4,   0x2CA,   0x2D1,   0x2D1,   0x2D1,   0x2D1,   0x2D1,   0x2D1,
+    0x2D8,   0x2DC,   0x2E3,   0x2EA,   0x2F0,   0x2F6,   0x2FC,   0x301,
+    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+    0x301,   0x306,   0x30B,   0x313,   0x31A,   0x31A,   0x31A,   0x31A,
+    0x31A,   0x31A,   0x31A,   0x321,
+};
+const byte   CHALETSE_DATA[] = {0};
+
+const uint16 COMICSEU_OFFSETS[] = {
+    0x0,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+    0x5,     0x8,     0xE,     0x15,    0x1B,    0x22,    0x28,    0x2B,
+    0x2E,    0x31,    0x37,    0x3B,    0x3E,    0x43,    0x46,    0x4B,
+    0x52,    0x56,    0x5B,    0x60,    0x66,    0x6B,    0x70,    0x75,
+    0x7B,    0x80,    0x83,    0x86,    0x8A,    0x8F,    0x93,    0x99,
+    0xA1,    0xA6,    0xAB,    0xB0,    0xB5,    0xBA,    0xBF,    0xC5,
+    0xCA,    0xCC,    0xD1,    0xD6,    0xDB,    0xE1,    0xE6,    0xED,
+    0xF2,    0xF8,    0xFD,    0x102,   0x106,   0x10B,   0x110,   0x116,
+    0x11C,   0x122,   0x128,   0x12B,   0x12F,   0x132,   0x137,   0x139,
+    0x13C,   0x143,   0x148,   0x14D,   0x152,   0x157,   0x15C,   0x163,
+    0x168,   0x16B,   0x170,   0x175,   0x178,   0x181,   0x187,   0x18D,
+    0x194,   0x19B,   0x1A0,   0x1A5,   0x1A9,   0x1B0,   0x1B6,   0x1C0,
+    0x1C7,   0x1CD,   0x1D3,   0x1D7,   0x1D9,   0x1DD,   0x1E2,   0x1E2,
+    0x1E7,   0x1EC,   0x1F1,   0x1F6,   0x1FB,   0x200,   0x205,   0x20A,
+    0x20F,   0x214,   0x219,   0x21E,   0x223,   0x227,   0x22C,   0x231,
+    0x236,   0x23C,   0x243,   0x248,   0x24D,   0x252,   0x257,   0x25C,
+    0x261,   0x267,   0x26D,   0x26D,   0x26D,   0x26D,   0x26D,   0x26D,
+    0x272,   0x276,   0x27B,   0x280,   0x285,   0x28A,   0x290,   0x295,
+    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+    0x295,   0x29A,   0x29F,   0x29F,   0x29F,   0x2A6,   0x2AC,   0x2AC,
+    0x2AC,   0x2AC,   0x2AC,   0x2B2,
+};
+const byte   COMICSEU_DATA[] = {0};
+
+} // end namespace Noctrpolis
+
+} // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_font.h b/engines/access/noctropolis/noctropolis_font.h
new file mode 100644
index 00000000000..b14c90d47df
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_font.h
@@ -0,0 +1,60 @@
+/* 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 ACCESS_NOCTROPOLIS_NOCTROPOLIS_FONT_H
+#define ACCESS_NOCTROPOLIS_NOCTROPOLIS_FONT_H
+
+#include "access/font.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+const extern uint16 CHALETEU_OFFSETS[];
+const extern byte CHALETEU_DATA[];
+const extern uint16 SYSTEMEU_OFFSETS[];
+const extern byte SYSTEMEU_DATA[];
+const extern uint16 SML3X5_OFFSETS[];
+const extern byte SML3X5_DATA[];
+const extern uint16 NAPLES12_OFFSETS[];
+const extern byte NAPLES12_DATA[];
+const extern uint16 GOTHICEU_OFFSETS[];
+const extern byte GOTHICEU_DATA[];
+const extern uint16 CHALETSE_OFFSETS[];
+const extern byte CHALETSE_DATA[];
+const extern uint16 COMICSEU_OFFSETS[];
+const extern byte COMICSEU_DATA[];
+
+class NoctropolisFont : public Font {
+public:
+	NoctropolisFont(int16 height, byte firstchar, byte numchars, const uint16 *offsets, const byte *data);
+private:
+	byte _numchars;
+	int16 _height;
+	const uint16 *_offsets;
+	const byte *_data;
+};
+
+} // end namespace Noctropolis
+
+} // end namespace Access
+
+#endif // ACCESS_NOCTROPOLIS_NOCTROPOLIS_FONT_H
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 399e223900e..b3fa3f4d1bf 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -21,6 +21,8 @@
 
 #include "access/noctropolis/noctropolis_resources.h"
 #include "access/noctropolis/noctropolis_game.h"
+#include "access/noctropolis/noctropolis_font.h"
+#include "access/font.h"
 
 namespace Access {
 
@@ -55,21 +57,54 @@ static const char *NOCT_FILES[] = {
 	nullptr,
 };
 
-NoctropolisResources::NoctropolisResources(AccessEngine *_vm) : Resources(_vm) {
+///////////////////////////////////////////////////////////////
+
+
+NoctropolisResources::NoctropolisResources(AccessEngine *_vm) : Resources(_vm), _fontChaleteu(nullptr), _fontSystemeu(nullptr),
+_fontSml3x5(nullptr), _fontNaples12(nullptr), _fontGothiceu(nullptr), _fontChaletse(nullptr),_fontComicseu(nullptr)
+{
+}
+
+NoctropolisResources::~NoctropolisResources() {
+	delete _fontChaleteu;
+	delete _fontSystemeu;
+	delete _fontSml3x5;
+	delete _fontNaples12;
+	delete _fontGothiceu;
+	delete _fontChaletse;
+	delete _fontComicseu;
 }
 
+
 const char *NoctropolisResources::getEgoName() const {
 	return _vm->_flags[1] == 0 ? "PETER" : "DARKSHEER";
 }
 
 void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	// Note: *don't* call the base class here. Noctropolis doesn't have data in access.dat.
-	
+
 	// TODO: For non-EN variants we want to use something other than DARK/ as the path.
 	for (int i = 0; i < ARRAYSIZE(NOCT_FILES); i++) {
 		Common::Path filename = Common::Path(NOCT_FILES[i]).getLastComponent();
 		FILENAMES.push_back(filename);
 	}
+
+	_fontChaleteu = new NoctropolisFont(11, 1, 0xe2, CHALETEU_OFFSETS, CHALETEU_DATA);
+	_fontSystemeu = new NoctropolisFont(8, 0x20, 0xe2, SYSTEMEU_OFFSETS, SYSTEMEU_DATA);
+	_fontSml3x5 = new NoctropolisFont(6, 0x20, 0x61, SML3X5_OFFSETS, SML3X5_DATA);
+	_fontNaples12 = new NoctropolisFont(15, 0x20, 0x7f, NAPLES12_OFFSETS, NAPLES12_DATA);
+	_fontGothiceu = new NoctropolisFont(16, 0x20, 0xec, GOTHICEU_OFFSETS, GOTHICEU_DATA);
+	_fontChaletse = new NoctropolisFont(8, 1, 0xec, CHALETSE_OFFSETS, CHALETSE_DATA);
+	_fontComicseu = new NoctropolisFont(8, 1, 0xec, COMICSEU_OFFSETS, COMICSEU_DATA);
+
+	// Set up the fonts
+	_vm->_fonts.addFont(_fontChaleteu);
+	_vm->_fonts.addFont(_fontSystemeu);
+	_vm->_fonts.addFont(_fontSml3x5);
+	_vm->_fonts.addFont(_fontNaples12);
+	_vm->_fonts.addFont(_fontGothiceu);
+	_vm->_fonts.addFont(_fontChaletse);
+	_vm->_fonts.addFont(_fontComicseu);
 }
 
 
diff --git a/engines/access/noctropolis/noctropolis_resources.h b/engines/access/noctropolis/noctropolis_resources.h
index 069824395c4..a9c3ef2d41e 100644
--- a/engines/access/noctropolis/noctropolis_resources.h
+++ b/engines/access/noctropolis/noctropolis_resources.h
@@ -26,6 +26,8 @@
 
 namespace Access {
 
+class Font;
+
 namespace Noctropolis {
 
 class NoctropolisEngine;
@@ -33,6 +35,7 @@ class NoctropolisEngine;
 class NoctropolisResources : public Resources {
 public:
 	NoctropolisResources(AccessEngine *_vm);
+	~NoctropolisResources();
 
 	// TODO implement these for real.
 	const byte *getCursor(int num) const override { return nullptr; }
@@ -46,8 +49,13 @@ public:
 	void load(Common::SeekableReadStream &s) override;
 
 private:
-	// TODO add private members
-
+	Font *_fontChaleteu;
+	Font *_fontSystemeu;
+	Font *_fontSml3x5;
+	Font *_fontNaples12;
+	Font *_fontGothiceu;
+	Font *_fontChaletse;
+	Font *_fontComicseu;
 };
 
 } // end namespace Noctropolis


Commit: 00476ffdc2bef4f564d7ada4abbe6440a67dced9
    https://github.com/scummvm/scummvm/commit/00476ffdc2bef4f564d7ada4abbe6440a67dced9
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Completed Noctropolis font loading

Changed paths:
    engines/access/noctropolis/noctropolis_font.cpp
    engines/access/noctropolis/noctropolis_font.h
    engines/access/noctropolis/noctropolis_resources.cpp


diff --git a/engines/access/noctropolis/noctropolis_font.cpp b/engines/access/noctropolis/noctropolis_font.cpp
index ee9596a47f9..56a9b033736 100644
--- a/engines/access/noctropolis/noctropolis_font.cpp
+++ b/engines/access/noctropolis/noctropolis_font.cpp
@@ -20,17 +20,110 @@
  */
 
 #include "access/noctropolis/noctropolis_font.h"
+#include "access/screen.h"
+
+#if DUMP_FONTS
+#include "common/file.h"
+#include "image/png.h"
+#endif
 
 namespace Access {
 
 namespace Noctropolis {
 
 
-NoctropolisFont::NoctropolisFont(int16 height, byte firstchar, byte numchars, const uint16 *offsets, const byte *data) : Font(firstchar), _numchars(numchars), _height(height), _offsets(offsets), _data(data) {
+NoctropolisFont::NoctropolisFont(uint16 bytes, int16 height, byte firstchar, byte lastchar, const uint16 *offsets, const byte *data) : Font(firstchar), _bytes(bytes), _lastChar(lastchar) {
+	_height = height;
+	load(offsets, data);
+}
+
+uint NoctropolisFont::getCharWidth(byte ch, const uint16 *offsets) const {
+	assert(ch >= _firstCharIndex && ch < _lastChar);
+	return getCharBitOffset(ch + 1, offsets) - getCharBitOffset(ch, offsets);
+}
+
+const byte *NoctropolisFont::getCharDataPtr(byte ch, const uint16 *offsets, const byte *data) const {
+	assert(ch >= _firstCharIndex && ch < _lastChar);
+	return data + getCharBitOffset(ch, offsets) / 8;
+}
+
+uint NoctropolisFont::getCharBitOffset(byte ch, const uint16 *offsets) const {
+	assert(ch >= _firstCharIndex && ch <= _lastChar);
+	if (ch == _lastChar) // FIXME!! Ignore last char??
+		ch--;
+	return offsets[ch - _firstCharIndex];
+}
+
+
+void NoctropolisFont::makeCharSurface(Graphics::Surface &surface, byte ch, const uint16 *offsets, const byte *data) const {
+	uint width = getCharWidth(ch, offsets);
+
+	surface.create(width, _height, Graphics::PixelFormat::createFormatCLUT8());
+
+	// Character probably doesn't exist in this font
+	if (width == 0)
+		return;
+
+	const byte *charData = getCharDataPtr(ch, offsets, data);
+	uint height = _height;
+	uint bitOfs = getCharBitOffset(ch, offsets);
+	byte *pixels = (byte*)surface.getPixels();
+
+	while (height--) {
+		uint charByte = 0;
+		byte data = charData[charByte];
+		byte mask = 1 << (7 - (bitOfs & 7));
+		for (uint xc = 0; xc < width; xc++) {
+			if (data & mask) {
+				// Foreground
+				pixels[xc] = 1;
+			}
+			mask >>= 1;
+			if (mask == 0) {
+				charByte++;
+				data = charData[charByte];
+				mask = 0x80;
+			}
+		}
+		charData += _bytes;
+		pixels += surface.pitch;
+	}
 }
 
 
-// TODO: Fill out the data for these
+static int dumpno = 0;
+
+void NoctropolisFont::load(const uint16 *offsets, const byte *data) {
+	_chars.resize(_lastChar - _firstCharIndex);
+	int totalw = 0;
+	for (byte ch = 0; ch < _chars.size(); ch++) {
+		makeCharSurface(_chars[ch], ch + _firstCharIndex, offsets, data);
+		totalw += _chars[ch].w;
+	}
+
+#if DUMP_FONTS
+	Graphics::Surface dump;
+	Common::DumpFile dumpfile;
+	dump.create(totalw, _height, Graphics::PixelFormat::createFormatCLUT8());
+	int x = 0;
+	for (byte ch = 0; ch < _chars.size(); ch++) {
+		if (!_chars[ch].w)
+			continue;
+		dump.copyRectToSurface(_chars[ch], x, 0, Common::Rect(_chars[ch].w, _chars[ch].h));
+		x += _chars[ch].w;
+	}
+	
+	byte pal[768];
+	ARRAYCLEAR(pal);
+	pal[3] = pal[4] = pal[5] = 0xff;
+	dumpfile.open(Common::Path(Common::String::format("/tmp/font-%d.png", dumpno++)));
+	Image::writePNG(dumpfile, dump, pal);
+#endif
+}
+
+
+// Just a bunch of data from here onward.
+
 const uint16 CHALETEU_OFFSETS[] = {
     0x0,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
@@ -62,7 +155,149 @@ const uint16 CHALETEU_OFFSETS[] = {
     0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
     0x320,   0x326
 };
-const byte   CHALETEU_DATA[] = {0};
+const byte   CHALETEU_DATA[] = {
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x4,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xc,    0x20,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x31,   0x80,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0xa,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x3,    0xff,   0x6,    0xd9,
+    0x21,   0xc,    0xe,    0x32,   0x95,   0x0,    0x0,    0x2,
+    0x38,   0x27,   0x3e,   0xb,    0xe1,   0x3e,   0x71,   0xc0,
+    0x0,    0x0,    0xe1,   0xc0,   0x87,   0x87,   0x1e,   0x3e,
+    0xf8,   0xf1,   0xa,    0xa,    0x28,   0x20,   0x50,   0x47,
+    0x8f,   0xf,    0x1e,   0x39,   0xf4,   0x14,   0x14,   0x82,
+    0x81,   0x41,   0x7e,   0xd0,   0xd2,   0x10,   0x8,    0x0,
+    0x1,    0x0,    0x30,   0x10,   0x31,   0xa0,   0xc0,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x15,   0x14,   0x78,   0x0,    0x33,   0xc0,
+    0x0,    0x0,    0x0,    0x79,   0xb,    0x4,    0x9e,   0x63,
+    0x61,   0x1,    0x80,   0x0,    0x78,   0x0,    0x3,    0xc0,
+    0x0,    0x45,   0x5,    0xc0,   0x3,    0x0,    0x0,    0x3,
+    0xf0,   0x0,    0x73,   0xff,   0x2,    0xd9,   0x23,   0x92,
+    0x51,   0x34,   0x4a,   0x0,    0x0,    0x2,    0x44,   0x68,
+    0x82,   0x12,   0x2,    0x2,    0x8a,   0x20,   0x0,    0x1,
+    0x12,   0x20,   0x84,   0x48,   0x91,   0x20,   0x81,   0x9,
+    0xa,    0xa,    0x48,   0x30,   0xd8,   0x48,   0x48,   0x90,
+    0x91,   0x44,   0x44,   0x14,   0x14,   0x82,   0x42,   0x22,
+    0x2,    0x90,   0x40,   0x8,    0x8,    0x0,    0x1,    0x0,
+    0x40,   0x10,   0x0,    0x20,   0x40,   0x0,    0x0,    0x0,
+    0x0,    0x0,    0x10,   0x0,    0x0,    0x0,    0x0,    0x0,
+    0x24,   0x80,   0x85,   0x8,    0x4,    0x28,   0x58,   0x4,
+    0x0,    0x84,   0x0,    0x0,    0x21,   0x0,    0x81,   0x0,
+    0x0,    0xe,    0x85,   0xb,    0x4,    0x2c,   0x11,   0x10,
+    0x1,    0x20,   0x30,   0x6,    0xd,    0xf0,   0x0,    0x0,
+    0x8b,   0xff,   0x2,    0x4b,   0xf5,   0x52,   0x91,   0x14,
+    0x4a,   0x10,   0x0,    0x4,    0x82,   0xa8,   0x84,   0x22,
+    0x4,    0x2,    0x8a,   0x2d,   0x88,   0x11,   0x14,   0x91,
+    0x44,   0x50,   0x50,   0xa0,   0x82,   0x5,    0xa,    0xa,
+    0x88,   0x29,   0x54,   0x50,   0x28,   0xa0,   0x51,   0x44,
+    0x44,   0x12,   0x22,   0x44,   0x24,   0x14,   0x4,    0x88,
+    0x40,   0x3,    0xef,   0x8f,   0x1f,   0x3c,   0xe7,   0xdf,
+    0x30,   0xa4,   0x5e,   0xe7,   0xc7,   0x9f,   0x1f,   0x59,
+    0x99,   0xa,    0x28,   0x8a,   0x14,   0x5f,   0x24,   0x80,
+    0x80,   0x1,    0xe0,   0x0,    0x0,    0x4,    0x3c,   0x78,
+    0xf1,   0xe3,   0xc,    0x31,   0x40,   0x1f,   0x9f,   0x94,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x29,   0x5,    0x20,
+    0x6,    0x0,    0x0,    0x2,    0x13,   0x9c,   0xf3,   0xff,
+    0x2,    0x91,   0x23,   0xd,    0xa,    0x24,   0x55,   0x10,
+    0x0,    0x4,    0x82,   0x21,   0x8,    0x53,   0xcb,   0x4,
+    0x72,   0x2d,   0x90,   0x8,    0x25,   0x51,   0x47,   0x90,
+    0x10,   0xbc,   0xf2,   0x1,    0xfa,   0xb,    0x8,    0x26,
+    0x52,   0x50,   0x28,   0xa0,   0x51,   0x30,   0x44,   0x12,
+    0x22,   0x44,   0x18,   0x8,    0x8,    0x88,   0x40,   0x4,
+    0x28,   0x50,   0xa1,   0x42,   0x48,   0x50,   0x90,   0xa8,
+    0x51,   0x14,   0x28,   0x50,   0xa1,   0x62,   0x51,   0xa,
+    0x28,   0x89,   0x24,   0x42,   0x24,   0x80,   0x81,   0xa,
+    0x13,   0xe7,   0xcf,   0x9f,   0x40,   0x85,   0xa,    0x11,
+    0x4,    0x11,   0x43,   0x88,   0x4,    0x24,   0x78,   0xf1,
+    0xe4,   0x28,   0x51,   0x45,   0x5,    0xf1,   0xf2,   0x3c,
+    0x85,   0xf3,   0x14,   0x92,   0x8b,   0xff,   0x2,    0x3,
+    0xf1,   0x83,   0x94,   0x4,    0x44,   0x7c,   0x1e,   0x8,
+    0x82,   0x22,   0x4,    0x90,   0x28,   0x84,   0x89,   0xa0,
+    0x23,   0xc4,   0x45,   0x52,   0x24,   0x50,   0x10,   0xa0,
+    0x82,   0x3d,   0xa,    0xb,    0x8,    0x20,   0x51,   0x50,
+    0x28,   0xa2,   0x51,   0x8,    0x44,   0x11,   0x41,   0x28,
+    0x18,   0x8,    0x10,   0x84,   0x40,   0x4,    0x28,   0x50,
+    0x21,   0x7e,   0x48,   0x50,   0x90,   0xb0,   0x51,   0x14,
+    0x28,   0x50,   0xa1,   0x41,   0x91,   0x9,    0x45,   0x50,
+    0xc2,   0x84,   0x44,   0x40,   0x85,   0xb,    0xf4,   0x28,
+    0x50,   0xa1,   0x40,   0xfd,   0xfb,   0xf1,   0x4,    0x12,
+    0x24,   0x48,   0x1f,   0x3e,   0x85,   0xa,    0x14,   0x28,
+    0x4a,   0x45,   0x5,    0x12,   0x12,   0x42,   0x85,   0xa,
+    0x94,   0x92,   0xf3,   0xff,   0x0,    0x1,    0x21,   0x46,
+    0x52,   0x84,   0x40,   0x10,   0x0,    0x8,    0x82,   0x24,
+    0x22,   0xfa,   0x28,   0x88,   0x88,   0x40,   0x10,   0x8,
+    0x4,    0xe2,   0x24,   0x50,   0x50,   0xa0,   0x82,   0x5,
+    0xa,    0xa,    0x88,   0x20,   0x50,   0xd0,   0x2f,   0x21,
+    0x5e,   0x44,   0x44,   0x11,   0x41,   0x68,   0x24,   0x8,
+    0x20,   0x84,   0x40,   0x4,    0x28,   0x50,   0x21,   0x40,
+    0x48,   0x50,   0x90,   0xa8,   0x51,   0x14,   0x28,   0x50,
+    0xa1,   0x40,   0x51,   0x9,    0x45,   0x50,   0xc2,   0x88,
+    0x24,   0x80,   0x79,   0xa,    0x4,    0x28,   0x50,   0xa1,
+    0x40,   0x81,   0x2,    0x1,    0x4,    0x12,   0x24,   0x4e,
+    0x24,   0x24,   0x85,   0xa,    0x14,   0x28,   0x4a,   0x45,
+    0x5,    0x3a,   0x12,   0x42,   0x85,   0xa,    0x53,   0xcc,
+    0x81,   0x14,   0x6,    0x1,    0x25,   0x4a,   0x51,   0x4,
+    0x40,   0x10,   0xc0,   0xd0,   0x44,   0x28,   0x22,   0x12,
+    0x28,   0x88,   0x88,   0x8d,   0x8b,   0xd0,   0xc2,   0x5,
+    0xd4,   0x48,   0x91,   0x20,   0x81,   0x9,    0xa,    0x4a,
+    0x48,   0x20,   0x50,   0x48,   0x48,   0x10,   0x92,   0x44,
+    0x42,   0x20,   0x80,   0x90,   0x42,   0x8,    0x40,   0x82,
+    0x40,   0x4,    0x28,   0x50,   0xa1,   0x42,   0x48,   0x50,
+    0x90,   0xa4,   0x51,   0x14,   0x28,   0x50,   0xa1,   0x42,
+    0x51,   0x8,    0x82,   0x21,   0x21,   0x10,   0x24,   0x80,
+    0x9,    0xa,    0x14,   0x28,   0x50,   0xa1,   0x3c,   0x85,
+    0xa,    0x11,   0x4,    0x15,   0xd7,   0xc8,   0x24,   0x24,
+    0x85,   0xa,    0x14,   0x28,   0x44,   0x28,   0x89,   0x12,
+    0x12,   0x42,   0x85,   0xa,    0x30,   0x0,    0x83,   0xff,
+    0x6,    0x0,    0x3,    0x91,   0x8e,   0x84,   0x40,   0x0,
+    0xc0,   0xd0,   0x38,   0x2f,   0x9c,   0x11,   0xc7,   0x10,
+    0x71,   0xd,    0x80,   0x0,    0xc1,   0xe4,   0x17,   0x87,
+    0x1e,   0x3e,   0x80,   0xf1,   0xa,    0x32,   0x2f,   0xa0,
+    0x50,   0x47,   0x88,   0xf,    0x51,   0x38,   0x41,   0xc0,
+    0x80,   0x90,   0x81,   0x8,    0x7e,   0x82,   0x40,   0xc3,
+    0xef,   0x8f,   0x1f,   0x3c,   0x47,   0xd0,   0x90,   0xa2,
+    0x51,   0x14,   0x27,   0x9f,   0x1f,   0x41,   0x8c,   0xf0,
+    0x82,   0x22,   0x11,   0x1f,   0x24,   0x80,   0x4,    0xf1,
+    0xe3,   0xe7,   0xcf,   0x9f,   0x2,    0x78,   0xf1,   0xe1,
+    0x4,    0x14,   0x14,   0x5f,   0x9f,   0xa6,   0x78,   0xf1,
+    0xe3,   0xc7,   0x84,   0x10,   0x71,   0x19,   0xf2,   0x3c,
+    0x79,   0xa,    0x17,   0xde,   0x83,   0xff,   0x0,    0x0,
+    0x1,    0x0,    0x0,    0x2,    0x80,   0x0,    0x40,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x80,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0xc0,   0xc0,   0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x40,   0x4,    0x80,   0x0,    0x0,
+    0x0,    0x10,   0x1,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x2,    0x0,    0x15,   0x0,    0x38,   0x0,    0x0,    0x0,
+    0x0,    0x0,    0xc,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x3,    0xff,   0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x80,   0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x1,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x7,    0x80,   0x3,    0x0,    0x0,    0x0,    0x0,    0x10,
+    0x1,    0x0,    0x0,    0x0,    0x0,    0x0,    0x2,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x8,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x3,    0xff,
+};
 
 const uint16 SYSTEMEU_OFFSETS[] = {
     0x0,     0x5,     0xA,     0x10,    0x18,    0x1F,    0x26,    0x26,
@@ -91,7 +326,80 @@ const uint16 SYSTEMEU_OFFSETS[] = {
     0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
     0x232,   0x232,   0x237,
 };
-const byte   SYSTEMEU_DATA[] = {0};
+const byte   SYSTEMEU_DATA[] = {
+    0x3,    0x36,   0x6c,   0x10,   0x1,    0x8d,   0x80,   0x0,
+    0x0,    0x1,    0xc6,   0x79,   0xe0,   0x9f,   0x1d,   0xf3,
+    0x8e,   0x0,    0x3,    0x8e,   0x11,   0xe3,   0xde,   0x7d,
+    0xf3,   0xdb,   0x78,   0xec,   0xb0,   0xc6,   0x99,   0xcf,
+    0x1c,   0xf1,   0xef,   0x6d,   0xb6,   0x34,   0x51,   0x7d,
+    0xe0,   0x3c,   0x40,   0x6,    0x38,   0x0,    0xce,   0x45,
+    0x81,   0x0,    0x39,   0x16,   0x11,   0x39,   0x86,   0xc4,
+    0xc,    0x0,    0xf0,   0x0,    0x0,    0xe0,   0x11,   0x45,
+    0x10,   0xc6,   0x0,    0x0,    0x3e,   0x0,    0x19,   0x98,
+    0x7,    0xb6,   0xfe,   0x7d,   0x89,   0x98,   0xc2,   0x0,
+    0x0,    0xb,    0x6e,   0xc,    0x31,   0x98,   0x30,   0x36,
+    0xdb,   0x60,   0x6,    0xd3,   0x39,   0xb6,   0x1b,   0x61,
+    0x86,   0x1b,   0x30,   0x6d,   0xb0,   0xee,   0xdb,   0x6d,
+    0xb6,   0xdb,   0x6,    0x6d,   0xb6,   0x36,   0xd1,   0xd,
+    0x88,   0xc,    0xe0,   0x6,    0x65,   0x10,   0x11,   0x0,
+    0x1,    0x0,    0x44,   0x0,    0x0,    0x44,   0x1,    0x4,
+    0x0,    0x1,    0xe3,   0x91,   0x61,   0x16,   0x0,    0x10,
+    0x0,    0x0,    0x18,   0x6f,   0x0,    0x67,   0x24,   0xc,
+    0x7,    0xb6,   0x6c,   0xd1,   0x93,   0x30,   0x62,   0x0,
+    0x0,    0x12,   0x66,   0xc,    0x33,   0x98,   0x60,   0x36,
+    0xdb,   0x6d,   0xf0,   0xd7,   0x6d,   0xb6,   0x1b,   0x61,
+    0x86,   0x1b,   0x30,   0x6f,   0x30,   0xfe,   0xfb,   0x6d,
+    0xb6,   0xdb,   0x6,    0x6d,   0xb6,   0x33,   0x9b,   0x19,
+    0x8c,   0xd,    0xb0,   0x3,    0x60,   0x3,    0x8e,   0x38,
+    0xe3,   0x8e,   0x38,   0xe3,   0x8e,   0x38,   0xe3,   0x80,
+    0x7c,   0xfb,   0x64,   0x40,   0x0,    0x0,    0x1b,   0x39,
+    0xb3,   0x9c,   0x0,    0x0,    0x26,   0xa4,   0xb9,   0xc,
+    0x3,    0x0,    0x6c,   0x78,   0x20,   0x30,   0x6f,   0x83,
+    0xe0,   0x22,   0xa6,   0x18,   0xe6,   0x9e,   0x78,   0x63,
+    0x8f,   0xc,    0x1,    0x97,   0x6d,   0xe6,   0x1b,   0x79,
+    0xe6,   0xdf,   0x30,   0x6e,   0x30,   0xd6,   0xfb,   0x6f,
+    0x36,   0xf1,   0xc6,   0x6d,   0xb6,   0xb1,   0xe,    0x31,
+    0x86,   0xd,    0x10,   0x0,    0x61,   0xb6,   0xc3,   0xc,
+    0x30,   0xd0,   0x6d,   0xb6,   0xc6,   0x18,   0x66,   0xce,
+    0x30,   0x23,   0xf3,   0x8e,   0x39,   0xb6,   0xdb,   0x6d,
+    0xb0,   0xcc,   0x73,   0x6f,   0x36,   0xa4,   0xa5,   0x61,
+    0x3,    0x0,    0xfe,   0x14,   0x40,   0x30,   0x62,   0x0,
+    0x0,    0x43,   0x26,   0x30,   0x37,   0xc3,   0x6c,   0xc6,
+    0xc3,   0x61,   0xf3,   0x17,   0x7d,   0xb6,   0x1b,   0x61,
+    0x86,   0x5b,   0x30,   0x6f,   0x30,   0xc6,   0xdb,   0x6c,
+    0x36,   0xe0,   0x66,   0x6d,   0xb7,   0xf3,   0x84,   0x61,
+    0x83,   0xc,    0x0,    0x0,    0x65,   0xb7,   0xcf,   0x3c,
+    0xf3,   0xd0,   0x7d,   0xf7,   0xc6,   0x18,   0x66,   0xdb,
+    0x38,   0xfb,   0x66,   0xdb,   0x6d,   0xb6,   0xdb,   0x6d,
+    0xb3,   0xcc,   0xdb,   0x6d,   0xbe,   0x73,   0x38,   0xc6,
+    0x0,    0x0,    0x6c,   0xf8,   0x98,   0x18,   0xc2,   0x18,
+    0x6,    0x83,   0x66,   0x60,   0x30,   0x83,   0x6d,   0x86,
+    0xc3,   0x6c,   0x0,    0x10,   0x6d,   0xb6,   0x1b,   0x61,
+    0x86,   0x5b,   0x30,   0x6d,   0xb0,   0xc6,   0xdb,   0x6c,
+    0x3c,   0xf0,   0x66,   0x6c,   0xe7,   0x76,   0xc4,   0x61,
+    0x81,   0x8c,   0x0,    0x0,    0x39,   0xb6,   0x1b,   0x6d,
+    0xb6,   0xce,   0x61,   0x86,   0x6,    0x18,   0x67,   0xdf,
+    0x31,   0xa3,   0x66,   0xdb,   0x6d,   0xb6,   0xcf,   0x39,
+    0xb6,   0xcc,   0xdb,   0x6d,   0xb6,   0x0,    0x20,   0x3c,
+    0x3,    0x0,    0x0,    0x11,   0x18,   0xd,    0x80,   0x18,
+    0x6,    0x1,    0xcf,   0x7d,   0xe0,   0x9e,   0x39,   0x83,
+    0x8e,   0xc,    0x3,    0xe,    0x6d,   0xe3,   0xde,   0x7d,
+    0x83,   0xdb,   0x7b,   0xcc,   0xbe,   0xc6,   0xc9,   0xcc,
+    0x1a,   0xdb,   0xc6,   0x3c,   0x46,   0x34,   0x44,   0x7d,
+    0xe0,   0xbc,   0x0,    0x0,    0x4,    0xf3,   0xcf,   0x3c,
+    0xf3,   0xc1,   0x3c,   0xf3,   0xcf,   0x3c,   0xf6,   0xdb,
+    0x7c,   0xfb,   0x73,   0x8e,   0x38,   0xf3,   0xc3,   0x10,
+    0xe3,   0xde,   0x71,   0xed,   0xb2,   0xf7,   0xa0,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x30,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x7,    0xe0,   0x78,   0x0,    0x0,    0x0,
+    0x0,    0xe,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xe,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+};
 
 const uint16 SML3X5_OFFSETS[] = {
     0x0,     0x2,     0x4,     0x8,     0x8,     0x8,     0xC,     0xC,
@@ -104,7 +412,31 @@ const uint16 SML3X5_OFFSETS[] = {
     0xC7,    0xCB,    0xCF,    0xD3,    0xD7,    0xDB,    0xDF,    0xE3,
     0xE7,    0xEA,
 };
-const byte   SML3X5_DATA[] = {0};
+const byte   SML3X5_DATA[] = {
+    0x2a,   0xa4,   0xa0,   0x0,    0x1,    0x13,   0x32,   0xbb,
+    0xbb,   0xb8,   0x4,    0x10,   0xc4,   0xc6,   0xce,   0xe7,
+    0x57,   0x3a,   0xa2,   0x2c,   0x4e,   0x66,   0x37,   0x55,
+    0x45,   0x55,   0xdd,   0x1c,   0x81,   0x3,    0x2a,   0x29,
+    0x12,   0x0,    0xa,    0xb0,   0x8a,   0xa2,   0xa,    0xaa,
+    0x49,   0xc9,   0x2a,   0xa8,   0xa8,   0x88,   0x52,   0x12,
+    0xa3,   0x6a,   0xaa,   0x95,   0x42,   0x55,   0x45,   0x54,
+    0x50,   0x85,   0x40,   0x94,   0x20,   0x41,   0x17,   0xe,
+    0x12,   0x91,   0x13,   0xbb,   0x93,   0xb8,   0x10,   0x4,
+    0x4e,   0xc8,   0xae,   0xeb,   0x72,   0x13,   0x22,   0xaa,
+    0xae,   0x96,   0x22,   0x55,   0x54,   0x88,   0x90,   0x84,
+    0x0,    0x6,    0x0,    0x81,   0x12,   0x0,    0x12,   0x92,
+    0x8,    0x8a,   0xa2,   0x8a,   0x49,   0xc8,   0xa,    0xa8,
+    0xa8,   0x89,   0x52,   0x12,   0xa2,   0x2a,   0xa8,   0xa5,
+    0x12,   0x55,   0x55,   0x49,   0x10,   0x84,   0x0,    0x6,
+    0x20,   0xa0,   0xa0,   0x20,   0x11,   0x3b,   0xb0,   0xbb,
+    0xa3,   0x88,   0x84,   0x10,   0x4a,   0xc6,   0xce,   0x86,
+    0x57,   0x72,   0xba,   0x2a,   0x48,   0x55,   0x62,   0x72,
+    0x29,   0x49,   0xdc,   0x5c,   0x0,    0x6,    0x0,    0x0,
+    0x0,    0x40,   0xa0,   0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x1c,   0x6,
+};
 
 const uint16 NAPLES12_OFFSETS[] = {
     0x0,     0x6,     0xB,     0x14,    0x1D,    0x25,    0x31,    0x3B,
@@ -120,7 +452,200 @@ const uint16 NAPLES12_OFFSETS[] = {
     0x2AF,   0x2B8,   0x2C0,   0x2C7,   0x2CE,   0x2D4,   0x2DE,   0x2E7,
     0x2F5,   0x2FF,   0x308,   0x310,   0x317,   0x31C,   0x323,   0x32C,
 };
-const byte   NAPLES12_DATA[] = {0};
+const byte   NAPLES12_DATA[] = {
+    0x0,    0x0,    0x0,    0x0,    0x80,   0x0,    0x0,    0x0,
+    0x33,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x38,   0x10,   0x0,    0x4,    0x0,    0x80,   0x20,
+    0x0,    0x0,    0x38,   0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x10,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x7,
+    0x80,   0x0,    0x70,   0x1,    0xe0,   0xf,    0x0,    0x0,
+    0x78,   0x38,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x3,    0x1b,
+    0x1,    0x23,   0xe3,   0x3,    0x38,   0x18,   0x61,   0x80,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x1,    0xe0,   0xc1,
+    0xf1,   0xe0,   0x19,   0xf8,   0x71,   0xfc,   0xf0,   0xf0,
+    0x0,    0x0,    0x0,    0x0,    0xf0,   0x3f,   0x0,    0x4c,
+    0x7e,   0x1f,   0x1f,   0xc3,   0xfc,   0xff,   0x3f,   0x1c,
+    0x61,   0xe1,   0xe3,   0x86,   0x1f,   0x1c,   0x1c,   0x70,
+    0x63,   0xc3,   0xf8,   0x78,   0x7f,   0x7,    0xe7,   0xfb,
+    0xc,    0x61,   0x18,   0x8,    0xc0,   0x66,   0x33,   0xfb,
+    0xc8,   0xf,    0x0,    0x0,    0x0,    0xc,    0x0,    0x0,
+    0xc0,   0x3,    0x0,    0x18,   0x2,    0x4,    0xc0,   0x60,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x39,   0xe,    0x0,    0x2,    0x3,    0x1b,   0x1,    0x26,
+    0xb4,   0x86,   0x64,   0x18,   0xc0,   0xc1,   0x0,    0x0,
+    0x0,    0x0,    0x0,    0xf,    0x33,   0xc3,   0x1b,   0x30,
+    0x39,   0x98,   0xc1,   0x8d,   0x99,   0x98,   0x0,    0x0,
+    0x0,    0x1,    0x98,   0x40,   0x80,   0xc,    0xb3,   0x30,
+    0xac,   0x65,   0x85,   0x61,   0x61,   0x2c,   0x62,   0x62,
+    0x65,   0x8c,   0x30,   0x2c,   0x18,   0xb0,   0xc4,   0x65,
+    0x8c,   0xcc,   0xb1,   0x8c,   0x28,   0xc7,   0xc,    0xe3,
+    0xb8,   0x1d,   0x60,   0xce,   0x34,   0x1b,   0xc,    0x3,
+    0x4,    0x0,    0x0,    0xc,    0x0,    0x0,    0xc0,   0x3,
+    0x0,    0x18,   0x4,    0x8,    0xc0,   0x60,   0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x80,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x61,   0x3,
+    0x0,    0x0,    0x3,    0x1b,   0x7,    0xf6,   0xb4,   0x8c,
+    0x64,   0x18,   0xc0,   0xc5,   0x40,   0x40,   0x0,    0x0,
+    0x0,    0x1b,   0x30,   0xc3,   0x1b,   0x30,   0x79,   0x81,
+    0x80,   0x19,   0x99,   0x98,   0x0,    0xc,    0x0,    0xc1,
+    0x98,   0x8e,   0x40,   0x1c,   0xb3,   0x30,   0xac,   0x35,
+    0x81,   0x60,   0xc2,   0x2c,   0x62,   0x62,   0x65,   0x98,
+    0x30,   0x2e,   0x38,   0xb8,   0xcc,   0x35,   0x8d,   0x86,
+    0xb1,   0x8e,   0x48,   0xc3,   0xc,    0x61,   0x98,   0xd,
+    0x31,   0x86,   0x34,   0x33,   0x4,    0x3,    0xe,    0x0,
+    0x0,    0xc,    0x0,    0x0,    0xc0,   0x3,    0x0,    0x18,
+    0x0,    0x0,    0xc0,   0x60,   0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x1,    0x80,   0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x61,   0x3,    0xc,    0x0,
+    0x3,    0x0,    0x2,    0x46,   0x83,   0x18,   0x64,   0x0,
+    0xc0,   0xc3,   0x80,   0x40,   0x0,    0x0,    0x0,    0x33,
+    0x30,   0xc0,   0x18,   0x30,   0xd9,   0x81,   0x80,   0x19,
+    0x99,   0x98,   0x0,    0x18,   0x0,    0x60,   0x18,   0x92,
+    0x40,   0x3c,   0x33,   0x31,   0xc,    0x31,   0x80,   0x60,
+    0xc0,   0xc,    0x60,   0x60,   0x61,   0xb0,   0x30,   0xe,
+    0x38,   0x38,   0xcc,   0x31,   0x8d,   0x86,   0x31,   0x87,
+    0x0,    0xc3,   0xc,    0x61,   0x98,   0xc,    0x1b,   0x6,
+    0x30,   0x63,   0x6,    0x3,    0x1b,   0x0,    0xf,    0xcd,
+    0xc7,   0xcf,   0xc3,   0xe7,   0xcf,   0xd9,   0xc6,   0xc,
+    0xd8,   0x61,   0x9c,   0xe3,   0x38,   0xf8,   0xdc,   0x7e,
+    0x6c,   0xf3,   0xf6,   0x31,   0x8c,   0xc6,   0x33,   0x8,
+    0xc6,   0x7e,   0x61,   0x3,    0x12,   0x49,   0x3,    0x0,
+    0x2,    0x43,   0xe0,   0x30,   0x38,   0x0,    0xc0,   0xce,
+    0xe3,   0xf8,   0xf,    0xe0,   0x0,    0x63,   0x30,   0xc0,
+    0x30,   0xe1,   0x99,   0xf1,   0xf0,   0x30,   0xf1,   0x99,
+    0x8c,   0x30,   0xfc,   0x30,   0x30,   0x92,   0x40,   0x6c,
+    0x3e,   0x30,   0xc,    0x31,   0xf0,   0x7c,   0xcf,   0x1f,
+    0xe0,   0x60,   0x61,   0xe0,   0x30,   0xe,    0x38,   0x34,
+    0xcc,   0x31,   0x8d,   0x86,   0x31,   0x83,   0x80,   0xc3,
+    0xc,    0x61,   0x98,   0xc,    0xe,    0x6,    0x30,   0xc3,
+    0x2,    0x3,    0x31,   0x80,   0x18,   0xce,   0x6c,   0x58,
+    0xc6,   0x23,   0x18,   0xda,   0xce,   0x1c,   0xe4,   0x63,
+    0xad,   0x67,   0x59,   0x8d,   0xe6,   0xc6,   0xfd,   0x99,
+    0x8e,   0x33,   0x8d,   0xc6,   0x35,   0x91,   0xc6,   0x86,
+    0x61,   0x3,    0x1,    0x8c,   0x3,    0x0,    0xf,    0xe0,
+    0xb0,   0x60,   0x38,   0x40,   0xc0,   0xc3,   0x80,   0x40,
+    0x0,    0x0,    0x0,    0xc3,   0x30,   0xc0,   0x60,   0x33,
+    0x18,   0x19,   0x98,   0x31,   0x98,   0xf9,   0x8c,   0x60,
+    0x0,    0x18,   0x60,   0x92,   0x40,   0xcc,   0x31,   0xb0,
+    0xc,    0x31,   0x80,   0x60,   0xc3,   0x2c,   0x60,   0x60,
+    0x61,   0xc0,   0x30,   0xd,    0x58,   0x32,   0xcc,   0x31,
+    0xf1,   0x86,   0x3f,   0x1,    0xc0,   0xc3,   0xc,    0x63,
+    0x18,   0xc,    0xe,    0x6,    0x31,   0x83,   0x3,    0x3,
+    0x0,    0x0,    0x18,   0xcc,   0x6c,   0x18,   0xc6,   0x43,
+    0x18,   0xdc,   0xc6,   0x2c,   0xc4,   0x61,   0xce,   0x63,
+    0x99,   0x8c,   0xc6,   0xc6,   0x61,   0x81,   0x86,   0x31,
+    0x8c,   0xc6,   0x30,   0xe0,   0xc6,   0xc,    0xc1,   0x1,
+    0x80,   0x3,    0x3,    0x0,    0x4,    0x86,   0xb0,   0xc6,
+    0x64,   0x80,   0xc0,   0xc5,   0x40,   0x40,   0x0,    0x0,
+    0x1,    0x83,   0x30,   0xc0,   0xc0,   0x33,   0xfc,   0x19,
+    0x98,   0x61,   0x98,   0x18,   0x0,    0x30,   0xfc,   0x30,
+    0x60,   0x8f,   0x8f,   0xfc,   0x31,   0xb0,   0xc,    0x31,
+    0x80,   0x60,   0xc3,   0xc,    0x60,   0x60,   0x61,   0xe0,
+    0x30,   0xd,    0x58,   0x31,   0xcc,   0x31,   0x81,   0x86,
+    0x36,   0x0,    0xe0,   0xc3,   0x1c,   0x66,   0x19,   0x98,
+    0x1b,   0x6,    0x73,   0x3,    0x1,    0x3,    0x0,    0x0,
+    0x18,   0xcc,   0x6c,   0x18,   0xc6,   0x83,   0x18,   0xd8,
+    0xc6,   0xc,    0xf8,   0x61,   0x8c,   0x63,   0x19,   0x8c,
+    0xc6,   0xc6,   0x60,   0xf1,   0x86,   0x31,   0x8c,   0xce,
+    0x30,   0x60,   0xc6,   0x18,   0xc1,   0x1,    0x80,   0xd,
+    0x3,    0x0,    0x4,    0x86,   0xb1,   0x89,   0x63,   0x0,
+    0xc0,   0xc1,   0x0,    0x0,    0x0,    0x0,    0x3,    0x3,
+    0x30,   0xc1,   0x83,   0x30,   0x19,   0x99,   0x98,   0x61,
+    0x98,   0x18,   0x0,    0x18,   0x0,    0x60,   0x0,    0x40,
+    0x13,   0xc,    0x31,   0xb0,   0x8c,   0x31,   0x82,   0x60,
+    0xc7,   0x4c,   0x64,   0x64,   0x61,   0xb0,   0xb0,   0x4c,
+    0x99,   0x31,   0xcc,   0x21,   0x81,   0x86,   0x33,   0x18,
+    0x60,   0xc3,   0x2d,   0x6c,   0x1b,   0xb0,   0x31,   0x96,
+    0xb6,   0x7,    0x1,    0x83,   0x0,    0x0,    0x19,   0xdc,
+    0x6c,   0x59,   0xcf,   0x13,   0x19,   0xd8,   0xd6,   0x4c,
+    0xd8,   0xe5,   0x8c,   0x6b,   0x1b,   0x8c,   0xc6,   0xce,
+    0x60,   0x19,   0x96,   0x75,   0x98,   0xd6,   0x60,   0xb0,
+    0xce,   0x30,   0x61,   0x3,    0x0,    0x7,    0x0,    0x0,
+    0x0,    0x3,    0xe3,   0x9,    0x63,   0x0,    0xc0,   0xc0,
+    0x0,    0x1,    0x80,   0x6,    0x6,    0x3,    0x30,   0xc3,
+    0x1b,   0x30,   0x19,   0x99,   0x98,   0xc1,   0x98,   0x31,
+    0x8c,   0xc,    0x0,    0xc0,   0x60,   0x3e,   0x6,    0xc,
+    0x31,   0xb1,   0xc,    0x21,   0x84,   0x60,   0xcb,   0x8c,
+    0x68,   0x68,   0x61,   0x99,   0x30,   0x8c,   0x9a,   0x30,
+    0xc4,   0x41,   0x80,   0xdc,   0x31,   0xac,   0x60,   0xc3,
+    0x4e,   0x78,   0x1c,   0xe0,   0x60,   0xd3,   0x36,   0xb,
+    0x0,    0x83,   0x0,    0x0,    0x1a,   0xec,   0xcc,   0x9a,
+    0xd6,   0x23,   0x1a,   0xd8,   0xe6,   0x8c,   0xcd,   0x69,
+    0x8c,   0x73,   0x1d,   0x98,   0xcc,   0xd6,   0x61,   0x19,
+    0xa6,   0xb9,   0xb0,   0xe6,   0xc1,   0x1a,   0xd6,   0x61,
+    0x61,   0x3,    0x0,    0x8,    0x3,    0x0,    0x0,    0x0,
+    0x86,   0x6,    0x3c,   0xc0,   0x61,   0x80,   0x0,    0x1,
+    0x80,   0x6,    0xc,    0x1,    0xe3,   0xf3,   0xf9,   0xe0,
+    0x18,   0xf0,   0xf0,   0xc0,   0xf0,   0xe1,   0x8c,   0x0,
+    0x0,    0x0,    0x60,   0x0,    0x1c,   0x7,    0xff,   0x1e,
+    0x3f,   0xc7,   0xf9,   0xc0,   0x73,   0x38,   0x70,   0x70,
+    0x67,   0xe,    0x7f,   0x38,   0x1c,   0xe0,   0xc3,   0x83,
+    0xe0,   0x78,   0xe0,   0xcf,   0xc3,   0x81,   0x8c,   0x70,
+    0x18,   0xc0,   0xc0,   0x60,   0x37,   0xf3,   0x0,    0xc3,
+    0x0,    0x3f,   0xcc,   0xcf,   0x87,   0xc,    0xe3,   0xc3,
+    0xc,    0xd8,   0xc7,   0xc,    0xc6,   0x71,   0x8c,   0x63,
+    0x18,   0xf0,   0xf8,   0x66,   0x61,   0xf1,   0xc3,   0x30,
+    0xe0,   0xc3,   0x82,   0xc,    0x66,   0xfe,   0x61,   0x3,
+    0x0,    0xc,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x33,   0x0,    0x0,    0x0,    0x80,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x4,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x60,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xd,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x30,   0x3,    0x0,    0x43,   0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x3,    0x0,    0xc0,
+    0x0,    0xc,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0xc0,   0x6,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x6,    0x0,    0x61,   0x3,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x1,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x60,   0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x6,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x30,   0x3,    0xc0,   0xf,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x3,    0x0,    0xc0,   0x0,    0xc,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xc0,   0x6,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x6,    0x0,    0x39,   0xe,    0x0,    0x1,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x60,   0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x30,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x3,    0x0,    0xc0,   0x0,    0xc,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0xc0,   0x7,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x6,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x3,
+    0xc0,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x7,    0xe0,   0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xe,
+    0x7,    0x80,   0x0,    0x38,   0x0,    0x0,    0x0,    0x0,
+    0x0,    0x1,    0x80,   0x6,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x7c,   0x0,    0x0,    0x0,
+    0x0,    0x0,
+};
 
 const uint16 GOTHICEU_OFFSETS[] = {
     0x0,     0x5,     0x8,     0xF,     0x16,    0x1D,    0x27,    0x2F,
@@ -150,7 +675,240 @@ const uint16 GOTHICEU_OFFSETS[] = {
     0x379,   0x379,   0x37F,   0x385,   0x385,   0x385,   0x38E,   0x395,
     0x395,   0x395,   0x395,   0x395,   0x39C,
 };
-const byte   GOTHICEU_DATA[] = {0};
+const byte   GOTHICEU_DATA[] = {
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x4,    0x80,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x1c,   0x0,    0xe0,   0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x2,    0x48,   0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x22,   0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0xf,    0x80,   0x0,    0x0,
+    0x0,    0x0,    0x0,    0xf,    0x4,    0x0,    0xa0,   0x80,
+    0x10,   0x60,   0x8,    0x40,   0x0,    0x0,    0x0,    0x0,
+    0x10,   0xc2,   0x38,   0x70,   0x11,   0xf0,   0x47,   0xc7,
+    0x4,    0x0,    0x2,    0x0,    0x40,   0x10,   0x38,   0x10,
+    0xe0,   0x63,   0x87,   0x9e,   0x1c,   0x89,   0x4,    0x91,
+    0x8,    0x91,   0xc,    0x38,   0x18,   0x78,   0x63,   0xe4,
+    0x48,   0x91,   0x12,   0x24,   0x4f,   0x90,   0x80,   0x20,
+    0x80,   0x0,    0x80,   0x10,   0x0,    0x4,    0x0,    0x60,
+    0x10,   0x44,   0x81,   0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,    0x4,
+    0x44,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x1c,   0x0,
+    0x18,   0x0,    0xf0,   0x0,    0x0,    0x1,    0xc0,   0x0,
+    0x0,    0x21,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x71,   0xe0,   0x0,    0x0,    0xef,
+    0x4,    0x48,   0xa1,   0xc2,   0x20,   0x90,   0x88,   0x40,
+    0x0,    0x0,    0x0,    0x0,    0x11,   0x22,   0x44,   0x88,
+    0x31,   0x0,    0x80,   0x48,   0x8a,   0x0,    0x4,    0x0,
+    0x20,   0x28,   0x44,   0x10,   0x90,   0x92,   0x44,   0x10,
+    0x20,   0x89,   0x4,    0xa1,   0xd,    0x99,   0x12,   0x24,
+    0x24,   0x44,   0x90,   0x84,   0x48,   0x91,   0x12,   0x22,
+    0x80,   0x90,   0x80,   0x21,   0x40,   0x0,    0x40,   0x10,
+    0x0,    0x4,    0x0,    0x80,   0x10,   0x44,   0x81,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x8,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x8,    0x42,   0x0,    0x0,    0x44,
+    0x18,   0xe2,   0x26,   0x2,    0x0,    0x1c,   0x44,   0xc0,
+    0x0,    0x0,    0x8,    0x0,    0x0,    0x0,    0xa1,   0xe2,
+    0x13,   0x2,    0x26,   0x8,    0x80,   0x0,    0x8,    0x9c,
+    0x3,    0x0,    0x18,   0x33,   0x88,   0x80,   0x0,    0x49,
+    0x20,   0x0,    0x1,    0xf,    0x4,    0x49,   0xf2,   0x85,
+    0x20,   0x90,   0x90,   0x20,   0x80,   0x0,    0x0,    0x0,
+    0x21,   0x22,   0x4,    0x10,   0x31,   0xc1,   0x0,    0x85,
+    0x11,   0x0,    0x8,    0x0,    0x10,   0x44,   0x44,   0x10,
+    0xe1,   0x2,    0x47,   0x9e,   0x4c,   0xf9,   0x4,    0xc1,
+    0xa,    0x95,   0x12,   0x22,   0x24,   0x78,   0x80,   0x84,
+    0x48,   0x91,   0x11,   0x41,   0x1,    0x10,   0x40,   0x22,
+    0x20,   0x0,    0x0,    0x10,   0x0,    0x4,    0x1,    0xc0,
+    0x90,   0x0,    0x91,   0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,    0x8,
+    0x42,   0x0,    0x0,    0x0,    0x1,    0x10,   0x0,    0x2,
+    0x0,    0x22,   0x0,    0x1,    0x11,   0xc6,   0x8,    0x10,
+    0xf8,   0x0,    0xa2,   0x10,   0x0,    0x0,    0x0,    0x0,
+    0x11,   0x21,   0x8,    0x92,   0x0,    0x18,   0x0,    0x0,
+    0xc,    0x80,   0x0,    0x49,   0x0,    0x0,    0x0,    0x8f,
+    0x4,    0x90,   0xa2,   0x82,   0x40,   0x61,   0x10,   0x24,
+    0x90,   0x40,   0x0,    0x0,    0x22,   0x12,   0x8,    0x20,
+    0x50,   0x21,   0x80,   0x82,   0x11,   0x0,    0x10,   0x0,
+    0x8,    0x44,   0x82,   0x38,   0x91,   0x2,    0x24,   0x10,
+    0x44,   0x89,   0x4,    0xa1,   0x8,    0x93,   0x21,   0x22,
+    0x42,   0x50,   0x40,   0x84,   0x48,   0x8a,   0xa1,   0xc1,
+    0x1,    0x10,   0x40,   0x24,   0x10,   0x0,    0x7,    0x1c,
+    0xc,    0x1c,   0x30,   0x83,   0x1c,   0x44,   0xa1,   0x3f,
+    0x1c,   0x18,   0x70,   0x39,   0x63,   0x1c,   0x89,   0x12,
+    0x49,   0x12,   0x27,   0x88,   0x42,   0x19,   0xc,    0x44,
+    0x30,   0xe1,   0xc3,   0x87,   0x6,    0xc,    0x18,   0x30,
+    0x2,    0x20,   0x1c,   0x10,   0x40,   0x1,    0x20,   0xc0,
+    0xc0,   0xc2,   0x24,   0x48,   0x84,   0x21,   0x8,    0x92,
+    0xe,    0x0,    0x61,   0x13,   0x8a,   0x80,   0x0,    0x71,
+    0x1,    0xf9,   0x11,   0x8f,   0x4,    0x0,    0xa1,   0x80,
+    0x40,   0x90,   0x10,   0x22,   0xa0,   0x40,   0x0,    0x0,
+    0x42,   0x12,   0x8,    0x10,   0x50,   0x13,   0x41,   0x5,
+    0x11,   0x0,    0x20,   0x0,    0x4,    0x44,   0x9a,   0x28,
+    0x89,   0x2,    0x24,   0x10,   0x44,   0x89,   0x4,    0xa1,
+    0x8,    0x91,   0x21,   0x22,   0x42,   0x50,   0x40,   0x84,
+    0x45,   0xa,    0xa0,   0x81,   0x2,    0x10,   0x20,   0x20,
+    0x0,    0x0,    0x0,    0x92,   0x12,   0x24,   0x48,   0x85,
+    0x12,   0x44,   0xc1,   0x24,   0x92,   0x24,   0x48,   0x49,
+    0x84,   0x8,    0x89,   0x12,   0x49,   0x12,   0x20,   0x88,
+    0x42,   0x26,   0x12,   0x44,   0x48,   0x10,   0x20,   0x40,
+    0x89,   0x12,   0x24,   0x48,   0x40,   0x81,   0x14,   0x0,
+    0x41,   0xf1,   0x21,   0x21,   0x21,   0x22,   0x24,   0x48,
+    0x8a,   0x21,   0x5,    0x12,   0x1,    0x20,   0x91,   0x12,
+    0x49,   0x8e,   0x3c,   0x49,   0x2,    0x41,   0x12,   0x40,
+    0x4,    0x1,    0xf0,   0xc0,   0x81,   0x8,    0x10,   0x21,
+    0xc0,   0x40,   0x0,    0x0,    0x42,   0x12,   0x10,   0x8,
+    0x90,   0x12,   0x21,   0x8,    0x91,   0x20,   0x40,   0x7e,
+    0x2,    0x8,    0xa6,   0x28,   0x89,   0x2,    0x24,   0x10,
+    0x44,   0x89,   0x4,    0xa1,   0x8,    0x91,   0x21,   0x22,
+    0x42,   0x48,   0x20,   0x84,   0x45,   0xa,    0xa1,   0xc1,
+    0x2,    0x10,   0x20,   0x20,   0x0,    0x0,    0x1,    0x91,
+    0x20,   0x44,   0x88,   0x88,   0x92,   0x44,   0xa1,   0x24,
+    0x92,   0x42,   0x44,   0x89,   0x4,    0x8,    0x89,   0x12,
+    0xa8,   0xa2,   0x21,   0x10,   0x41,   0x0,    0x20,   0x44,
+    0x88,   0x30,   0x60,   0xc1,   0x90,   0x22,   0x44,   0x88,
+    0x40,   0x81,   0x14,   0x38,   0x40,   0x41,   0xf2,   0x12,
+    0x12,   0x12,   0x24,   0x48,   0x91,   0x21,   0x5,    0x1f,
+    0x3,    0x21,   0x9,    0x12,   0x48,   0x92,   0x22,   0x49,
+    0x4,    0x21,   0x14,   0x2f,   0x4,    0x0,    0xa0,   0xa0,
+    0x81,   0x8,    0x10,   0x21,   0xc3,   0xf8,   0x1f,   0x80,
+    0x82,   0x12,   0x20,   0x8,    0x90,   0x12,   0x21,   0x8,
+    0x89,   0x22,   0x20,   0x0,    0x4,    0x10,   0xa6,   0x28,
+    0x89,   0x2,    0x24,   0x10,   0x44,   0x89,   0x4,    0x91,
+    0x8,    0x91,   0x21,   0x22,   0x42,   0x48,   0x20,   0x84,
+    0x45,   0xc,    0x61,   0x41,   0x2,    0x10,   0x10,   0x20,
+    0x0,    0x0,    0x2,    0x91,   0x20,   0x44,   0x90,   0x88,
+    0x92,   0x44,   0xa1,   0x24,   0x92,   0x42,   0x44,   0x89,
+    0x2,    0x8,    0x88,   0xa1,   0x10,   0x41,   0x41,   0x8,
+    0x42,   0x0,    0x20,   0x44,   0x90,   0x50,   0xa1,   0x42,
+    0x90,   0x24,   0x48,   0x90,   0x40,   0x81,   0x14,   0x28,
+    0x70,   0x41,   0x22,   0x12,   0x12,   0x12,   0x24,   0x45,
+    0x11,   0x21,   0x2,    0x11,   0x5,    0x21,   0x9,    0x12,
+    0x48,   0x92,   0x22,   0x71,   0x4,    0x21,   0x14,   0x20,
+    0x4,    0x0,    0xa0,   0xa1,   0x11,   0x8,    0x10,   0x22,
+    0xa0,   0x40,   0x0,    0x0,    0x82,   0x12,   0x20,   0x9,
+    0x10,   0x12,   0x22,   0x8,    0x86,   0x2,    0x10,   0x0,
+    0x8,    0x10,   0x9c,   0x7c,   0x89,   0x2,    0x24,   0x10,
+    0x44,   0x89,   0x4,    0x91,   0x8,    0x91,   0x21,   0x24,
+    0x42,   0x48,   0x10,   0x84,   0x45,   0xc,    0x61,   0x41,
+    0x4,    0x10,   0x10,   0x20,   0x0,    0x0,    0x4,    0x91,
+    0x20,   0x44,   0xa0,   0x85,   0x12,   0x44,   0x91,   0x24,
+    0x92,   0x42,   0x44,   0x89,   0x1,    0x8,    0x88,   0xa1,
+    0x10,   0xa1,   0x42,   0x8,    0x42,   0x0,    0x20,   0x44,
+    0xa0,   0x91,   0x22,   0x44,   0x90,   0x28,   0x50,   0xa0,
+    0x40,   0x81,   0x3e,   0x28,   0x40,   0xf3,   0x22,   0x12,
+    0x12,   0x12,   0x24,   0x45,   0x11,   0x21,   0x7,    0x11,
+    0x9,    0x21,   0x9,    0x12,   0x48,   0x92,   0x22,   0x41,
+    0x4,    0x21,   0x14,   0x2f,   0x0,    0x0,    0x0,    0xa1,
+    0x29,   0x10,   0x10,   0x24,   0x90,   0x40,   0x0,    0x1,
+    0x1,    0x22,   0x40,   0x9,    0xf8,   0x12,   0x22,   0x8,
+    0x82,   0x0,    0x8,    0x7e,   0x10,   0x0,    0x40,   0x44,
+    0x89,   0x2,    0x44,   0x10,   0x44,   0x89,   0x4,    0x91,
+    0x8,    0x91,   0x12,   0x38,   0x2c,   0x44,   0x10,   0x84,
+    0x42,   0x4,    0x42,   0x21,   0x4,    0x10,   0x8,    0x20,
+    0x0,    0x0,    0x8,    0x91,   0x20,   0x44,   0xc0,   0x82,
+    0x12,   0x44,   0x91,   0x24,   0x92,   0x42,   0x44,   0x89,
+    0x0,    0x88,   0x88,   0xa1,   0x10,   0xa1,   0x42,   0x8,
+    0x42,   0x0,    0x20,   0x44,   0xc1,   0x12,   0x24,   0x48,
+    0x90,   0x30,   0x60,   0xc0,   0x40,   0x81,   0x22,   0x7c,
+    0x41,   0x42,   0x22,   0x12,   0x12,   0x12,   0x24,   0x45,
+    0x11,   0x21,   0x2,    0x13,   0x91,   0x21,   0x9,    0x12,
+    0x48,   0x8f,   0x1c,   0x41,   0x4,    0x21,   0x14,   0x2f,
+    0x4,    0x0,    0x1,    0xc2,   0x10,   0x80,   0x10,   0x20,
+    0x80,   0x40,   0x0,    0x11,   0x1,    0x22,   0x40,   0x90,
+    0x11,   0x21,   0x42,   0x5,    0x4,    0x20,   0x4,    0x0,
+    0x20,   0x10,   0x44,   0x44,   0x90,   0x92,   0x44,   0x10,
+    0x24,   0x89,   0x8,    0x89,   0x8,    0x91,   0x12,   0x20,
+    0x24,   0x44,   0x90,   0x84,   0x42,   0x4,    0x42,   0x21,
+    0x8,    0x10,   0x8,    0x20,   0x0,    0x0,    0x8,    0x92,
+    0x12,   0x24,   0x88,   0x84,   0x12,   0x44,   0x89,   0x24,
+    0x92,   0x24,   0x48,   0x49,   0x0,    0x88,   0x88,   0x40,
+    0xa1,   0x10,   0x84,   0x8,    0x42,   0x0,    0x12,   0x44,
+    0x89,   0x12,   0x24,   0x48,   0x88,   0x22,   0x44,   0x88,
+    0x40,   0x81,   0x22,   0x44,   0x41,   0x42,   0x21,   0x21,
+    0x21,   0x22,   0x24,   0x42,   0xa,    0x21,   0x7,    0x11,
+    0x11,   0x20,   0x91,   0x12,   0x48,   0x80,   0x0,    0x41,
+    0x2,    0x41,   0x12,   0x4f,   0x4,    0x0,    0x0,    0x82,
+    0x0,    0x70,   0x8,    0x40,   0x0,    0x0,    0x80,   0x12,
+    0x0,    0xc2,   0x7c,   0x60,   0x10,   0xc0,   0x82,   0x2,
+    0x8,    0x22,   0x2,    0x0,    0x40,   0x10,   0x38,   0x44,
+    0xe0,   0x63,   0x87,   0x90,   0x1c,   0x89,   0x30,   0x89,
+    0xc8,   0x91,   0xc,    0x20,   0x1a,   0x44,   0x60,   0x83,
+    0x82,   0x4,    0x42,   0x21,   0xf,    0x90,   0x4,    0x20,
+    0x0,    0x0,    0x7,    0x9c,   0xc,    0x1c,   0x70,   0x84,
+    0x12,   0x44,   0x89,   0x24,   0x92,   0x18,   0x70,   0x39,
+    0x7,    0x8,    0x78,   0x40,   0xa1,   0x10,   0x87,   0x88,
+    0x42,   0x0,    0xc,    0x3c,   0x70,   0xf1,   0xe3,   0xc7,
+    0x86,   0x1c,   0x38,   0x70,   0x40,   0x81,   0x22,   0x44,
+    0xf8,   0xf2,   0x30,   0xc0,   0xc0,   0xc1,   0xe3,   0xc2,
+    0x4,    0x1e,   0x2,    0x11,   0x8f,   0x20,   0x60,   0xf2,
+    0x48,   0x9f,   0x3e,   0x41,   0x1,    0x81,   0xe1,   0x8f,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x8,    0x40,
+    0x0,    0x0,    0x80,   0x2,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x2,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x10,   0x4,    0x20,   0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x2,    0x0,    0x4,    0x0,    0x0,
+    0x0,    0x0,    0x40,   0x8,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x80,   0x4,    0x44,   0x0,    0x4,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x1,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x2,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x1,    0x0,    0xf,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x4,    0x80,   0x0,    0x1,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x4,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x1c,   0x0,    0xe0,
+    0x3,    0xfe,   0x0,    0x0,    0x0,    0x0,    0x0,    0x1,
+    0x0,    0x4,    0x0,    0x0,    0x0,    0x0,    0x40,   0x8,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x80,   0x2,
+    0x48,   0x0,    0x2,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0xe,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x2,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x1,    0x0,    0xf,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x6,    0x0,    0x8,    0x0,    0x0,
+    0x0,    0x0,    0x40,   0x8,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x1,    0x0,    0x0,    0x0,    0x0,    0x1c,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x4,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x2,    0x0,    0xf,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xf,
+};
 
 const uint16 CHALETSE_OFFSETS[] = {
     0x0,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
@@ -184,7 +942,110 @@ const uint16 CHALETSE_OFFSETS[] = {
     0x301,   0x306,   0x30B,   0x313,   0x31A,   0x31A,   0x31A,   0x31A,
     0x31A,   0x31A,   0x31A,   0x321,
 };
-const byte   CHALETSE_DATA[] = {0};
+const byte   CHALETSE_DATA[] = {
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x4,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0xc2,   0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x3,    0x18,   0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0xa0,   0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x3,    0x7f,   0xff,   0x6,    0xd9,
+    0x21,   0xc,    0xe,    0x32,   0x95,   0x0,    0x0,    0x4,
+    0x60,   0x8e,   0x7c,   0x17,   0xc2,   0x7c,   0xe3,   0x80,
+    0x0,    0x1,    0xc3,   0x82,   0x3c,   0x33,   0x8f,   0xbe,
+    0x39,   0x14,   0x28,   0xa0,   0x82,   0x84,   0x71,   0xe1,
+    0x8f,   0x1c,   0xfa,   0x14,   0x50,   0x14,   0x14,   0x17,
+    0xed,   0xd,    0x21,   0x0,    0x80,   0x0,    0x10,   0x3,
+    0x1,    0x3,    0x1a,   0xc,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x1,
+    0x51,   0x47,   0xc0,   0x3,    0x3e,   0x66,   0xc0,   0x20,
+    0x3,    0xe6,   0x6c,   0x1b,   0x39,   0x9b,   0x10,   0x30,
+    0x0,    0xf,    0x0,    0x0,    0x78,   0x2,    0x28,   0xa1,
+    0x6,    0x60,   0x0,    0x0,    0xf9,   0xce,   0x73,   0xc0,
+    0x8,    0x84,   0x7f,   0xff,   0x2,    0xd9,   0x23,   0x92,
+    0x51,   0x34,   0x4a,   0x0,    0x0,    0x4,    0x91,   0x91,
+    0x4,    0x24,   0x4,    0x5,    0x14,   0x40,   0x0,    0x2,
+    0x25,   0x42,   0x22,   0x4a,   0x48,   0x20,   0x45,   0x14,
+    0x29,   0x20,   0xc6,   0xc4,   0x89,   0x12,   0x48,   0xa2,
+    0x22,   0x14,   0x50,   0x12,   0x22,   0x20,   0x29,   0x4,
+    0x0,    0x80,   0x80,   0x0,    0x10,   0x4,    0x1,    0x0,
+    0x2,    0x4,    0x0,    0x0,    0x0,    0x0,    0x0,    0x1,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x2,    0x48,   0x8,
+    0x10,   0x80,   0x41,   0x0,    0x0,    0x21,   0xe4,   0x10,
+    0x0,    0x0,    0x44,   0x4,    0x10,   0x0,    0x3,    0xd0,
+    0xb3,   0x60,   0x85,   0x80,   0x2,    0x0,    0x0,    0x0,
+    0xc1,   0xbe,   0x2,    0x49,   0x4a,   0x40,   0x8,    0x82,
+    0x7f,   0xff,   0x2,    0x4b,   0xf5,   0x52,   0x91,   0x14,
+    0x4a,   0x10,   0x0,    0x9,    0xa,    0x91,   0x8,    0x44,
+    0x8,    0x5,    0x14,   0x5b,   0x10,   0x22,   0x2a,   0xa5,
+    0x22,   0x82,   0x28,   0x20,   0x81,   0x14,   0x2a,   0x20,
+    0xaa,   0xa5,   0x5,    0x14,   0x28,   0xa0,   0x22,   0x14,
+    0x4a,   0x21,   0x41,   0x40,   0x48,   0x84,   0x0,    0x3e,
+    0xf8,   0xf1,   0xf3,   0xce,   0x7d,   0xf3,   0xa,    0x45,
+    0xee,   0x7c,   0x79,   0xf1,   0xf5,   0x99,   0x90,   0xa2,
+    0x88,   0xa1,   0x45,   0xf2,   0x48,   0x8,    0x0,    0x1e,
+    0x3e,   0x3e,   0x7c,   0xfa,   0x3,    0xc3,   0xc7,   0x8c,
+    0x30,   0xca,   0x1,    0xf3,   0xe5,   0x0,    0x0,    0x0,
+    0x0,    0x2,    0x25,   0x21,   0x3e,   0xc0,   0x0,    0x0,
+    0x8a,   0x49,   0x72,   0xf,    0xc8,   0x9e,   0x7f,   0xff,
+    0x2,    0x91,   0x23,   0xd,    0xa,    0x24,   0x55,   0x10,
+    0x3c,   0x9,    0x8,    0x82,   0x10,   0xa7,   0x96,   0x8,
+    0xe3,   0x5b,   0x20,   0x10,   0x4a,   0xa5,   0x3c,   0x82,
+    0x2f,   0xbc,   0x81,   0xf4,   0x2c,   0x20,   0x92,   0x95,
+    0x5,    0x14,   0x28,   0x9c,   0x22,   0x12,   0x8a,   0x20,
+    0x80,   0x80,   0x88,   0x84,   0x0,    0x42,   0x85,   0xa,
+    0x14,   0x24,   0x85,   0x9,    0xa,    0x85,   0x11,   0x42,
+    0x85,   0xa,    0x16,   0x25,   0x10,   0xa2,   0x88,   0x92,
+    0x44,   0x24,   0x4,    0x7,    0xd0,   0xa1,   0x42,   0x42,
+    0x85,   0xa,    0x4,    0x24,   0x28,   0x44,   0x10,   0x4a,
+    0x38,   0x80,   0x85,   0xf,    0x1e,   0x3c,   0x85,   0x9,
+    0x48,   0xa1,   0x42,   0x47,   0x90,   0xbc,   0xc9,   0xe6,
+    0x4a,   0x11,   0x8,    0xa1,   0x7f,   0xff,   0x2,    0x3,
+    0xf1,   0x83,   0x94,   0x84,   0x44,   0x7c,   0x0,    0x11,
+    0x8,    0x84,   0x9,    0xf0,   0x51,   0x9,    0x10,   0x80,
+    0x47,   0x88,   0x89,   0xcf,   0xa2,   0x82,   0x28,   0x20,
+    0x9d,   0x14,   0x2a,   0x20,   0x82,   0x8d,   0x5,    0xe4,
+    0xaf,   0x2,    0x22,   0x12,   0x85,   0x41,   0x40,   0x81,
+    0x8,    0x44,   0x0,    0x42,   0x85,   0x2,    0x17,   0xe4,
+    0x85,   0x9,    0xb,    0x5,    0x11,   0x42,   0x85,   0xa,
+    0x14,   0x19,   0x10,   0x94,   0x55,   0xc,    0x28,   0x42,
+    0x48,   0x0,    0x90,   0xbf,   0x42,   0x42,   0x85,   0x9,
+    0xe7,   0xe7,   0xef,   0xc4,   0x10,   0x5f,   0x44,   0xe3,
+    0xcf,   0x90,   0xa1,   0x42,   0x85,   0x9,    0x48,   0xa1,
+    0x42,   0x48,   0x50,   0xa2,   0xa8,   0x0,    0x72,   0x11,
+    0xf,    0x21,   0x7f,   0xff,   0x0,    0x1,    0x25,   0x46,
+    0x53,   0x4,    0x40,   0x10,   0x80,   0x20,   0x90,   0x88,
+    0x44,   0x24,   0x51,   0x11,   0x10,   0x80,   0x20,   0x10,
+    0x4,    0x8,    0xa2,   0x4a,   0x48,   0x20,   0x45,   0x15,
+    0x29,   0x20,   0x82,   0x84,   0x89,   0x2,    0x49,   0x22,
+    0x22,   0x11,   0x5,    0x42,   0x20,   0x82,   0x8,    0x24,
+    0x0,    0x42,   0x85,   0xa,    0x14,   0x4,    0x85,   0x9,
+    0xa,    0x85,   0x11,   0x42,   0x85,   0xa,    0x14,   0x5,
+    0x10,   0x94,   0x55,   0x12,   0x28,   0x82,   0x48,   0x0,
+    0x50,   0xa0,   0x42,   0x42,   0x85,   0x8,    0x14,   0x4,
+    0x8,    0x4,    0x10,   0x51,   0x7c,   0x84,   0x89,   0x10,
+    0xa1,   0x42,   0x85,   0x8,    0x85,   0x21,   0x42,   0x48,
+    0x50,   0xa2,   0x9b,   0xef,   0x42,   0x11,   0x8,    0x21,
+    0x14,   0x28,   0x6,    0x1,    0x23,   0x89,   0x8d,   0x2,
+    0x80,   0x11,   0x1,    0xa0,   0x63,   0xdf,   0x38,   0x23,
+    0x8e,   0x10,   0xe1,   0x1b,   0x17,   0xa1,   0x83,   0xc8,
+    0xbc,   0x33,   0x8f,   0xa0,   0x39,   0x14,   0xc8,   0xbe,
+    0x82,   0x84,   0x71,   0x1,    0xa8,   0x9c,   0x21,   0xe1,
+    0x2,    0x84,   0x10,   0x87,   0xec,   0x2c,   0x0,    0x3e,
+    0x78,   0xf1,   0xe3,   0xe4,   0x7d,   0x9,    0x4a,   0x45,
+    0x11,   0x42,   0x79,   0xf1,   0xf4,   0x39,   0xf,    0x8,
+    0x22,   0x21,   0x11,   0xf1,   0x50,   0x3,    0x8f,   0x1f,
+    0x3e,   0x3e,   0x7c,   0xf8,   0xe3,   0xe3,   0xe7,   0xc4,
+    0x10,   0x51,   0x45,   0xf3,   0xe9,   0xcf,   0x1e,   0x3c,
+    0x78,   0xf1,   0x2,    0x1e,   0x3e,   0x47,   0x8f,   0x22,
+    0x88,   0x0,    0x42,   0xe,    0x10,   0x1e,   0x7f,   0xff,
+};
 
 const uint16 COMICSEU_OFFSETS[] = {
     0x0,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
@@ -218,7 +1079,96 @@ const uint16 COMICSEU_OFFSETS[] = {
     0x295,   0x29A,   0x29F,   0x29F,   0x29F,   0x2A6,   0x2AC,   0x2AC,
     0x2AC,   0x2AC,   0x2AC,   0x2B2,
 };
-const byte   COMICSEU_DATA[] = {0};
+const byte   COMICSEU_DATA[] = {
+    0x0,    0x0,    0x1,    0x0,    0x0,    0x0,    0x10,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x18,   0x40,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0xc6,   0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x2,    0x80,   0x0,    0x30,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x18,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x3f,   0xff,
+    0x6,    0xd9,   0x23,   0x88,   0x98,   0xca,   0x54,   0x0,
+    0x0,    0x46,   0x11,   0x9e,   0x13,   0xc2,   0xf3,   0x8c,
+    0xc0,   0x0,    0xe,    0x1c,   0x13,   0x84,   0xc7,   0xbc,
+    0x64,   0xa1,   0x4a,   0x11,   0x48,   0xc7,   0x8,    0xe3,
+    0x3a,   0x52,   0x8a,   0x28,   0xbe,   0xd1,   0xa4,   0x20,
+    0x10,   0x0,    0x80,   0x60,   0x10,   0xc6,   0x86,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x5,    0x45,   0x8,    0x3,    0x4a,   0x58,
+    0x40,   0x19,   0x2c,   0x49,   0x99,   0x22,   0x0,    0x3,
+    0xcc,   0x96,   0x18,   0x0,    0x45,   0x11,   0x98,   0xc0,
+    0x7,    0x80,   0xe7,   0x3c,   0x0,    0x1,    0xbf,   0x0,
+    0x2,    0x4b,   0xf5,   0x15,   0x24,   0x51,   0x28,   0x0,
+    0x0,    0x49,   0x32,   0x42,   0x22,   0x4,    0x14,   0x52,
+    0x0,    0xbd,   0x11,   0x2a,   0x2a,   0x4a,   0xa4,   0x20,
+    0x94,   0xa1,   0x52,   0x1b,   0x69,   0x24,   0x94,   0x94,
+    0x12,   0x52,   0x8a,   0x28,   0x82,   0x90,   0x80,   0x10,
+    0x10,   0x0,    0x80,   0x80,   0x10,   0x0,    0x82,   0x0,
+    0x0,    0x0,    0x0,    0x0,    0x4,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x9,    0x20,   0x15,   0x20,   0x0,    0x0,
+    0x43,   0x24,   0x0,    0x2,    0x40,   0x40,   0x79,   0xe5,
+    0x12,   0x0,    0x25,   0x89,   0x10,   0x0,    0x0,    0x6,
+    0xe0,   0x1c,   0x94,   0xa4,   0xf9,   0x22,   0x3f,   0xff,
+    0x2,    0x91,   0x23,   0x8a,   0x18,   0x91,   0x54,   0x80,
+    0x0,    0x92,   0x90,   0x8c,   0x53,   0xc8,   0x23,   0x92,
+    0x19,   0x0,    0x82,   0x55,   0x2b,   0x90,   0x94,   0x21,
+    0x4,    0xa1,   0x62,   0x15,   0x5a,   0x14,   0xa2,   0x93,
+    0x12,   0x52,   0x89,   0x45,   0x4,    0x88,   0x80,   0x7,
+    0x9c,   0x73,   0x99,   0xc7,   0x1c,   0xc2,   0x92,   0xee,
+    0x78,   0xe7,   0x87,   0xd6,   0x66,   0x42,   0x8a,   0x22,
+    0x85,   0x17,   0xc9,   0x20,   0x20,   0x6,    0x73,   0x9c,
+    0xe4,   0x18,   0xc6,   0x31,   0x8c,   0xa6,   0x20,   0x89,
+    0xc,    0x63,   0x0,    0x0,    0x29,   0x17,   0x31,   0x80,
+    0x4,    0xa4,   0x97,   0x21,   0x11,   0x21,   0x3f,   0xff,
+    0x2,    0x3,    0xf1,   0x45,   0x26,   0x11,   0x11,   0xc0,
+    0x1,    0x14,   0x91,   0x2,    0xf8,   0x54,   0x24,   0x4e,
+    0xc2,   0x3c,   0x44,   0x4e,   0x4a,   0x50,   0x97,   0x39,
+    0x37,   0xa1,   0x52,   0x11,   0x4a,   0x14,   0xaa,   0xe0,
+    0x92,   0x52,   0xa8,   0x82,   0x8,    0x88,   0x80,   0x8,
+    0x92,   0x84,   0xa4,   0x88,   0x92,   0x42,   0xa2,   0x91,
+    0x45,   0x14,   0x48,   0x58,   0x94,   0x42,   0x8a,   0x22,
+    0x49,   0x10,   0x90,   0x10,   0x15,   0x2f,   0x8,    0x42,
+    0x14,   0x3d,   0xef,   0x10,   0x85,   0x29,   0x31,   0xcf,
+    0x92,   0x94,   0xa5,   0x29,   0x45,   0x10,   0x92,   0x52,
+    0xe6,   0x9e,   0x64,   0xa1,   0x11,   0x27,   0x30,   0xff,
+    0x0,    0x1,    0x23,   0x8a,   0xa4,   0x11,   0x0,    0x87,
+    0xc2,   0x9,    0x12,   0x12,   0x12,   0x52,   0x44,   0x42,
+    0x9,    0x0,    0x80,   0x20,   0x7a,   0x4a,   0xa4,   0x20,
+    0x94,   0xa9,   0x4a,   0x11,   0x49,   0x27,   0x14,   0x94,
+    0x92,   0x54,   0xd9,   0x42,   0x10,   0x84,   0x80,   0x8,
+    0x92,   0x84,   0xb8,   0x88,   0x92,   0x42,   0xc2,   0x91,
+    0x45,   0x14,   0x48,   0x50,   0x64,   0x42,   0x51,   0x54,
+    0x30,   0xa1,   0x9,    0x20,   0x9,    0x28,   0x7b,   0xde,
+    0xf3,   0x21,   0x8,    0x10,   0x85,   0xef,   0x22,   0x89,
+    0x12,   0x94,   0xa5,   0x26,   0x29,   0x17,   0x92,   0x52,
+    0x95,   0x80,   0x7,    0x21,   0x11,   0xc8,   0xbf,   0xff,
+    0x2,    0x0,    0x1,    0x11,   0x1a,   0xa,    0x0,    0x8,
+    0xa,    0x6,    0x3b,   0xcc,   0x11,   0x8c,   0x43,   0x82,
+    0x10,   0x81,   0x4,    0x1e,   0x4b,   0x84,   0xc7,   0xa0,
+    0x64,   0xa6,   0x4b,   0xd1,   0x48,   0xc4,   0xe,    0x93,
+    0x11,   0x88,   0x8a,   0x22,   0x3e,   0xc5,   0x80,   0x7,
+    0x9c,   0x73,   0x9c,   0x87,   0x92,   0x52,   0xa2,   0x91,
+    0x44,   0xe7,   0x88,   0x50,   0x14,   0x42,   0x51,   0x54,
+    0x48,   0xa2,   0x9,    0x20,   0x5,    0xe7,   0x7b,   0xde,
+    0xf0,   0x9c,   0xe7,   0x10,   0x85,   0x29,   0x79,   0xe9,
+    0xcc,   0x63,   0x3d,   0xe2,   0x10,   0xe7,   0x91,   0x9e,
+    0x94,   0xbe,   0xf4,   0x20,   0xe1,   0x7,    0x3f,   0xff,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x4,    0x0,    0xc0,   0x0,    0x0,    0x0,    0x0,
+    0x1,    0xf0,   0x0,    0x0,    0x18,   0x0,    0x0,    0x0,
+    0x3,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0xc,    0x0,    0x0,    0x0,    0x0,
+    0x0,    0x0,    0x0,    0x0,    0x2,    0x0,    0x0,    0x0,
+};
 
 } // end namespace Noctrpolis
 
diff --git a/engines/access/noctropolis/noctropolis_font.h b/engines/access/noctropolis/noctropolis_font.h
index b14c90d47df..e003e4502ed 100644
--- a/engines/access/noctropolis/noctropolis_font.h
+++ b/engines/access/noctropolis/noctropolis_font.h
@@ -45,12 +45,17 @@ const extern byte COMICSEU_DATA[];
 
 class NoctropolisFont : public Font {
 public:
-	NoctropolisFont(int16 height, byte firstchar, byte numchars, const uint16 *offsets, const byte *data);
+	NoctropolisFont(uint16 bytes, int16 height, byte firstchar, byte lastchar, const uint16 *offsets, const byte *data);
+
 private:
-	byte _numchars;
-	int16 _height;
-	const uint16 *_offsets;
-	const byte *_data;
+    void load(const uint16 *offsets, const byte *data);
+	const byte *getCharDataPtr(byte ch, const uint16 *offsets, const byte *data) const;
+	uint getCharBitOffset(byte ch, const uint16 *offsets) const;
+	uint getCharWidth(byte ch, const uint16 *offsets) const;
+	void makeCharSurface(Graphics::Surface &surface, byte ch, const uint16 *offsets, const byte *data) const;
+
+	byte _lastChar;
+	uint16 _bytes;
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index b3fa3f4d1bf..92f4911b4f1 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -89,13 +89,13 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 		FILENAMES.push_back(filename);
 	}
 
-	_fontChaleteu = new NoctropolisFont(11, 1, 0xe2, CHALETEU_OFFSETS, CHALETEU_DATA);
-	_fontSystemeu = new NoctropolisFont(8, 0x20, 0xe2, SYSTEMEU_OFFSETS, SYSTEMEU_DATA);
-	_fontSml3x5 = new NoctropolisFont(6, 0x20, 0x61, SML3X5_OFFSETS, SML3X5_DATA);
-	_fontNaples12 = new NoctropolisFont(15, 0x20, 0x7f, NAPLES12_OFFSETS, NAPLES12_DATA);
-	_fontGothiceu = new NoctropolisFont(16, 0x20, 0xec, GOTHICEU_OFFSETS, GOTHICEU_DATA);
-	_fontChaletse = new NoctropolisFont(8, 1, 0xec, CHALETSE_OFFSETS, CHALETSE_DATA);
-	_fontComicseu = new NoctropolisFont(8, 1, 0xec, COMICSEU_OFFSETS, COMICSEU_DATA);
+	_fontChaleteu = new NoctropolisFont(0x66, 11, 1, 0xe2, CHALETEU_OFFSETS, CHALETEU_DATA);
+	_fontSystemeu = new NoctropolisFont(0x48, 8, 0x20, 0xe2, SYSTEMEU_OFFSETS, SYSTEMEU_DATA);
+	_fontSml3x5 = new NoctropolisFont(0x1e, 6, 0x20, 0x61, SML3X5_OFFSETS, SML3X5_DATA);
+	_fontNaples12 = new NoctropolisFont(0x66, 15, 0x20, 0x7f, NAPLES12_OFFSETS, NAPLES12_DATA);
+	_fontGothiceu = new NoctropolisFont(0x74, 16, 0x20, 0xec, GOTHICEU_OFFSETS, GOTHICEU_DATA);
+	_fontChaletse = new NoctropolisFont(0x66, 8, 1, 0xec, CHALETSE_OFFSETS, CHALETSE_DATA);
+	_fontComicseu = new NoctropolisFont(0x58, 8, 1, 0xec, COMICSEU_OFFSETS, COMICSEU_DATA);
 
 	// Set up the fonts
 	_vm->_fonts.addFont(_fontChaleteu);


Commit: 283e07d7c0a9ccc6dbc5c20105217c9bc42d6a32
    https://github.com/scummvm/scummvm/commit/283e07d7c0a9ccc6dbc5c20105217c9bc42d6a32
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Start work on loading room data for Noctropolis

Changed paths:
  A engines/access/noctropolis/noctropolis_scripts.cpp
  A engines/access/noctropolis/noctropolis_scripts.h
    engines/access/access.cpp
    engines/access/access.h
    engines/access/asurface.cpp
    engines/access/char.cpp
    engines/access/events.cpp
    engines/access/files.cpp
    engines/access/files.h
    engines/access/metaengine.cpp
    engines/access/module.mk
    engines/access/noctropolis/noctropolis_font.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/room.cpp
    engines/access/room.h


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 4565f16a5a6..3bc873d160a 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -208,7 +208,8 @@ void AccessEngine::initialize() {
 
 const SpriteResource *AccessEngine::getIcons() {
 	if (!_icons) {
-		Resource *iconData = _files->loadRawFile("ICONS.LZ");
+		const char *fname = (getGameID() == kGameNoctropolis) ? "ICONS.AP" : "ICONS.LZ";
+		Resource *iconData = _files->loadRawFile(fname);
 		_icons = new SpriteResource(this, iconData);
 		delete iconData;
 	}
diff --git a/engines/access/access.h b/engines/access/access.h
index 58dda2267ea..955a094bced 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -304,7 +304,7 @@ public:
 	Common::Language getLanguage() const;
 	Common::Platform getPlatform() const;
 	uint16 getVersion() const;
-	uint32 getGameID() const;
+	AccessGameType getGameID() const;
 	uint32 getGameFeatures() const;
 	bool shouldQuitOrRestart();
 
diff --git a/engines/access/asurface.cpp b/engines/access/asurface.cpp
index c8481f3ac14..15c439c78aa 100644
--- a/engines/access/asurface.cpp
+++ b/engines/access/asurface.cpp
@@ -32,9 +32,15 @@ const int TRANSPARENCY = 0;
 SpriteResource::SpriteResource(const AccessEngine *vm, Resource *res) {
 	Common::Array<uint32> offsets;
 	int count = res->_stream->readUint16LE();
-
-	for (int i = 0; i < count; i++)
-		offsets.push_back(res->_stream->readUint32LE());
+	if (count > 4096)
+		error("Corrupt sprite resource: suspicious number of frames (%d)", count);
+
+	for (int i = 0; i < count; i++) {
+		uint32 offset = res->_stream->readUint32LE();
+		if ((int)offset > res->_size)
+			error("Corrupt sprite resource: offset %d (%d) is past end of file (%d)", i, offset, res->_size);
+		offsets.push_back(offset);
+	}
 	offsets.push_back(res->_size);	// For easier calculations of Noctropolis sizes
 
 	// Build up the frames
diff --git a/engines/access/char.cpp b/engines/access/char.cpp
index c5d4498dc4d..8438c60dce2 100644
--- a/engines/access/char.cpp
+++ b/engines/access/char.cpp
@@ -28,17 +28,18 @@ namespace Access {
 
 CharEntry::CharEntry(const byte *data, AccessEngine *vm) {
 	Common::MemoryReadStream s(data, 999);
+	AccessGameType gameType = vm->getGameID();
 
 	_charFlag = s.readByte();
 	if (vm->getGameID() != kGameAmazon || !vm->isCD()) {
-		_screenFile.load(s);
+		_screenFile.load(s, gameType);
 		_estabIndex = s.readSint16LE();
 	} else {
 		_estabIndex = s.readSint16LE();
-		_screenFile.load(s);
+		_screenFile.load(s, gameType);
 	}
 
-	_paletteFile.load(s);
+	_paletteFile.load(s, gameType);
 	_startColor = s.readUint16LE();
 	if (vm->getGameID() == kGameMartianMemorandum) {
 		int lastColor = s.readUint16LE();
@@ -50,19 +51,19 @@ CharEntry::CharEntry(const byte *data, AccessEngine *vm) {
 	for (byte cell = s.readByte(); cell != 0xff; cell = s.readByte()) {
 		CellIdent ci;
 		ci._cell = cell;
-		ci.load(s);
+		ci.load(s, gameType);
 
 		_cells.push_back(ci);
 	}
 
-	_animFile.load(s);
-	_scriptFile.load(s);
+	_animFile.load(s, gameType);
+	_scriptFile.load(s, gameType);
 
 	for (int16 v = s.readSint16LE(); v != -1; v = s.readSint16LE()) {
 		ExtraCell ec;
 		ec._vid._fileNum = v;
 		ec._vid._subfile = s.readSint16LE();
-		ec._vidSound.load(s);
+		ec._vidSound.load(s, gameType);
 
 		_extraCells.push_back(ec);
 	}
diff --git a/engines/access/events.cpp b/engines/access/events.cpp
index 362a6433a1b..c1bcf8f105b 100644
--- a/engines/access/events.cpp
+++ b/engines/access/events.cpp
@@ -380,7 +380,7 @@ bool EventsManager::isKeyActionMousePressed() {
 }
 
 void EventsManager::centerMousePos() {
-	_mousePos = Common::Point(160, 100);
+	_mousePos = Common::Point(_vm->getScreenWidth() / 2, _vm->getScreenHeight() / 2);
 }
 
 void EventsManager::restrictMouse() {
diff --git a/engines/access/files.cpp b/engines/access/files.cpp
index d7b2a22bd4f..f92b3044bbb 100644
--- a/engines/access/files.cpp
+++ b/engines/access/files.cpp
@@ -32,9 +32,14 @@ FileIdent::FileIdent() {
 	_subfile = 0;
 }
 
-void FileIdent::load(Common::SeekableReadStream &s) {
-	_fileNum = s.readSint16LE();
-	_subfile = s.readUint16LE();
+void FileIdent::load(Common::SeekableReadStream &s, AccessGameType gameType) {
+	if (gameType == kGameNoctropolis) {
+		_fileNum = s.readSint16LE();
+		_subfile = s.readUint16LE();
+	} else {
+		_fileNum = s.readSint32LE();
+		_subfile = s.readUint32LE();
+	}
 }
 
 /*------------------------------------------------------------------------*/
diff --git a/engines/access/files.h b/engines/access/files.h
index 298566e9c11..181526359fc 100644
--- a/engines/access/files.h
+++ b/engines/access/files.h
@@ -27,6 +27,7 @@
 #include "common/file.h"
 #include "graphics/managed_surface.h"
 #include "access/decompress.h"
+#include "access/detection.h"
 
 namespace Access {
 
@@ -39,7 +40,7 @@ struct FileIdent {
 	FileIdent();
 	FileIdent(int fileNum, int subfile) { _fileNum = fileNum; _subfile = subfile; }
 
-	void load(Common::SeekableReadStream &s);
+	void load(Common::SeekableReadStream &s, AccessGameType gameType);
 };
 
 struct CellIdent : FileIdent {
diff --git a/engines/access/metaengine.cpp b/engines/access/metaengine.cpp
index 6446dfde769..3e405eeb05e 100644
--- a/engines/access/metaengine.cpp
+++ b/engines/access/metaengine.cpp
@@ -44,8 +44,8 @@
 
 namespace Access {
 
-uint32 AccessEngine::getGameID() const {
-	return _gameDescription->gameID;
+AccessGameType AccessEngine::getGameID() const {
+	return (AccessGameType)(_gameDescription->gameID);
 }
 
 uint32 AccessEngine::getGameFeatures() const {
diff --git a/engines/access/module.mk b/engines/access/module.mk
index c4639dab9b2..486f89a4ddd 100644
--- a/engines/access/module.mk
+++ b/engines/access/module.mk
@@ -39,6 +39,7 @@ MODULE_OBJS := \
 	noctropolis/noctropolis_game.o \
 	noctropolis/noctropolis_resources.o \
 	noctropolis/noctropolis_room.o \
+	noctropolis/noctropolis_scripts.o \
 	martian/midiparser_bemd.o \
 	video/movie_decoder.o
 
diff --git a/engines/access/noctropolis/noctropolis_font.cpp b/engines/access/noctropolis/noctropolis_font.cpp
index 56a9b033736..c2cb71728d4 100644
--- a/engines/access/noctropolis/noctropolis_font.cpp
+++ b/engines/access/noctropolis/noctropolis_font.cpp
@@ -54,7 +54,6 @@ uint NoctropolisFont::getCharBitOffset(byte ch, const uint16 *offsets) const {
 	return offsets[ch - _firstCharIndex];
 }
 
-
 void NoctropolisFont::makeCharSurface(Graphics::Surface &surface, byte ch, const uint16 *offsets, const byte *data) const {
 	uint width = getCharWidth(ch, offsets);
 
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 339c3fe88e8..ef2bc9ed56b 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -21,6 +21,7 @@
 
 #include "access/noctropolis/noctropolis_game.h"
 #include "access/noctropolis/noctropolis_room.h"
+#include "access/noctropolis/noctropolis_scripts.h"
 #include "image/png.h"
 #include "graphics/color_quantizer.h"
 
@@ -30,15 +31,18 @@ namespace Noctropolis {
 
 
 NoctropolisEngine::NoctropolisEngine(OSystem *syst, const AccessGameDescription *gameDesc) :
-AccessEngine(syst, gameDesc)
+AccessEngine(syst, gameDesc), _invScript(nullptr)
 {
 }
 
 NoctropolisEngine::~NoctropolisEngine() {
+	delete _invScript;
 }
 
 void NoctropolisEngine::initObjects() {
 	_room = new NoctropolisRoom(this);
+	_scripts = new NoctropolisScripts(this);
+	_invScript = new NoctropolisScripts(this);
 }
 
 void NoctropolisEngine::setupGame() {
@@ -50,26 +54,74 @@ void NoctropolisEngine::setupGame() {
 		te._flag = false;
 		_timers.push_back(te);
 	}
-	
+}
+
+void NoctropolisEngine::initVariables() {
+	// Set player room and position
+	_player->_roomNumber = 2;
+
+	_invScript->setScript(_files->loadRawFile("INVTEXT.AP"));
+
+	_converseMode = 0;
+	_inventory->_startInvItem = 0;
+	_inventory->_startInvBox = 0;
+	Common::fill(&_objectsTable[0], &_objectsTable[100], (SpriteResource *)nullptr);
+	_player->_playerOff = false;
+	/*
+	_player->_playerX = _player->_rawPlayer.x = _res->ROOMTBL[_player->_roomNumber]._travelPos.x;
+	_player->_playerY = _player->_rawPlayer.y = _res->ROOMTBL[_player->_roomNumber]._travelPos.y;
+	*/
+	_room->_selectCommand = -1;
+	_events->setNormalCursor(CURSOR_ARROW);
+	_mouseMode = 0;
+	_animation->clearTimers();
 }
 
 void NoctropolisEngine::playGame() {
 	if (_loadSaveSlot == -1) {
+		bool keepGoing = true;
+		Common::CustomEventType action = kActionNone;
 		doFlashLogo();
 		if (shouldQuit())
 			return;
 
-		doPublisherLogo();
+		_events->getAction(action);
+		keepGoing &= (action != kActionSkip);
+		
+		if (keepGoing)
+			doPublisherLogo();
 		if (shouldQuit())
 			return;
 
-		doIntro();
+		_events->getAction(action);
+		keepGoing &= (action != kActionSkip);
+		
+		if (keepGoing)
+			doIntro();
 		if (shouldQuit())
 			return;
+	}
 
+	do {
+		_restartFl = false;
+		_screen->clearScreen();
+		_screen->setPanel(0);
 		_screen->forceFadeOut();
-	}
+		_events->centerMousePos();
+		_events->showCursor();
 
+		initVariables();
+
+		// If there's a pending savegame to load, load it
+		if (_loadSaveSlot != -1) {
+			loadGameState(_loadSaveSlot);
+			_loadSaveSlot = -1;
+		}
+
+		// Execute the room
+		_room->doRoom();
+	} while (_restartFl);
+	
 }
 
 void NoctropolisEngine::doFlashLogo() {
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index cb23b425f05..1fe8c6f1447 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -49,6 +49,9 @@ private:
 	void doIntro();
 	void doFlashLogo();
 	void doPublisherLogo();
+	void initVariables();
+	
+	Scripts *_invScript;
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
new file mode 100644
index 00000000000..7750a2b0aa1
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -0,0 +1,83 @@
+/* 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 "access/noctropolis/noctropolis_scripts.h"
+#include "access/noctropolis/noctropolis_game.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+NoctropolisScripts::NoctropolisScripts(NoctropolisEngine *vm) : Scripts(vm) {
+}
+
+void NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2) {
+	switch (commandIndex) {
+		case 1:
+			_vm->_screen->fadeOut();
+			break;
+		case 3:
+			error("TODO: Special 3: Call DisplayPegs_Tick");
+		case 4:
+			error("TODO: Special 4: Call MovePeg(%d)", param2);
+		case 5:
+			error("TODO: Special 5: Call SucAttack()");
+		case 6:
+			error("TODO: Special 6: Load DARKSHEER player!");
+		case 7:
+			_vm->_midi->loadMusic(98, param2);
+			break;
+		case 8:
+			error("TODO: Special 8: Dim palette");
+		case 9:
+			error("TODO: Special 9: DimPalette1(0x32,0xc0,0x2b);");
+		case 10:
+			error("TODO: Special 10: StilMorph");
+		case 11:
+			error("TODO: Special 11: Ending");
+		case 12:
+			error("TODO: Special 12: Split");
+		case 13:
+			error("TODO: Special 13: ShotoMean");
+		case 14:
+			error("TODO: Special 14: StingerSeq(0x62, param_2);");
+		case 15:
+			if (!_vm->_midi->isPlaying())
+				_vm->_midi->resume();
+			break;
+		case 17:
+			error("TODO: Special 17: EndGame");
+		case 19:
+			warning("TODO: work our correct step on Special 19 (flashpalette)");
+			_vm->_screen->flashPalette(20);
+		case 20:
+			error("TODO: Special 20: DoLastComic");
+		case 21:
+			error("TODO: Special 20: DoSpecialComic");
+		default:
+			error("TODO: Unknown special %d in NoctropolisScripts::executeSpecial", commandIndex);
+	}
+}
+
+
+} // end namespace Noctropolis
+
+} // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_scripts.h b/engines/access/noctropolis/noctropolis_scripts.h
new file mode 100644
index 00000000000..31355482f24
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_scripts.h
@@ -0,0 +1,44 @@
+/* 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 ACCESS_NOCTROPOLIS_NOCTROPOLIS_SCRIPTS_H
+#define ACCESS_NOCTROPOLIS_NOCTROPOLIS_SCRIPTS_H
+
+#include "access/scripts.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+class NoctropolisEngine;
+
+class NoctropolisScripts : public Scripts {
+public:
+	NoctropolisScripts(NoctropolisEngine *vm);
+
+	void executeSpecial(int commandIndex, int param1, int param2) override;
+};
+
+} // end namespace Noctropolis
+
+} // end namespace Access
+
+#endif // ACCESS_NOCTROPOLIS_NOCTROPOLIS_SCRIPTS_H
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 7e0fc508bad..ff772840d28 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -299,6 +299,9 @@ void Room::loadRoomData(const byte *roomData) {
 
 	_roomFlag = roomInfo._roomFlag;
 
+	// TODO: If roomFlag & 2 and noctropolis, load pal files.
+	// (see LoadRoom in noctropolis.)
+
 	_vm->_establishFlag = false;
 	if (roomInfo._estIndex != -1) {
 		_vm->_establishFlag = true;
@@ -1002,34 +1005,40 @@ bool Room::checkCode(int v1, int v2) {
 
 /*------------------------------------------------------------------------*/
 
-RoomInfo::RoomInfo(const byte *data, int gameType, bool isCD, bool isDemo) {
+RoomInfo::RoomInfo(const byte *data, AccessGameType gameType, bool isCD, bool isDemo) {
 	Common::MemoryReadStream stream(data, 999);
 
 	_roomFlag = stream.readByte();
 
 	_estIndex = -1;
+	_palIntensity = 255;
 	if (gameType == kGameAmazon && isCD)
 		_estIndex = stream.readSint16LE();
+	else if (gameType == kGameNoctropolis)
+		_palIntensity = stream.readByte();
 
-	_musicFile.load(stream);
+	_musicFile.load(stream, gameType);
 	_scaleH1 = stream.readByte();
 	_scaleH2 = stream.readByte();
 	_scaleN1 = stream.readByte();
-	_playFieldFile.load(stream);
+	_playFieldFile.load(stream, gameType);
 
 	for (byte cell = stream.readByte(); cell != 0xff; cell = stream.readByte()) {
 		CellIdent ci;
 		ci._cell = cell;
-		ci.load(stream);
+		ci.load(stream, gameType);
 
 		_cells.push_back(ci);
 	}
 
-	_scriptFile.load(stream);
-	_animFile.load(stream);
+	_scriptFile.load(stream, gameType);
+	_animFile.load(stream, gameType);
 	_scaleI = stream.readByte();
 	_scrollThreshold = stream.readByte();
-	_paletteFile.load(stream);
+	if (gameType != kGameNoctropolis)
+		_paletteFile.load(stream, gameType);
+	else
+		stream.skip(8);
 	if (_paletteFile._fileNum == -1) {
 		_startColor = _numColors = 0;
 	} else {
diff --git a/engines/access/room.h b/engines/access/room.h
index 5bb83baa3b0..7a200bee78c 100644
--- a/engines/access/room.h
+++ b/engines/access/room.h
@@ -26,6 +26,7 @@
 #include "common/array.h"
 #include "common/rect.h"
 #include "access/data.h"
+#include "access/detection.h"
 
 #define TILE_WIDTH 16
 #define TILE_HEIGHT 16
@@ -181,8 +182,9 @@ public:
 		int _priority;
 	};
 public:
-	int _roomFlag;
+	byte _roomFlag;
 	int _estIndex;
+	byte _palIntensity;
 	FileIdent _musicFile;
 	int _scaleH1;
 	int _scaleH2;
@@ -199,7 +201,7 @@ public:
 	Common::Array<ExtraCell> _extraCells;
 	Common::Array<SoundIdent> _sounds;
 public:
-	RoomInfo(const byte *data, int gameType, bool isCD, bool isDemo);
+	RoomInfo(const byte *data, AccessGameType gameType, bool isCD, bool isDemo);
 };
 
 } // End of namespace Access


Commit: 2b477970ce992bcd451d21dcdf8f8fba0a2b366c
    https://github.com/scummvm/scummvm/commit/2b477970ce992bcd451d21dcdf8f8fba0a2b366c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add script to parse Noctropolis room data

Changed paths:
  A devtools/create_access/extract_noctropolis_resources.py


diff --git a/devtools/create_access/extract_noctropolis_resources.py b/devtools/create_access/extract_noctropolis_resources.py
new file mode 100644
index 00000000000..66517a836b8
--- /dev/null
+++ b/devtools/create_access/extract_noctropolis_resources.py
@@ -0,0 +1,231 @@
+#!/usr/bin/env python3
+import sys
+import struct
+
+"""
+The Noctropolis resources were recompiled with 32 bit ints, so we can't just
+extract the data and read it with our code as-is.  Instead, we pull out the
+individual bits and print them out to go into CPP files.
+"""
+
+def read_c_string(f, offset = None):
+	"""Read a null-terminated string from file starting at offset."""
+	if offset is not None:
+		f.seek(offset)
+	chars = []
+	while True:
+		b = f.read(1)
+		if not b or b == b'\x00':
+			break
+		chars.append(b.decode('latin1'))  # latin1 avoids decode errors
+	return "".join(chars)
+
+
+def read_one_pointer(f):
+	data = f.read(8)
+	if len(data) < 8:
+		return 0
+	value, = struct.unpack("<Q", data)
+	# strip off the segment
+	value &= 0xffffff
+	return value
+
+
+def read_pointer_list(f, count=None):
+	"""
+	Read a list of pointers (64-bit) from the current file offset.
+	Read count pointers (if set) or until a null pointer is hit otherwise.
+	"""
+	offsets = []
+	# Read 64-bit little-endian integers until 0 or count
+	while True:
+		value = read_one_pointer(f)
+		if count is None and value == 0:
+			break
+		offsets.append(value)
+		if count is not None:
+			count -= 1
+			if count == 0:
+				break
+	return offsets
+
+# read a file/subfile pair and as shorts
+def file_ints_to_shorts(f):
+	"""
+	Read the file/subfile pair of int32s and recode them as int16
+	"""
+	data = f.read(8)
+	file, subfile = struct.unpack("<ii", data)
+	return struct.pack("<hh", file, subfile)
+
+
+def read_room_cell_data(f):
+	alldata = b''
+	while True:
+		data = f.read(4)
+		alldata += data[0:1] # convert int32 -> byte for cell num
+		cell, = struct.unpack("<I", data)
+		if cell == 0xff:
+			return alldata
+		alldata += file_ints_to_shorts(f)
+
+def read_room_vid_data(f):
+	"""
+	Read the video data table for the room data
+	"""
+	offsets = read_pointer_list(f)
+
+	# Collect strings from those offsets
+	strings = [read_c_string(f, off) for off in offsets]
+	asbytes = [x.encode('utf-8') for x in strings]
+
+	result = b'\0'.join(asbytes) + b'\0'
+	return result
+
+
+def read_room_sound_data(f):
+	"""
+	Read the sound list for room data.  Each sound entry is 24 bytes:
+	 * file/subfile/priority int32s and 12 bytes of null
+	 * if the file is -1, it's the end of the list
+	 * if the priority is 0xff, the last 8 bytes can be a pointer to a file name.
+
+	 convert that to a more compact and similar-to-others format:
+	 * if file is 0xff -> read a file name string, else read subfile
+	 * write ints as int16
+	"""
+	alldata = b''
+	while True:
+		data = f.read(8)
+		file, subfile = struct.unpack("<ii", data)
+		# print(f"{file}, {subfile}")
+		if file == -1:
+			alldata += struct.pack("<h", file)
+			return alldata
+
+		priodata = f.read(4)
+		priority, = struct.unpack("<I", priodata)
+
+		dummy = f.read(4)
+		if priority == 0xff:
+			strptr = read_one_pointer(f)
+			if strptr != 0:
+				curpos = f.tell()
+				filename = read_c_string(f, strptr)
+				alldata += struct.pack("<H", 0xff)
+				alldata += filename.encode('utf-8')
+				alldata += b'\0'
+				# print(f"Read string {filename} from 0x%x" % strptr)
+				f.seek(curpos)
+			else:
+				alldata += struct.pack("<HH", file, subfile)
+		else:
+			f.read(8) # null str ptr
+			alldata += struct.pack("<HH", file, subfile)
+
+		alldata += struct.pack("<H", priority)
+
+
+def read_room_data(f, i: int, offset: int):
+	f.seek(offset)
+	data = f.read(2) # roomflag and pal intensity
+	f.read(2) # unused
+	data += file_ints_to_shorts(f) # music file/subfile
+	data += f.read(3) # scale vals
+	f.read(1) # unused
+	data += file_ints_to_shorts(f) # playfield file/subfile
+	cellptr = read_one_pointer(f)
+	if cellptr == 0:
+		data += bytes([0xff])
+	else:
+		curpos = f.tell()
+		f.seek(cellptr)
+		data += read_room_cell_data(f)
+		f.seek(curpos)
+
+	data += file_ints_to_shorts(f) # script file/subfile
+	data += file_ints_to_shorts(f) # anim file/subfile
+	data += f.read(1) # scaleI
+	f.read(1) # unused
+	scrollThreshold, = struct.unpack("<h", f.read(2))
+	assert scrollThreshold <= 0xff
+	data += struct.pack("<B", scrollThreshold)
+
+	f.read(12) # Skip palette file nums (unused) and 4 bytes after
+
+	videoptr = read_one_pointer(f)
+	if videoptr:
+		curpos = f.tell()
+		f.seek(videoptr)
+		data += read_room_vid_data(f)
+		f.seek(curpos)
+	else:
+		data += b'\0'
+
+	soundptr = read_one_pointer(f)
+	if soundptr:
+		curpos = f.tell()
+		f.seek(soundptr)
+		# print("Read sounds from 0x%x" % soundptr)
+		data += read_room_sound_data(f)
+		f.seek(curpos)
+	else:
+		data += struct.pack("<h", -1)
+
+	print("static const byte ROOMDATA_%02d[] = {" % i)
+	for o in range((len(data) + 15) // 16):
+		subdata = data[16*o:16*(o+1)]
+		subdata_str = ['0x%02x,' % v for v in subdata]
+		result = ' '.join(subdata_str)
+		print("\t" + result)
+	print("};")
+
+
+def read_rooms(f):
+	f.seek(0x9f400)
+	offsets = read_pointer_list(f, count=100)
+
+	for i, offset in enumerate(offsets):
+		if offset != 0:
+			read_room_data(f, i, offset)
+
+	print("")
+	print("")
+	for i, offset in enumerate(offsets):
+		if offset == 0:
+			print("\tROOMTBL.push_back(RoomEntry({\"\", Common::Point(), Common::Array<byte>()}));")
+		else:
+			print("\tROOMTBL.push_back(RoomEntry({\"\", Common::Point(), Common::Array<byte>(ROOMDATA_%02d, ARRAYSIZE(ROOMDATA_%02d))}));" % (i, i))
+
+
+
+def read_filenames(f):
+	base_offset = 0x94830
+	f.seek(base_offset)
+
+	offsets = read_pointer_list(f)
+
+	# Collect strings from those offsets
+	strings = [read_c_string(f, off) for off in offsets]
+
+	# Print C source array
+	print("static const char *FILENAMES[] = {")
+	for s in strings:
+		escaped = s.replace("\\", "\\\\").replace('"', '\\"')
+		print(f'\t"{escaped}",')
+	print("};")
+
+
+def main():
+	if len(sys.argv) < 2:
+		print(f"Usage: {sys.argv[0]} Macos-Noctropolis-Executable")
+		return
+	filename = sys.argv[1]
+
+	with open(filename, "rb") as f:
+		#read_filenames(f)
+		read_rooms(f)
+
+if __name__ == "__main__":
+	main()
+


Commit: d425243823adcc9216e8d294faa892d4ff0e3cca
    https://github.com/scummvm/scummvm/commit/d425243823adcc9216e8d294faa892d4ff0e3cca
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add room/sound/music loading code for Noctropolis

For now the room data is hard-coded into the resources class.

The first screen now mostly loads after the intro plays.

Changed paths:
    engines/access/amazon/amazon_room.cpp
    engines/access/amazon/amazon_room.h
    engines/access/data.h
    engines/access/events.cpp
    engines/access/events.h
    engines/access/files.cpp
    engines/access/martian/martian_room.cpp
    engines/access/martian/martian_room.h
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/noctropolis/noctropolis_room.h
    engines/access/room.cpp
    engines/access/room.h
    engines/access/sound.cpp


diff --git a/engines/access/amazon/amazon_room.cpp b/engines/access/amazon/amazon_room.cpp
index cbbd2e466ca..2988ece95c3 100644
--- a/engines/access/amazon/amazon_room.cpp
+++ b/engines/access/amazon/amazon_room.cpp
@@ -39,10 +39,6 @@ AmazonRoom::AmazonRoom(AccessEngine *vm) : Room(vm) {
 AmazonRoom::~AmazonRoom() {
 }
 
-void AmazonRoom::loadRoom(int roomNumber) {
-	loadRoomData(&AMRES.ROOMTBL[roomNumber]._data[0]);
-}
-
 void AmazonRoom::reloadRoom() {
 	loadRoom(_vm->_player->_roomNumber);
 
diff --git a/engines/access/amazon/amazon_room.h b/engines/access/amazon/amazon_room.h
index e9fabe3b8fa..31307810edd 100644
--- a/engines/access/amazon/amazon_room.h
+++ b/engines/access/amazon/amazon_room.h
@@ -40,8 +40,6 @@ private:
 	const byte *_icon;
 
 protected:
-	void loadRoom(int roomNumber) override;
-
 	void reloadRoom() override;
 
 	void reloadRoom1() override;
diff --git a/engines/access/data.h b/engines/access/data.h
index fcc8ed305ce..41ccce31082 100644
--- a/engines/access/data.h
+++ b/engines/access/data.h
@@ -88,6 +88,7 @@ public:
 class ExtraCell {
 public:
 	FileIdent _vid;
+	Common::String _vidFilename;
 	FileIdent _vidSound;
 };
 
diff --git a/engines/access/events.cpp b/engines/access/events.cpp
index c1bcf8f105b..b3adef7a6b7 100644
--- a/engines/access/events.cpp
+++ b/engines/access/events.cpp
@@ -64,6 +64,10 @@ void EventsManager::setNormalCursor(CursorType cursorId) {
 }
 
 void EventsManager::setCursor(CursorType cursorId) {
+	if (_vm->getGameID() == kGameNoctropolis) {
+		warning("*** FIXME *** setCursor: Need data for Noctropolis cursors");
+		return;
+	}
 	if (cursorId == _cursorId)
 		return;
 	_cursorId = cursorId;
diff --git a/engines/access/events.h b/engines/access/events.h
index 48845ac5e9b..7257bb0070e 100644
--- a/engines/access/events.h
+++ b/engines/access/events.h
@@ -29,6 +29,7 @@
 namespace Access {
 
 enum CursorType {
+	// These names are for Amazon - Noctropolis uses a different order.
 	CURSOR_NONE = -1,
 	CURSOR_ARROW = 0, CURSOR_CROSSHAIRS, CURSOR_2, CURSOR_3, CURSOR_LOOK,
 	CURSOR_USE, CURSOR_TAKE, CURSOR_CLIMB, CURSOR_TALK, CURSOR_HELP,
diff --git a/engines/access/files.cpp b/engines/access/files.cpp
index f92b3044bbb..a93194c6bff 100644
--- a/engines/access/files.cpp
+++ b/engines/access/files.cpp
@@ -99,11 +99,24 @@ FileManager::~FileManager() {
 }
 
 Resource *FileManager::loadFile(int fileNum, int subfile) {
-	Resource *res = new Resource();
-	setAppended(res, _vm->_res->FILENAMES[fileNum]);
-	gotoAppended(res, subfile);
+	Resource *res = nullptr;
+	const Common::Path &filepath = _vm->_res->FILENAMES[fileNum];
+	Common::File file;
+
+	// Noctropolis remastered has music in OGG or MID format broken
+	// out into the individual files
+	if (_vm->getGameID() == kGameNoctropolis && fileNum == 98 && !file.exists(filepath)) {
+		Common::Path path = Common::Path(Common::String::format("MUSIC/M%02d.mid", subfile));
+		// TODO: Also check for OGG file here
+		if (file.exists(path))
+			res = loadRawFile(path);
+	} else {
+		res = new Resource();
+		setAppended(res, filepath);
+		gotoAppended(res, subfile);
+		handleFile(res);
+	}
 
-	handleFile(res);
 	return res;
 }
 
@@ -217,7 +230,7 @@ void FileManager::setAppended(Resource *res, const Common::Path &fileName) {
 void FileManager::readIndex(Resource *res) {
 	// Read in the file index
 	int count = res->_file.readUint16LE();
-	assert(count <= 100);
+	assert(count <= 200);
 	_fileIndex.resize(count);
 	for (int i = 0; i < count; ++i)
 		_fileIndex[i] = res->_file.readUint32LE();
diff --git a/engines/access/martian/martian_room.cpp b/engines/access/martian/martian_room.cpp
index 5547fbc8798..357c7ed61b8 100644
--- a/engines/access/martian/martian_room.cpp
+++ b/engines/access/martian/martian_room.cpp
@@ -43,10 +43,6 @@ MartianRoom::MartianRoom(AccessEngine *vm) : Room(vm) {
 MartianRoom::~MartianRoom() {
 }
 
-void MartianRoom::loadRoom(int roomNumber) {
-	loadRoomData(&MMRES.ROOMTBL[roomNumber]._data[0]);
-}
-
 void MartianRoom::reloadRoom() {
 //	_vm->_currentMan = _roomFlag;
 //	_vm->_currentManOld = _roomFlag;
diff --git a/engines/access/martian/martian_room.h b/engines/access/martian/martian_room.h
index 36bcf353325..ad890601886 100644
--- a/engines/access/martian/martian_room.h
+++ b/engines/access/martian/martian_room.h
@@ -38,8 +38,6 @@ private:
 	MartianEngine *_game;
 
 protected:
-	void loadRoom(int roomNumber) override;
-
 	void roomInit() override;
 
 	void reloadRoom() override;
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 92f4911b4f1..efd927cbaf8 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -57,6 +57,1369 @@ static const char *NOCT_FILES[] = {
 	nullptr,
 };
 
+static const byte ROOMDATA_02[] = {
+	0x81, 0x02, 0x62, 0x00, 0x02, 0x00, 0x30, 0x22, 0x30, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00,
+	0x02, 0x00, 0x03, 0x02, 0x00, 0x03, 0x00, 0x04, 0x02, 0x00, 0x04, 0x00, 0xff, 0x02, 0x00, 0x01,
+	0x00, 0x02, 0x00, 0x05, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41,
+	0x55, 0x44, 0x2f, 0x46, 0x4c, 0x55, 0x58, 0x30, 0x31, 0x41, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff,
+	0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x46, 0x4c, 0x55, 0x58,
+	0x30, 0x31, 0x42, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0x63, 0x00, 0x3a, 0x00, 0x00, 0x00,
+	0xff, 0xff,
+};
+static const byte ROOMDATA_03[] = {
+	0x01, 0x02, 0x62, 0x00, 0x03, 0x00, 0xc8, 0x46, 0x84, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00,
+	0x02, 0x00, 0xff, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0xf2, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x4f, 0x4f, 0x54, 0x48, 0x33, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x30,
+	0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x31, 0x30, 0x31, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x30, 0x33, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x30,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x31, 0x30, 0x31, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x30, 0x37, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x30,
+	0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x31, 0x30, 0x31, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x31, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x31, 0x31, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x31,
+	0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x31, 0x30, 0x31, 0x31, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x31, 0x35, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x31, 0x30, 0x31, 0x31,
+	0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x31, 0x30, 0x31, 0x31, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x31, 0x4f, 0x44, 0x31, 0x30, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x46, 0x4c, 0x49, 0x50, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x63, 0x00, 0x03, 0x00, 0x01, 0x00, 0x63, 0x00, 0x04, 0x00, 0x03, 0x00, 0x63,
+	0x00, 0x02, 0x00, 0x02, 0x00, 0x63, 0x00, 0x07, 0x00, 0x03, 0x00, 0x63, 0x00, 0x3c, 0x00, 0x03,
+	0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_04[] = {
+	0x00, 0x02, 0x62, 0x00, 0x07, 0x00, 0xa0, 0x84, 0x5a, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00,
+	0x02, 0x00, 0xff, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x03, 0x00, 0xcc, 0x00, 0x00, 0x63, 0x00,
+	0x04, 0x00, 0x01, 0x00, 0x63, 0x00, 0x06, 0x00, 0x01, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_11[] = {
+	0x05, 0x02, 0x62, 0x00, 0x05, 0x00, 0xc8, 0x96, 0x6a, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x0b, 0x00,
+	0x02, 0x00, 0xff, 0x0b, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x03, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x4f, 0x4f, 0x54, 0x48, 0x53, 0x4d, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32,
+	0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x32, 0x30, 0x32, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x30, 0x33, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32,
+	0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x32, 0x30, 0x32, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x30, 0x37, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32,
+	0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x32, 0x30, 0x32, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x31, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x31, 0x31, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32,
+	0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x32, 0x30, 0x32, 0x31, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x31, 0x35, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32,
+	0x31, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x32, 0x30, 0x32, 0x31, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x31, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x31, 0x39, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_12[] = {
+	0x03, 0x02, 0x62, 0x00, 0x15, 0x00, 0x64, 0x28, 0x70, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00,
+	0x03, 0x00, 0x0d, 0x0c, 0x00, 0x04, 0x00, 0xff, 0x0c, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x02, 0x00,
+	0x80, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x36, 0x30, 0x33,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x36, 0x30, 0x33, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x36, 0x30, 0x33, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x36, 0x30, 0x33, 0x30,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x43, 0x36, 0x30, 0x33, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x36, 0x30, 0x33, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x36, 0x30, 0x33, 0x30, 0x37,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43,
+	0x36, 0x30, 0x33, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x43, 0x36, 0x30, 0x33, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x36, 0x30, 0x33, 0x31, 0x30, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x36,
+	0x30, 0x33, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x32, 0x2f, 0x43, 0x36, 0x30, 0x33, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x36, 0x30, 0x33, 0x31, 0x33, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x36, 0x30,
+	0x33, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x32, 0x2f, 0x43, 0x36, 0x30, 0x33, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x08,
+	0x00, 0x01, 0x00, 0x63, 0x00, 0x09, 0x00, 0x01, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x63,
+	0x00, 0x0b, 0x00, 0x01, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_13[] = {
+	0x03, 0x02, 0x62, 0x00, 0x16, 0x00, 0x4b, 0x3f, 0x32, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x0d, 0x00,
+	0x03, 0x00, 0x17, 0x0d, 0x00, 0x04, 0x00, 0x19, 0x0d, 0x00, 0x05, 0x00, 0xff, 0x0d, 0x00, 0x01,
+	0x00, 0x0d, 0x00, 0x02, 0x00, 0x60, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x34, 0x31, 0x30, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x30, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x30, 0x30, 0x32, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x30,
+	0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x33, 0x31, 0x30, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x31, 0x30, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x31, 0x30, 0x30, 0x32, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x31, 0x30,
+	0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x37, 0x31, 0x30, 0x31, 0x41, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x37, 0x31, 0x30, 0x31, 0x42, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x31, 0x30, 0x31, 0x43, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x63, 0x00, 0x15, 0x00, 0x01, 0x00, 0x63, 0x00,
+	0x2c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00, 0x00,
+	0x63, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_14[] = {
+	0x80, 0x02, 0x62, 0x00, 0x15, 0x00, 0x4b, 0x3c, 0x32, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x0e, 0x00,
+	0x03, 0x00, 0xff, 0x0e, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x60, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x30, 0x32,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33,
+	0x30, 0x34, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x30, 0x36,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33,
+	0x30, 0x34, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x31, 0x30,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33,
+	0x30, 0x34, 0x31, 0x30, 0x41, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x31, 0x32, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x31,
+	0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x33, 0x30, 0x34, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x31, 0x36, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x31,
+	0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x33, 0x30, 0x34, 0x31, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x31, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x32, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x32,
+	0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x33, 0x30, 0x34, 0x32, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x32, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x32, 0x34, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x32,
+	0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x33, 0x30, 0x34, 0x32, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x32, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x32, 0x38, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x32,
+	0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x33, 0x30, 0x34, 0x33, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x33, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x33, 0x32, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x33,
+	0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x33, 0x30, 0x34, 0x33, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x33, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x33, 0x36, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x33,
+	0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x33, 0x30, 0x34, 0x33, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x33, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x34, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x34,
+	0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x33, 0x30, 0x34, 0x34, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x34, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x34, 0x34, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x34,
+	0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x33, 0x30, 0x34, 0x34, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x34, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x34, 0x38, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x34,
+	0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x33, 0x30, 0x34, 0x35, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x35, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x35, 0x32, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x35,
+	0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x33, 0x30, 0x34, 0x35, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x35, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_15[] = {
+	0x80, 0x02, 0x62, 0x00, 0x07, 0x00, 0xc8, 0x96, 0x6a, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00,
+	0x03, 0x00, 0xff, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x02, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x30, 0x31,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x30, 0x35, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x30, 0x35,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x30, 0x35, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x30, 0x39,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x30, 0x35, 0x31, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x31, 0x33,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x30, 0x35, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x31, 0x36, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x31, 0x37,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x30, 0x35, 0x31, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x31, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x32, 0x30, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x32, 0x31,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x27, 0x00, 0x01, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x30, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x41, 0x34,
+	0x31, 0x31, 0x30, 0x31, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x32, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_16[] = {
+	0x81, 0x02, 0x62, 0x00, 0x06, 0x00, 0xc8, 0x96, 0x6a, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,
+	0x03, 0x00, 0xff, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x37, 0x30, 0x36, 0x30, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x37, 0x30, 0x36,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x37, 0x30, 0x36, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x37, 0x30, 0x36, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x37, 0x30, 0x36, 0x30,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x43, 0x37, 0x30, 0x36, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x37, 0x30, 0x36, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x37, 0x30, 0x36, 0x30, 0x37,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43,
+	0x37, 0x30, 0x36, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x43, 0x37, 0x30, 0x36, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63,
+	0x00, 0x28, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_17[] = {
+	0x03, 0x02, 0x62, 0x00, 0x17, 0x00, 0x68, 0x34, 0x78, 0x11, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00,
+	0x02, 0x00, 0xff, 0x11, 0x00, 0x01, 0x00, 0x11, 0x00, 0x03, 0x00, 0x85, 0x00, 0x00, 0x63, 0x00,
+	0x0b, 0x00, 0x01, 0x00, 0x63, 0x00, 0x04, 0x00, 0x03, 0x00, 0x63, 0x00, 0x59, 0x00, 0x02, 0x00,
+	0x63, 0x00, 0x5a, 0x00, 0x03, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_18[] = {
+	0x01, 0x02, 0x62, 0x00, 0x0e, 0x00, 0xc8, 0x96, 0x96, 0x12, 0x00, 0x00, 0x00, 0x12, 0x12, 0x00,
+	0x03, 0x00, 0xff, 0x12, 0x00, 0x01, 0x00, 0x12, 0x00, 0x02, 0x00, 0xff, 0x00, 0x00, 0x63, 0x00,
+	0x0c, 0x00, 0x00, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d,
+	0x4f, 0x56, 0x32, 0x30, 0x30, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d, 0x4f, 0x56, 0x31, 0x30, 0x31, 0x2e, 0x57, 0x41,
+	0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d,
+	0x4f, 0x56, 0x32, 0x30, 0x32, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d, 0x4f, 0x56, 0x31, 0x30, 0x33, 0x2e, 0x57, 0x41,
+	0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d,
+	0x4f, 0x56, 0x32, 0x30, 0x34, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d, 0x4f, 0x56, 0x31, 0x30, 0x35, 0x2e, 0x57, 0x41,
+	0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d,
+	0x4f, 0x56, 0x32, 0x30, 0x36, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d, 0x4f, 0x56, 0x31, 0x30, 0x37, 0x2e, 0x57, 0x41,
+	0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d,
+	0x4f, 0x56, 0x31, 0x30, 0x38, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d, 0x4f, 0x56, 0x32, 0x30, 0x39, 0x2e, 0x57, 0x41,
+	0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d,
+	0x4f, 0x56, 0x31, 0x30, 0x31, 0x30, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d, 0x4f, 0x56, 0x32, 0x30, 0x31, 0x31, 0x2e,
+	0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44,
+	0x2f, 0x4d, 0x4f, 0x56, 0x31, 0x30, 0x31, 0x32, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d, 0x39, 0x43, 0x4f, 0x46, 0x49,
+	0x4e, 0x32, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x41, 0x55, 0x44, 0x2f, 0x4d, 0x39, 0x53, 0x54, 0x45, 0x50, 0x53, 0x2e, 0x57, 0x41, 0x56, 0x00,
+	0xff, 0x00, 0x63, 0x00, 0x18, 0x00, 0x00, 0x00, 0x63, 0x00, 0x28, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_20[] = {
+	0x01, 0x00, 0x62, 0x00, 0x0a, 0x00, 0x96, 0x35, 0xcd, 0x14, 0x00, 0x00, 0x00, 0x14, 0x14, 0x00,
+	0x03, 0x00, 0x15, 0x14, 0x00, 0x04, 0x00, 0x16, 0x14, 0x00, 0x05, 0x00, 0xff, 0x14, 0x00, 0x01,
+	0x00, 0x14, 0x00, 0x02, 0x00, 0xc5, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x37, 0x30, 0x38, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38, 0x30, 0x32, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38,
+	0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x37, 0x30, 0x38, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38, 0x30, 0x36, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38,
+	0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x37, 0x30, 0x38, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38, 0x31, 0x30, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38,
+	0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x37, 0x30, 0x38, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38, 0x31, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38, 0x31, 0x34, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38,
+	0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x37, 0x30, 0x38, 0x31, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x1d, 0x00, 0x00,
+	0x00, 0x63, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x24, 0x00, 0x00, 0x00, 0x63, 0x00, 0x68,
+	0x00, 0x00, 0x00, 0x63, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x63,
+	0x00, 0x3e, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_22[] = {
+	0x01, 0x02, 0x62, 0x00, 0x21, 0x00, 0xc8, 0x96, 0x6a, 0x16, 0x00, 0x00, 0x00, 0x16, 0x16, 0x00,
+	0x02, 0x00, 0xff, 0x16, 0x00, 0x01, 0x00, 0x16, 0x00, 0x03, 0x00, 0x85, 0x00, 0x00, 0x63, 0x00,
+	0x1e, 0x00, 0x00, 0x00, 0x63, 0x00, 0x23, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0b, 0x00, 0x00, 0x00,
+	0xff, 0xff,
+};
+static const byte ROOMDATA_24[] = {
+	0x00, 0x02, 0x62, 0x00, 0x19, 0x00, 0xc8, 0x96, 0x6a, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
+	0x02, 0x00, 0xff, 0x18, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x53, 0x55, 0x43, 0x53, 0x50, 0x4c, 0x54, 0x31, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_26[] = {
+	0x03, 0x01, 0x62, 0x00, 0x1c, 0x00, 0xa5, 0x32, 0x8a, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x1a, 0x00,
+	0x03, 0x00, 0x1b, 0x1a, 0x00, 0x04, 0x00, 0x1c, 0x1a, 0x00, 0x05, 0x00, 0x1d, 0x1a, 0x00, 0x06,
+	0x00, 0x1e, 0x1a, 0x00, 0x07, 0x00, 0xff, 0x1a, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x02, 0x00, 0xd3,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x30,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x31, 0x31, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x34,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x31, 0x31, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x38,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x31, 0x31, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x31, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x31, 0x33,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x31, 0x31, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x31, 0x37, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x32, 0x34,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x31, 0x31, 0x32, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x32, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x32, 0x36, 0x42, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x32,
+	0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x34, 0x31, 0x31, 0x32, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x32, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x33, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x33,
+	0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x34, 0x34, 0x30, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x34, 0x34, 0x30, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x34, 0x30, 0x30, 0x32, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x34, 0x30, 0x30,
+	0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
+	0x34, 0x34, 0x30, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x34, 0x34, 0x30, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x31, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33, 0x35,
+	0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x32, 0x33, 0x35, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33, 0x35, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33, 0x35, 0x30,
+	0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x43, 0x32, 0x33, 0x32, 0x32, 0x33, 0x35, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33, 0x32, 0x32, 0x33, 0x35, 0x31, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00, 0x00,
+	0x63, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x28, 0x00,
+	0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_27[] = {
+	0x03, 0x02, 0x62, 0x00, 0x0e, 0x00, 0x48, 0x30, 0x34, 0x1b, 0x00, 0x00, 0x00, 0x1b, 0x1b, 0x00,
+	0x02, 0x00, 0xff, 0x1b, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x5c, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x30, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x44, 0x31, 0x31, 0x32, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x30,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x44, 0x31, 0x31, 0x32, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x30, 0x37,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44,
+	0x31, 0x31, 0x32, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x31, 0x30, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31,
+	0x31, 0x32, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x31, 0x33, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31,
+	0x32, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x31, 0x36, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32,
+	0x31, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x44, 0x31, 0x31, 0x32, 0x31, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x31, 0x39, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x32,
+	0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x44, 0x31, 0x31, 0x32, 0x32, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x32, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x32, 0x33,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44,
+	0x31, 0x31, 0x32, 0x32, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x32, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x32, 0x36, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31,
+	0x31, 0x32, 0x32, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x32, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x32, 0x39, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31,
+	0x32, 0x33, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x33, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x33, 0x32, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32,
+	0x33, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x44, 0x31, 0x31, 0x32, 0x33, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x33, 0x35, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x33,
+	0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x44, 0x31, 0x31, 0x32, 0x33, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x33, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x33, 0x39,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44,
+	0x31, 0x31, 0x32, 0x34, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_28[] = {
+	0x02, 0x02, 0x62, 0x00, 0x1e, 0x00, 0x69, 0x5a, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00,
+	0x02, 0x00, 0xff, 0x1c, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x03, 0x00, 0x86, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x30, 0x31,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38,
+	0x31, 0x33, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x30, 0x35,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38,
+	0x31, 0x33, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x30, 0x39,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38,
+	0x31, 0x33, 0x31, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x31, 0x33,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38,
+	0x31, 0x33, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x31, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x34, 0x30, 0x30,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x31, 0x34, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x31, 0x34, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x34, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x34, 0x31, 0x30,
+	0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x72, 0x00, 0xfe, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_29[] = {
+	0x03, 0x02, 0x62, 0x00, 0x10, 0x00, 0x6e, 0x3e, 0xbe, 0x1d, 0x00, 0x00, 0x00, 0x1d, 0x1d, 0x00,
+	0x03, 0x00, 0xff, 0x1d, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x02, 0x00, 0x8c, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x30, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x41, 0x39, 0x31, 0x35, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x30,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x41, 0x39, 0x31, 0x35, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x30, 0x37,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41,
+	0x39, 0x31, 0x35, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x31, 0x30, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39,
+	0x31, 0x35, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x31, 0x33, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31,
+	0x35, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x31, 0x36, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35,
+	0x31, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x41, 0x39, 0x31, 0x35, 0x31, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x31, 0x39, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x36, 0x30,
+	0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x41, 0x39, 0x31, 0x36, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x36, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x36, 0x30, 0x34,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41,
+	0x39, 0x31, 0x36, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x36, 0x32, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x37, 0x30, 0x30,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41,
+	0x39, 0x31, 0x37, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x37, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x37, 0x30, 0x33, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39,
+	0x31, 0x37, 0x31, 0x31, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x38, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x63, 0x00, 0x25, 0x00, 0x03, 0x00, 0x63, 0x00, 0x1f, 0x00, 0x03, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_30[] = {
+	0x03, 0x03, 0x62, 0x00, 0x13, 0x00, 0x7d, 0x33, 0x5b, 0x1e, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x00,
+	0x02, 0x00, 0xff, 0x1e, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x03, 0x00, 0xa0, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x30, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x38, 0x32, 0x30, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x30,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x43, 0x38, 0x32, 0x30, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x30, 0x37,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43,
+	0x38, 0x32, 0x30, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x31, 0x30, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38,
+	0x32, 0x30, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x31, 0x33, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32,
+	0x30, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x31, 0x36, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30,
+	0x31, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x38, 0x32, 0x30, 0x31, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x31, 0x39, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x32,
+	0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x43, 0x38, 0x32, 0x30, 0x32, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x32, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x32, 0x33,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43,
+	0x38, 0x32, 0x30, 0x32, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x32, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x32, 0x36, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38,
+	0x32, 0x32, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x32, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x32, 0x30, 0x32, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32,
+	0x32, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x32, 0x2f, 0x43, 0x38, 0x32, 0x32, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x32, 0x32, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x32, 0x32, 0x30, 0x31,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x32, 0x32, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x32, 0x32, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x32, 0x32, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x32, 0x32, 0x30, 0x35,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34,
+	0x32, 0x31, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x2f, 0x41, 0x34, 0x32, 0x31, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x32, 0x31, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x37,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x63, 0x00, 0x1b, 0x00, 0x00,
+	0x00, 0x63, 0x00, 0x04, 0x00, 0x03, 0x00, 0x63, 0x00, 0x2c, 0x00, 0x03, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_31[] = {
+	0x00, 0x02, 0x62, 0x00, 0x1a, 0x00, 0xc8, 0x96, 0x6a, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00,
+	0x02, 0x00, 0xff, 0x1f, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x03, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x53, 0x41, 0x4d, 0x30, 0x30, 0x30, 0x42, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x30, 0x32,
+	0x33, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x31, 0x2f, 0x42, 0x30, 0x32, 0x33, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x30, 0x32, 0x33, 0x30, 0x33, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x30, 0x32, 0x33,
+	0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x42, 0x30, 0x32, 0x33, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x30, 0x32, 0x33, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x30, 0x32, 0x33, 0x30,
+	0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x42, 0x30, 0x32, 0x33, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x30, 0x32, 0x33, 0x31, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x30, 0x32, 0x33, 0x31, 0x31,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42,
+	0x30, 0x32, 0x33, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x31, 0x2f, 0x42, 0x30, 0x32, 0x33, 0x31, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x30, 0x32, 0x33, 0x31, 0x34, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_32[] = {
+	0x03, 0x02, 0x62, 0x00, 0x06, 0x00, 0xa4, 0x36, 0x6f, 0x20, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00,
+	0x03, 0x00, 0xff, 0x20, 0x00, 0x01, 0x00, 0x20, 0x00, 0x02, 0x00, 0xd4, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34, 0x30, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x39, 0x32, 0x34, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34, 0x30,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x43, 0x39, 0x32, 0x34, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34, 0x30, 0x37,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43,
+	0x39, 0x32, 0x34, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34, 0x31, 0x30, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x39,
+	0x32, 0x34, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34, 0x31, 0x33, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e,
+	0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_33[] = {
+	0x81, 0x02, 0x62, 0x00, 0x08, 0x00, 0xc8, 0x96, 0x6a, 0x21, 0x00, 0x00, 0x00, 0x21, 0x21, 0x00,
+	0x03, 0x00, 0xff, 0x21, 0x00, 0x01, 0x00, 0x21, 0x00, 0x02, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x30, 0x31, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35,
+	0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x44, 0x30, 0x32, 0x35, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x30,
+	0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x44, 0x30, 0x32, 0x35, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x30, 0x38,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44,
+	0x30, 0x32, 0x35, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x31, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x31, 0x31, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30,
+	0x32, 0x35, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x31, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x31, 0x34, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32,
+	0x35, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x31, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x31, 0x37, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35,
+	0x31, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x44, 0x30, 0x32, 0x35, 0x31, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x32, 0x30, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x32,
+	0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x44, 0x30, 0x32, 0x35, 0x32, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x32, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x32, 0x34,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_34[] = {
+	0x00, 0x02, 0x62, 0x00, 0x23, 0x00, 0xc8, 0x96, 0x6a, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00,
+	0x03, 0x00, 0x23, 0x22, 0x00, 0x04, 0x00, 0xff, 0x22, 0x00, 0x01, 0x00, 0x22, 0x00, 0x02, 0x00,
+	0xff, 0x00, 0x00, 0x63, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x63, 0x00, 0x52, 0x00, 0x00, 0x00, 0x63,
+	0x00, 0x51, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_35[] = {
+	0x03, 0x02, 0x62, 0x00, 0x11, 0x00, 0x5e, 0x36, 0x29, 0x23, 0x00, 0x00, 0x00, 0xff, 0x23, 0x00,
+	0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x78, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x31, 0x2f, 0x42, 0x31, 0x32, 0x36, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x32, 0x36, 0x30, 0x31, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x32, 0x36,
+	0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x42, 0x31, 0x32, 0x36, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x32, 0x36, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x32, 0x36, 0x30,
+	0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x42, 0x31, 0x32, 0x36, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x32, 0x36, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x32, 0x36, 0x30, 0x38,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42,
+	0x31, 0x32, 0x36, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x32, 0x36, 0x31, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x32, 0x36, 0x31, 0x31, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31,
+	0x32, 0x36, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x31, 0x2f, 0x42, 0x31, 0x32, 0x36, 0x31, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x32, 0x36, 0x31, 0x34, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x34,
+	0x31, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x31, 0x2f, 0x42, 0x31, 0x34, 0x31, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x34, 0x31, 0x30, 0x32, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x34, 0x31,
+	0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x42, 0x31, 0x34, 0x31, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x34, 0x31, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x34, 0x31, 0x30,
+	0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x42, 0x31, 0x34, 0x31, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x34, 0x31, 0x32, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x34, 0x31, 0x32,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_37[] = {
+	0x03, 0x02, 0x62, 0x00, 0x24, 0x00, 0x41, 0x2a, 0x38, 0x25, 0x00, 0x00, 0x00, 0x25, 0x25, 0x00,
+	0x03, 0x00, 0xff, 0x25, 0x00, 0x01, 0x00, 0x25, 0x00, 0x02, 0x00, 0x52, 0x00, 0x00, 0x63, 0x00,
+	0x6d, 0x00, 0x00, 0x00, 0x63, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x63, 0x00, 0x50, 0x00, 0x00, 0x00,
+	0xff, 0xff,
+};
+static const byte ROOMDATA_38[] = {
+	0x03, 0x01, 0x62, 0x00, 0x00, 0x00, 0x2d, 0x26, 0x98, 0x26, 0x00, 0x00, 0x00, 0x26, 0x26, 0x00,
+	0x03, 0x00, 0x27, 0x26, 0x00, 0x04, 0x00, 0x28, 0x26, 0x00, 0x05, 0x00, 0x29, 0x26, 0x00, 0x06,
+	0x00, 0xff, 0x26, 0x00, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, 0x39, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x32, 0x32, 0x37, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x32, 0x32, 0x37, 0x30,
+	0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x42, 0x32, 0x32, 0x37, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x32, 0x32, 0x37, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x32, 0x32, 0x37, 0x30, 0x35,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42,
+	0x32, 0x32, 0x37, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x31, 0x2f, 0x42, 0x32, 0x32, 0x37, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x32, 0x32, 0x37, 0x31, 0x30, 0x30,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x63, 0x00, 0x60, 0x00, 0x01,
+	0x00, 0x63, 0x00, 0x6e, 0x00, 0x01, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_39[] = {
+	0x00, 0x02, 0x62, 0x00, 0x18, 0x00, 0xc8, 0x96, 0x6a, 0x27, 0x00, 0x00, 0x00, 0x27, 0x27, 0x00,
+	0x03, 0x00, 0xff, 0x27, 0x00, 0x01, 0x00, 0x27, 0x00, 0x02, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_41[] = {
+	0x03, 0x03, 0x62, 0x00, 0x07, 0x00, 0x4a, 0x1c, 0x30, 0x29, 0x00, 0x00, 0x00, 0x29, 0x29, 0x00,
+	0x03, 0x00, 0xff, 0x29, 0x00, 0x01, 0x00, 0x29, 0x00, 0x02, 0x00, 0x5e, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x30, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x44, 0x32, 0x32, 0x38, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x30,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x44, 0x32, 0x32, 0x38, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x30, 0x38,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44,
+	0x32, 0x32, 0x38, 0x32, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x32, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x32, 0x34, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32,
+	0x32, 0x38, 0x32, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x32, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x32, 0x37, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32,
+	0x38, 0x32, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x32, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x33, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38,
+	0x33, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x44, 0x32, 0x32, 0x38, 0x33, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x33, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x33,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x44, 0x32, 0x32, 0x38, 0x33, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x33, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x33, 0x37,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x46,
+	0x4c, 0x41, 0x53, 0x48, 0x45, 0x52, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x0c, 0x00, 0x00,
+	0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_42[] = {
+	0x81, 0x02, 0x62, 0x00, 0x0d, 0x00, 0xc8, 0x96, 0x6a, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x2a, 0x00,
+	0x03, 0x00, 0x2b, 0x2a, 0x00, 0x04, 0x00, 0x2c, 0x2a, 0x00, 0x05, 0x00, 0x2d, 0x2a, 0x00, 0x06,
+	0x00, 0x2e, 0x2a, 0x00, 0x07, 0x00, 0xff, 0x2a, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x02, 0x00, 0xff,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x32, 0x39, 0x30,
+	0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x42, 0x33, 0x32, 0x39, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x32, 0x39, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x32, 0x39, 0x30, 0x33,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42,
+	0x33, 0x33, 0x30, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x30, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x30, 0x30, 0x32, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33,
+	0x33, 0x30, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x30, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x30, 0x30, 0x35, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33,
+	0x30, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x31, 0x2f, 0x42, 0x33, 0x33, 0x30, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x30, 0x30, 0x38, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x31,
+	0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x34, 0x32, 0x39, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x0d, 0x00, 0x00,
+	0x00, 0x63, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x69, 0x00, 0x00, 0x00, 0x63, 0x00, 0x34,
+	0x00, 0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x63,
+	0x00, 0x2c, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_43[] = {
+	0x03, 0x01, 0x62, 0x00, 0x18, 0x00, 0x75, 0x1d, 0x66, 0x2b, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x00,
+	0x02, 0x00, 0xff, 0x2b, 0x00, 0x01, 0x00, 0x2b, 0x00, 0x03, 0x00, 0x95, 0x00, 0x00, 0x63, 0x00,
+	0x64, 0x00, 0x00, 0x00, 0x63, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0f, 0x00, 0x00, 0x00,
+	0xff, 0xff,
+};
+static const byte ROOMDATA_44[] = {
+	0x00, 0x02, 0x62, 0x00, 0x25, 0x00, 0xa4, 0x96, 0x91, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0x2c, 0x00,
+	0x03, 0x00, 0xff, 0x2c, 0x00, 0x01, 0x00, 0x2c, 0x00, 0x02, 0x00, 0xd1, 0x00, 0x00, 0x63, 0x00,
+	0x6b, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_45[] = {
+	0x01, 0x02, 0x62, 0x00, 0x0b, 0x00, 0x46, 0x22, 0x69, 0x2d, 0x00, 0x00, 0x00, 0x2d, 0x2d, 0x00,
+	0x03, 0x00, 0xff, 0x2d, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x02, 0x00, 0x59, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_46[] = {
+	0x02, 0x02, 0x62, 0x00, 0x0d, 0x00, 0x90, 0x62, 0x3e, 0x2e, 0x00, 0x00, 0x00, 0x2e, 0x2e, 0x00,
+	0x03, 0x00, 0x2f, 0x2e, 0x00, 0x04, 0x00, 0x30, 0x2e, 0x00, 0x05, 0x00, 0x31, 0x2e, 0x00, 0x06,
+	0x00, 0x32, 0x2e, 0x00, 0x07, 0x00, 0x33, 0x2e, 0x00, 0x08, 0x00, 0xff, 0x2e, 0x00, 0x01, 0x00,
+	0x2e, 0x00, 0x02, 0x00, 0xb8, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x42, 0x34, 0x33, 0x32, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x34, 0x33, 0x32, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x34, 0x33, 0x32, 0x30, 0x31,
+	0x41, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x42, 0x34, 0x33, 0x32, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x34, 0x33, 0x32, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x34, 0x33, 0x32, 0x30, 0x34,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42,
+	0x34, 0x33, 0x32, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x31, 0x2f, 0x42, 0x34, 0x33, 0x32, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x31, 0x30, 0x31, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33,
+	0x33, 0x31, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x31, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x31, 0x30, 0x34, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33,
+	0x31, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x31, 0x2f, 0x42, 0x33, 0x33, 0x31, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x31, 0x30, 0x37, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x31,
+	0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x58, 0x00, 0x01, 0x00, 0x63, 0x00, 0x2a,
+	0x00, 0x01, 0x00, 0x63, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x63, 0x00, 0x4c, 0x00, 0x01, 0x00, 0x63,
+	0x00, 0x20, 0x00, 0x01, 0x00, 0x63, 0x00, 0x34, 0x00, 0x01, 0x00, 0x63, 0x00, 0x2c, 0x00, 0x01,
+	0x00, 0x63, 0x00, 0x36, 0x00, 0x01, 0x00, 0x63, 0x00, 0x2d, 0x00, 0x01, 0x00, 0x63, 0x00, 0x68,
+	0x00, 0x01, 0x00, 0x63, 0x00, 0x71, 0x00, 0x01, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_48[] = {
+	0x01, 0x02, 0x62, 0x00, 0x13, 0x00, 0xa0, 0x56, 0x57, 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00,
+	0x03, 0x00, 0xff, 0x30, 0x00, 0x01, 0x00, 0x30, 0x00, 0x02, 0x00, 0xcc, 0x00, 0x00, 0x63, 0x00,
+	0x04, 0x00, 0x00, 0x00, 0x63, 0x00, 0x15, 0x00, 0x00, 0x00, 0x63, 0x00, 0x57, 0x00, 0x00, 0x00,
+	0x63, 0x00, 0x58, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_49[] = {
+	0x01, 0x02, 0x62, 0x00, 0x21, 0x00, 0xa0, 0x47, 0x7b, 0x31, 0x00, 0x00, 0x00, 0x31, 0x31, 0x00,
+	0x02, 0x00, 0xff, 0x31, 0x00, 0x01, 0x00, 0x31, 0x00, 0x03, 0x00, 0xcc, 0x00, 0x00, 0x63, 0x00,
+	0x24, 0x00, 0x00, 0x00, 0x63, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x63, 0x00, 0x29, 0x00, 0x00, 0x00,
+	0xff, 0xff,
+};
+static const byte ROOMDATA_50[] = {
+	0x01, 0x02, 0x62, 0x00, 0x0c, 0x00, 0x50, 0x1a, 0x64, 0x32, 0x00, 0x00, 0x00, 0x32, 0x32, 0x00,
+	0x02, 0x00, 0xff, 0x32, 0x00, 0x01, 0x00, 0x32, 0x00, 0x03, 0x00, 0x66, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x30, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x42, 0x35, 0x33, 0x33, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x30,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x42, 0x35, 0x33, 0x33, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x30, 0x37,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42,
+	0x35, 0x33, 0x33, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x31, 0x30, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35,
+	0x33, 0x33, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x31, 0x33, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33,
+	0x33, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x31, 0x36, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33,
+	0x31, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x42, 0x35, 0x33, 0x33, 0x31, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x31, 0x39, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x32,
+	0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x42, 0x35, 0x33, 0x33, 0x32, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x32, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x32, 0x33,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42,
+	0x35, 0x33, 0x33, 0x32, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x32, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x32, 0x36, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35,
+	0x33, 0x33, 0x31, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_51[] = {
+	0x03, 0x01, 0x62, 0x00, 0x12, 0x00, 0xc8, 0x84, 0x65, 0x33, 0x00, 0x00, 0x00, 0x33, 0x33, 0x00,
+	0x03, 0x00, 0xff, 0x33, 0x00, 0x01, 0x00, 0x33, 0x00, 0x02, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34, 0x30, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31,
+	0x2f, 0x42, 0x39, 0x33, 0x34, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34, 0x30,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f,
+	0x42, 0x39, 0x33, 0x34, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34, 0x30, 0x37,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42,
+	0x39, 0x33, 0x34, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34, 0x31, 0x30, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39,
+	0x33, 0x34, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34, 0x31, 0x33, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33,
+	0x34, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x26, 0x00, 0x00, 0x00, 0x63, 0x00,
+	0x4d, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_52[] = {
+	0x02, 0x01, 0x62, 0x00, 0x20, 0x00, 0x8c, 0x7e, 0x54, 0x34, 0x00, 0x00, 0x00, 0x34, 0x34, 0x00,
+	0x03, 0x00, 0xff, 0x34, 0x00, 0x01, 0x00, 0x34, 0x00, 0x02, 0x00, 0xb3, 0x00, 0x00, 0x63, 0x00,
+	0x56, 0x00, 0x00, 0x00, 0x63, 0x00, 0x4d, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_53[] = {
+	0x00, 0x02, 0x62, 0x00, 0x02, 0x00, 0xc8, 0xb4, 0x77, 0x35, 0x00, 0x00, 0x00, 0x35, 0x35, 0x00,
+	0x03, 0x00, 0xff, 0x35, 0x00, 0x01, 0x00, 0x35, 0x00, 0x02, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_54[] = {
+	0x81, 0x02, 0x62, 0x00, 0x1f, 0x00, 0xc8, 0xb4, 0x77, 0x36, 0x00, 0x00, 0x00, 0x36, 0x36, 0x00,
+	0x02, 0x00, 0xff, 0x36, 0x00, 0x01, 0x00, 0x36, 0x00, 0x03, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x4d, 0x41, 0x43, 0x33, 0x35, 0x30, 0x30, 0x41, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30,
+	0x33, 0x36, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x30, 0x32, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33,
+	0x36, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x30, 0x35, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36,
+	0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x30, 0x33, 0x36, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x30,
+	0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x43, 0x30, 0x33, 0x36, 0x31, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x31, 0x32,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43,
+	0x30, 0x33, 0x36, 0x31, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x31, 0x35, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30,
+	0x33, 0x36, 0x31, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x31, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x31, 0x38, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33,
+	0x36, 0x31, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x32, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x32, 0x31, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36,
+	0x32, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x30, 0x33, 0x36, 0x32, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x32, 0x34, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x32,
+	0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x43, 0x30, 0x33, 0x36, 0x32, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x32, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x32, 0x38,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43,
+	0x30, 0x33, 0x36, 0x32, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x33, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x50, 0x41, 0x53, 0x53, 0x4f, 0x55, 0x54,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x4e, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_55[] = {
+	0x02, 0x02, 0x62, 0x00, 0x26, 0x00, 0xb9, 0x51, 0xa3, 0x37, 0x00, 0x00, 0x00, 0x37, 0x37, 0x00,
+	0x02, 0x00, 0x38, 0x37, 0x00, 0x03, 0x00, 0x39, 0x37, 0x00, 0x04, 0x00, 0x3a, 0x37, 0x00, 0x05,
+	0x00, 0x3b, 0x37, 0x00, 0x06, 0x00, 0x3c, 0x37, 0x00, 0x07, 0x00, 0x3d, 0x37, 0x00, 0x08, 0x00,
+	0x3e, 0x37, 0x00, 0x09, 0x00, 0x3f, 0x37, 0x00, 0x0a, 0x00, 0x40, 0x37, 0x00, 0x0b, 0x00, 0xff,
+	0x37, 0x00, 0x01, 0x00, 0x37, 0x00, 0x0c, 0x00, 0xb7, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x31, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x31, 0x37, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x31,
+	0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x16, 0x00, 0x01, 0x00, 0x63, 0x00, 0x55, 0x00,
+	0x01, 0x00, 0x63, 0x00, 0x63, 0x00, 0x01, 0x00, 0x63, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x63, 0x00,
+	0x7a, 0x00, 0x01, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_57[] = {
+	0x03, 0x01, 0x62, 0x00, 0x0c, 0x00, 0xa0, 0x46, 0x85, 0x39, 0x00, 0x00, 0x00, 0x39, 0x39, 0x00,
+	0x02, 0x00, 0x3a, 0x39, 0x00, 0x03, 0x00, 0xff, 0x39, 0x00, 0x01, 0x00, 0x39, 0x00, 0x04, 0x00,
+	0xcc, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x00, 0x00, 0x63, 0x00, 0x62, 0x00, 0x00, 0x00, 0x63,
+	0x00, 0x4d, 0x00, 0x01, 0x00, 0x63, 0x00, 0x68, 0x00, 0x01, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_58[] = {
+	0x03, 0x02, 0x62, 0x00, 0x25, 0x00, 0x57, 0x48, 0x71, 0x3a, 0x00, 0x00, 0x00, 0x3a, 0x3a, 0x00,
+	0x02, 0x00, 0x3b, 0x3a, 0x00, 0x03, 0x00, 0xff, 0x3a, 0x00, 0x01, 0x00, 0x3a, 0x00, 0x04, 0x00,
+	0x6f, 0x00, 0x00, 0x63, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x31, 0x00, 0x01, 0x00, 0x63,
+	0x00, 0x68, 0x00, 0x01, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_59[] = {
+	0x03, 0x02, 0x62, 0x00, 0x21, 0x00, 0x70, 0x4b, 0x83, 0x3b, 0x00, 0x00, 0x00, 0x3b, 0x3b, 0x00,
+	0x02, 0x00, 0xff, 0x3b, 0x00, 0x01, 0x00, 0x3b, 0x00, 0x03, 0x00, 0x8f, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x31, 0x39, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x63, 0x00, 0x4b, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_60[] = {
+	0x03, 0x02, 0x62, 0x00, 0x17, 0x00, 0x96, 0x30, 0x90, 0x3c, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00,
+	0x02, 0x00, 0xff, 0x3c, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x63, 0x00,
+	0x16, 0x00, 0x00, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x01, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_61[] = {
+	0x03, 0x02, 0x62, 0x00, 0x0c, 0x00, 0x5a, 0x25, 0x6e, 0x3d, 0x00, 0x00, 0x00, 0x3d, 0x3d, 0x00,
+	0x03, 0x00, 0xff, 0x3d, 0x00, 0x01, 0x00, 0x3d, 0x00, 0x02, 0x00, 0x73, 0x00, 0x00, 0x63, 0x00,
+	0x5b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0b, 0x00, 0x01, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_62[] = {
+	0x03, 0x02, 0x62, 0x00, 0x0e, 0x00, 0x9d, 0x28, 0x78, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00,
+	0x02, 0x00, 0xff, 0x3e, 0x00, 0x01, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xc8, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_63[] = {
+	0x03, 0x02, 0x62, 0x00, 0x13, 0x00, 0xb4, 0x8e, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x00,
+	0x02, 0x00, 0xff, 0x3f, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x03, 0x00, 0xe6, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x32, 0x30, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x63, 0x00, 0x2d, 0x00, 0x01, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_64[] = {
+	0x03, 0x03, 0x62, 0x00, 0x0c, 0x00, 0x3c, 0x17, 0xb6, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00,
+	0x02, 0x00, 0xff, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x03, 0x00, 0x4d, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_65[] = {
+	0x81, 0x02, 0x62, 0x00, 0x25, 0x00, 0x70, 0x4b, 0x83, 0x41, 0x00, 0x00, 0x00, 0x41, 0x41, 0x00,
+	0x02, 0x00, 0xff, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x03, 0x00, 0x8f, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x30, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x31, 0x33, 0x38, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x30,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x43, 0x31, 0x33, 0x38, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x30, 0x37,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43,
+	0x31, 0x33, 0x38, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x31, 0x30, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31,
+	0x33, 0x38, 0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x31, 0x33, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33,
+	0x38, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x31, 0x36, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38,
+	0x31, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x31, 0x33, 0x38, 0x32, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x31, 0x30, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38,
+	0x31, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x31, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x32, 0x30, 0x30, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31,
+	0x33, 0x38, 0x52, 0x45, 0x46, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x63, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x63, 0x00, 0x30, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_67[] = {
+	0x01, 0x02, 0x62, 0x00, 0x14, 0x00, 0x7e, 0x40, 0x6c, 0x43, 0x00, 0x00, 0x00, 0x43, 0x43, 0x00,
+	0x03, 0x00, 0xff, 0x43, 0x00, 0x01, 0x00, 0x43, 0x00, 0x02, 0x00, 0xa1, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x52, 0x4c, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x63, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x49, 0x00, 0x01, 0x00, 0x63, 0x00, 0x6f,
+	0x00, 0x01, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_68[] = {
+	0x01, 0x02, 0x62, 0x00, 0x0b, 0x00, 0x5b, 0x40, 0x8d, 0x44, 0x00, 0x00, 0x00, 0x44, 0x44, 0x00,
+	0x02, 0x00, 0x45, 0x44, 0x00, 0x03, 0x00, 0xff, 0x44, 0x00, 0x01, 0x00, 0x44, 0x00, 0x04, 0x00,
+	0x74, 0x00, 0x00, 0x63, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x63, 0x00, 0x39, 0x00, 0x00, 0x00, 0x63,
+	0x00, 0x50, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_69[] = {
+	0x01, 0x02, 0x62, 0x00, 0x14, 0x00, 0x60, 0x24, 0x4b, 0x45, 0x00, 0x00, 0x00, 0x45, 0x45, 0x00,
+	0x02, 0x00, 0xff, 0x45, 0x00, 0x01, 0x00, 0x45, 0x00, 0x03, 0x00, 0x7a, 0x00, 0x00, 0x63, 0x00,
+	0x66, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_70[] = {
+	0x01, 0x02, 0x62, 0x00, 0x20, 0x00, 0x7d, 0x6b, 0xba, 0x46, 0x00, 0x00, 0x00, 0x46, 0x46, 0x00,
+	0x02, 0x00, 0xff, 0x46, 0x00, 0x01, 0x00, 0x46, 0x00, 0x03, 0x00, 0xa0, 0x00, 0x00, 0x63, 0x00,
+	0x6a, 0x00, 0x00, 0x00, 0x63, 0x00, 0x2b, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_71[] = {
+	0x81, 0x02, 0x62, 0x00, 0x1f, 0x00, 0x87, 0x72, 0x2d, 0x47, 0x00, 0x00, 0x00, 0x47, 0x47, 0x00,
+	0x02, 0x00, 0x48, 0x47, 0x00, 0x03, 0x00, 0xff, 0x47, 0x00, 0x01, 0x00, 0x47, 0x00, 0x04, 0x00,
+	0xad, 0x00, 0x00, 0x63, 0x00, 0x53, 0x00, 0x00, 0x00, 0x63, 0x00, 0x37, 0x00, 0x01, 0x00, 0x63,
+	0x00, 0x2e, 0x00, 0x01, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_72[] = {
+	0x81, 0x02, 0x62, 0x00, 0x0c, 0x00, 0xc8, 0xc6, 0x27, 0x48, 0x00, 0x00, 0x00, 0x48, 0x48, 0x00,
+	0x03, 0x00, 0xff, 0x48, 0x00, 0x01, 0x00, 0x48, 0x00, 0x02, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x46, 0x49, 0x52, 0x45, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0xff, 0xff,
+};
+static const byte ROOMDATA_73[] = {
+	0x01, 0x03, 0x62, 0x00, 0x09, 0x00, 0x20, 0x0c, 0x60, 0x49, 0x00, 0x00, 0x00, 0x49, 0x49, 0x00,
+	0x02, 0x00, 0xff, 0x49, 0x00, 0x01, 0x00, 0x49, 0x00, 0x03, 0x00, 0x29, 0x00, 0x00, 0x63, 0x00,
+	0x68, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_74[] = {
+	0x01, 0x02, 0x62, 0x00, 0x21, 0x00, 0x28, 0x25, 0x54, 0x4a, 0x00, 0x00, 0x00, 0x4a, 0x4a, 0x00,
+	0x02, 0x00, 0xff, 0x4a, 0x00, 0x01, 0x00, 0x4a, 0x00, 0x03, 0x00, 0x33, 0x00, 0x00, 0x63, 0x00,
+	0x43, 0x00, 0x00, 0x00, 0x63, 0x00, 0x44, 0x00, 0xfe, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_81[] = {
+	0x01, 0x02, 0x62, 0x00, 0x17, 0x00, 0x54, 0x50, 0xbb, 0x51, 0x00, 0x00, 0x00, 0x51, 0x51, 0x00,
+	0x02, 0x00, 0x52, 0x51, 0x00, 0x03, 0x00, 0xff, 0x51, 0x00, 0x01, 0x00, 0x51, 0x00, 0x04, 0x00,
+	0x6c, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33, 0x39,
+	0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x32, 0x33, 0x39, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33, 0x32, 0x32, 0x33, 0x39, 0x30, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33,
+	0x32, 0x32, 0x33, 0x39, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33, 0x32, 0x32, 0x33, 0x39, 0x36, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x63, 0x00, 0x19, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_82[] = {
+	0x81, 0x02, 0x62, 0x00, 0x00, 0x00, 0x48, 0x2c, 0x7b, 0x52, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00,
+	0x02, 0x00, 0xff, 0x52, 0x00, 0x01, 0x00, 0x52, 0x00, 0x03, 0x00, 0xff, 0x00, 0x00, 0x63, 0x00,
+	0x33, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_85[] = {
+	0x03, 0x02, 0x62, 0x00, 0x24, 0x00, 0x68, 0x39, 0x68, 0x55, 0x00, 0x00, 0x00, 0x55, 0x55, 0x00,
+	0x02, 0x00, 0xff, 0x55, 0x00, 0x01, 0x00, 0x55, 0x00, 0x03, 0x00, 0x85, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x32, 0x34,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x63, 0x00, 0x59, 0x00, 0x01,
+	0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_86[] = {
+	0x01, 0x02, 0x62, 0x00, 0x18, 0x00, 0x78, 0x46, 0x69, 0x56, 0x00, 0x00, 0x00, 0x56, 0x56, 0x00,
+	0x02, 0x00, 0xff, 0x56, 0x00, 0x01, 0x00, 0x56, 0x00, 0x03, 0x00, 0x99, 0x00, 0x00, 0x63, 0x00,
+	0x28, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_87[] = {
+	0x01, 0x02, 0x62, 0x00, 0x11, 0x00, 0xa5, 0x9b, 0x69, 0x57, 0x00, 0x00, 0x00, 0x57, 0x57, 0x00,
+	0x02, 0x00, 0x58, 0x57, 0x00, 0x03, 0x00, 0xff, 0x57, 0x00, 0x01, 0x00, 0x57, 0x00, 0x04, 0x00,
+	0xd3, 0x00, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
+	0x38, 0x37, 0x30, 0x30, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32, 0x38, 0x37, 0x30, 0x31, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
+	0x38, 0x37, 0x30, 0x32, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32, 0x38, 0x37, 0x30, 0x33, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
+	0x38, 0x37, 0x30, 0x34, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32, 0x38, 0x37, 0x30, 0x35, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
+	0x38, 0x37, 0x30, 0x36, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32, 0x38, 0x37, 0x30, 0x37, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
+	0x38, 0x37, 0x30, 0x38, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32, 0x38, 0x37, 0x30, 0x39, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
+	0x38, 0x37, 0x31, 0x30, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32, 0x38, 0x37, 0x31, 0x31, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
+	0x38, 0x37, 0x31, 0x32, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32, 0x38, 0x37, 0x31, 0x33, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
+	0x38, 0x37, 0x31, 0x34, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32, 0x38, 0x37, 0x31, 0x35, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
+	0x38, 0x37, 0x31, 0x36, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32, 0x38, 0x37, 0x31, 0x37, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
+	0x38, 0x37, 0x31, 0x38, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32, 0x38, 0x37, 0x31, 0x39, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
+	0x38, 0x37, 0x32, 0x30, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32, 0x38, 0x37, 0x32, 0x31, 0x2e, 0x57, 0x41, 0x56,
+	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
+	0x38, 0x37, 0x32, 0x32, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_89[] = {
+	0x03, 0x02, 0x62, 0x00, 0x1d, 0x00, 0x32, 0x28, 0xef, 0x59, 0x00, 0x00, 0x00, 0x59, 0x59, 0x00,
+	0x02, 0x00, 0xff, 0x59, 0x00, 0x01, 0x00, 0x59, 0x00, 0x03, 0x00, 0x40, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x32, 0x38, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x63, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_90[] = {
+	0x03, 0x02, 0x62, 0x00, 0x1e, 0x00, 0x96, 0x64, 0xff, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x5a, 0x00,
+	0x03, 0x00, 0xff, 0x5a, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x02, 0x00, 0xbf, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_91[] = {
+	0x03, 0x01, 0x62, 0x00, 0x00, 0x00, 0x32, 0x2e, 0x2b, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x5b, 0x00,
+	0x03, 0x00, 0x5c, 0x5b, 0x00, 0x04, 0x00, 0x5d, 0x5b, 0x00, 0x05, 0x00, 0xff, 0x5b, 0x00, 0x01,
+	0x00, 0x5b, 0x00, 0x02, 0x00, 0x3f, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
+	0x41, 0x34, 0x34, 0x33, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x33, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x30, 0x31, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34,
+	0x34, 0x33, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x30, 0x32, 0x41, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x30, 0x34, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34,
+	0x34, 0x33, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x30, 0x37, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34,
+	0x33, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x31, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33,
+	0x31, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x34, 0x34, 0x33, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x31, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x31,
+	0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x43, 0x34, 0x34, 0x33, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x31, 0x35, 0x41, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x31,
+	0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
+	0x43, 0x34, 0x34, 0x33, 0x31, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x31, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x31, 0x39,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43,
+	0x34, 0x34, 0x33, 0x32, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x32, 0x30, 0x41, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x32, 0x31,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43,
+	0x34, 0x34, 0x33, 0x32, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
+	0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x32, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x32, 0x34, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34,
+	0x34, 0x33, 0x32, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49,
+	0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x32, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x32, 0x37, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34,
+	0x33, 0x32, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x32, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x33, 0x30, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33,
+	0x33, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x34, 0x34, 0x33, 0x33, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x33, 0x33, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x33,
+	0x33, 0x41, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x34, 0x34, 0x33, 0x33, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x33, 0x35, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x31,
+	0x32, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32,
+	0x2f, 0x43, 0x34, 0x34, 0x33, 0x31, 0x32, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x35, 0x30, 0x30, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x46, 0x4c, 0x49,
+	0x50, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x38, 0x00, 0x00, 0x00, 0x63, 0x00, 0x45,
+	0x00, 0x00, 0x00, 0x63, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x63,
+	0x00, 0x6c, 0x00, 0x00, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f,
+	0x45, 0x4c, 0x34, 0x34, 0x30, 0x30, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x45, 0x4c, 0x34, 0x34, 0x30, 0x31, 0x2e, 0x57,
+	0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f,
+	0x45, 0x4c, 0x34, 0x34, 0x30, 0x33, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x45, 0x4c, 0x34, 0x34, 0x30, 0x35, 0x2e, 0x57,
+	0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f,
+	0x45, 0x4c, 0x34, 0x34, 0x30, 0x36, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x45, 0x4c, 0x34, 0x34, 0x30, 0x37, 0x2e, 0x57,
+	0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f,
+	0x45, 0x4c, 0x34, 0x34, 0x36, 0x30, 0x39, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0x63, 0x00,
+	0x82, 0x00, 0x00, 0x00, 0x63, 0x00, 0x83, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_92[] = {
+	0x00, 0x02, 0x62, 0x00, 0x0f, 0x00, 0xb9, 0xa7, 0x69, 0x5c, 0x00, 0x00, 0x00, 0xff, 0x5c, 0x00,
+	0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xec, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
+	0x31, 0x2f, 0x53, 0x49, 0x4c, 0x4c, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_93[] = {
+	0x81, 0x02, 0x62, 0x00, 0x01, 0x00, 0xb9, 0xa7, 0x69, 0x5d, 0x00, 0x00, 0x00, 0x5d, 0x5d, 0x00,
+	0x03, 0x00, 0xff, 0x5d, 0x00, 0x01, 0x00, 0x5d, 0x00, 0x02, 0x00, 0xec, 0x00, 0x00, 0x63, 0x00,
+	0x76, 0x00, 0x00, 0x00, 0x63, 0x00, 0x77, 0x00, 0x00, 0x00, 0x63, 0x00, 0x78, 0x00, 0x00, 0x00,
+	0x63, 0x00, 0x79, 0x00, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_94[] = {
+	0x02, 0x02, 0x62, 0x00, 0x06, 0x00, 0x55, 0x50, 0xff, 0x5e, 0x00, 0x00, 0x00, 0x1c, 0x5e, 0x00,
+	0x02, 0x00, 0xff, 0x5e, 0x00, 0x01, 0x00, 0x5e, 0x00, 0x03, 0x00, 0x6c, 0x00, 0x00, 0x63, 0x00,
+	0x2d, 0x00, 0x01, 0x00, 0x63, 0x00, 0x1a, 0x00, 0x01, 0x00, 0x63, 0x00, 0x35, 0x00, 0x01, 0x00,
+	0xff, 0xff,
+};
+static const byte ROOMDATA_95[] = {
+	0x03, 0x02, 0x62, 0x00, 0x06, 0x00, 0x96, 0x64, 0xff, 0x5f, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x00,
+	0x03, 0x00, 0xff, 0x5f, 0x00, 0x01, 0x00, 0x5f, 0x00, 0x02, 0x00, 0xbf, 0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_96[] = {
+	0x03, 0x02, 0x62, 0x00, 0x26, 0x00, 0x96, 0x64, 0xff, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00,
+	0x03, 0x00, 0x61, 0x60, 0x00, 0x04, 0x00, 0xff, 0x60, 0x00, 0x01, 0x00, 0x60, 0x00, 0x02, 0x00,
+	0xbf, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x32,
+	0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x46, 0x00, 0x00, 0x00, 0x63, 0x00, 0x47, 0x00,
+	0x00, 0x00, 0xff, 0xff,
+};
+static const byte ROOMDATA_97[] = {
+	0x81, 0x01, 0x62, 0x00, 0x26, 0x00, 0x32, 0x2e, 0x2b, 0x61, 0x00, 0x00, 0x00, 0x61, 0x61, 0x00,
+	0x03, 0x00, 0xff, 0x61, 0x00, 0x01, 0x00, 0x61, 0x00, 0x02, 0x00, 0x3f, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x32, 0x30, 0x31, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x34,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53,
+	0x2f, 0x42, 0x4c, 0x33, 0x31, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x32, 0x37, 0x30, 0x31, 0x41, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x38,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53,
+	0x2f, 0x42, 0x4c, 0x33, 0x31, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x38, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44,
+	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x32, 0x38, 0x30,
+	0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f,
+	0x42, 0x4c, 0x33, 0x31, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
+	0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x34, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x32, 0x38, 0x30, 0x35,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42,
+	0x4c, 0x30, 0x37, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f,
+	0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x32, 0x38, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x34, 0x30, 0x36, 0x41,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42,
+	0x4c, 0x32, 0x38, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f,
+	0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x34, 0x30, 0x36, 0x42, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x34, 0x30, 0x36,
+	0x43, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f,
+	0x42, 0x4c, 0x32, 0x37, 0x30, 0x31, 0x41, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b,
+	0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x34, 0x30, 0x36, 0x45, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x34,
+	0x30, 0x36, 0x46, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50,
+	0x53, 0x2f, 0x42, 0x4c, 0x30, 0x34, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
+	0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x37, 0x30, 0x34, 0x2e, 0x56, 0x49,
+	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x32, 0x39,
+	0x30, 0x31, 0x41, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50,
+	0x53, 0x2f, 0x42, 0x4c, 0x32, 0x39, 0x30, 0x31, 0x42, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x32, 0x38, 0x30, 0x33, 0x2e, 0x56,
+	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30,
+	0x34, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50,
+	0x53, 0x2f, 0x42, 0x4c, 0x32, 0x39, 0x30, 0x32, 0x41, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x32, 0x39, 0x30, 0x32, 0x42, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c,
+	0x32, 0x37, 0x30, 0x31, 0x41, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f,
+	0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x32, 0x39, 0x30, 0x32, 0x43, 0x2e, 0x56, 0x49, 0x44, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x32, 0x34, 0x30, 0x31,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42,
+	0x4c, 0x32, 0x38, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f,
+	0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x32, 0x34, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x32, 0x34, 0x30, 0x33, 0x2e,
+	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c,
+	0x32, 0x37, 0x30, 0x31, 0x41, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f,
+	0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x33, 0x30, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
+	0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x34, 0x30, 0x36, 0x43,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42,
+	0x41, 0x52, 0x53, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+};
+
+
+
 ///////////////////////////////////////////////////////////////
 
 
@@ -105,6 +1468,108 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	_vm->_fonts.addFont(_fontGothiceu);
 	_vm->_fonts.addFont(_fontChaletse);
 	_vm->_fonts.addFont(_fontComicseu);
+
+	// Set up the room data
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_02, ARRAYSIZE(ROOMDATA_02))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_03, ARRAYSIZE(ROOMDATA_03))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_04, ARRAYSIZE(ROOMDATA_04))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_11, ARRAYSIZE(ROOMDATA_11))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_12, ARRAYSIZE(ROOMDATA_12))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_13, ARRAYSIZE(ROOMDATA_13))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_14, ARRAYSIZE(ROOMDATA_14))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_15, ARRAYSIZE(ROOMDATA_15))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_16, ARRAYSIZE(ROOMDATA_16))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_17, ARRAYSIZE(ROOMDATA_17))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_18, ARRAYSIZE(ROOMDATA_18))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_20, ARRAYSIZE(ROOMDATA_20))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_22, ARRAYSIZE(ROOMDATA_22))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_24, ARRAYSIZE(ROOMDATA_24))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_26, ARRAYSIZE(ROOMDATA_26))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_27, ARRAYSIZE(ROOMDATA_27))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_28, ARRAYSIZE(ROOMDATA_28))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_29, ARRAYSIZE(ROOMDATA_29))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_30, ARRAYSIZE(ROOMDATA_30))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_31, ARRAYSIZE(ROOMDATA_31))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_32, ARRAYSIZE(ROOMDATA_32))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_33, ARRAYSIZE(ROOMDATA_33))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_34, ARRAYSIZE(ROOMDATA_34))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_35, ARRAYSIZE(ROOMDATA_35))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_37, ARRAYSIZE(ROOMDATA_37))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_38, ARRAYSIZE(ROOMDATA_38))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_39, ARRAYSIZE(ROOMDATA_39))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_41, ARRAYSIZE(ROOMDATA_41))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_42, ARRAYSIZE(ROOMDATA_42))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_43, ARRAYSIZE(ROOMDATA_43))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_44, ARRAYSIZE(ROOMDATA_44))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_45, ARRAYSIZE(ROOMDATA_45))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_46, ARRAYSIZE(ROOMDATA_46))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_48, ARRAYSIZE(ROOMDATA_48))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_49, ARRAYSIZE(ROOMDATA_49))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_50, ARRAYSIZE(ROOMDATA_50))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_51, ARRAYSIZE(ROOMDATA_51))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_52, ARRAYSIZE(ROOMDATA_52))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_53, ARRAYSIZE(ROOMDATA_53))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_54, ARRAYSIZE(ROOMDATA_54))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_55, ARRAYSIZE(ROOMDATA_55))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_57, ARRAYSIZE(ROOMDATA_57))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_58, ARRAYSIZE(ROOMDATA_58))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_59, ARRAYSIZE(ROOMDATA_59))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_60, ARRAYSIZE(ROOMDATA_60))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_61, ARRAYSIZE(ROOMDATA_61))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_62, ARRAYSIZE(ROOMDATA_62))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_63, ARRAYSIZE(ROOMDATA_63))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_64, ARRAYSIZE(ROOMDATA_64))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_65, ARRAYSIZE(ROOMDATA_65))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_67, ARRAYSIZE(ROOMDATA_67))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_68, ARRAYSIZE(ROOMDATA_68))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_69, ARRAYSIZE(ROOMDATA_69))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_70, ARRAYSIZE(ROOMDATA_70))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_71, ARRAYSIZE(ROOMDATA_71))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_72, ARRAYSIZE(ROOMDATA_72))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_73, ARRAYSIZE(ROOMDATA_73))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_74, ARRAYSIZE(ROOMDATA_74))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_81, ARRAYSIZE(ROOMDATA_81))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_82, ARRAYSIZE(ROOMDATA_82))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_85, ARRAYSIZE(ROOMDATA_85))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_86, ARRAYSIZE(ROOMDATA_86))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_87, ARRAYSIZE(ROOMDATA_87))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_89, ARRAYSIZE(ROOMDATA_89))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_90, ARRAYSIZE(ROOMDATA_90))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_91, ARRAYSIZE(ROOMDATA_91))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_92, ARRAYSIZE(ROOMDATA_92))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_93, ARRAYSIZE(ROOMDATA_93))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_94, ARRAYSIZE(ROOMDATA_94))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_95, ARRAYSIZE(ROOMDATA_95))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_96, ARRAYSIZE(ROOMDATA_96))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_97, ARRAYSIZE(ROOMDATA_97))}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
 }
 
 
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 30bcdeee7ea..8939db79842 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -29,6 +29,14 @@ namespace Noctropolis {
 NoctropolisRoom::NoctropolisRoom(AccessEngine *vm): Room(vm) {
 }
 
+void NoctropolisRoom::reloadRoom() {
+	loadRoom(_vm->_player->_roomNumber);
+	reloadRoom1();
+}
+
+void NoctropolisRoom::reloadRoom1() {
+}
+
 void NoctropolisRoom::buildScreenXScroll() {
 	int drawCol = _vm->_scrollCol;
 	int offset = -_vm->_scrollX;
diff --git a/engines/access/noctropolis/noctropolis_room.h b/engines/access/noctropolis/noctropolis_room.h
index 5ade7ef9a8f..04f4ed91095 100644
--- a/engines/access/noctropolis/noctropolis_room.h
+++ b/engines/access/noctropolis/noctropolis_room.h
@@ -32,8 +32,6 @@ class NoctropolisRoom : public Room {
 public:
 	NoctropolisRoom(AccessEngine *vm);
 
-	void loadRoom(int roomNumber) override {};
-
 	void roomMenu() override {};
 
 	void init4Quads() override {};
@@ -44,9 +42,9 @@ public:
 	void buildScreenXScroll();
 
 protected:
-	void reloadRoom() override {};
+	void reloadRoom() override;
 	
-	void reloadRoom1() override {};
+	void reloadRoom1() override;
 
 	void mainAreaClick() override {}
 
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index ff772840d28..623fd63cde0 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -50,6 +50,10 @@ Room::~Room() {
 	delete[] _tile;
 }
 
+void Room::loadRoom(int roomNumber) {
+	loadRoomData(_vm->_res->ROOMTBL[roomNumber]._data.data());
+}
+
 void Room::freePlayField() {
 	delete[] _playField;
 	_playField = nullptr;
@@ -1035,10 +1039,11 @@ RoomInfo::RoomInfo(const byte *data, AccessGameType gameType, bool isCD, bool is
 	_animFile.load(stream, gameType);
 	_scaleI = stream.readByte();
 	_scrollThreshold = stream.readByte();
-	if (gameType != kGameNoctropolis)
+
+	if (gameType != kGameNoctropolis) {
 		_paletteFile.load(stream, gameType);
-	else
-		stream.skip(8);
+	}
+
 	if (_paletteFile._fileNum == -1) {
 		_startColor = _numColors = 0;
 	} else {
@@ -1046,18 +1051,35 @@ RoomInfo::RoomInfo(const byte *data, AccessGameType gameType, bool isCD, bool is
 		_numColors = stream.readUint16LE();
 	}
 
-	for (int16 v = stream.readSint16LE(); v != -1; v = stream.readSint16LE()) {
-		ExtraCell ec;
-		ec._vid._fileNum = v;
-		ec._vid._subfile = stream.readSint16LE();
+	if (gameType != kGameNoctropolis) {
+		for (int16 v = stream.readSint16LE(); v != -1; v = stream.readSint16LE()) {
+			ExtraCell ec;
+			ec._vid._fileNum = v;
+			ec._vid._subfile = stream.readSint16LE();
 
-		_extraCells.push_back(ec);
+			_extraCells.push_back(ec);
+		}
+	} else {
+		// Noctropolis has a null-terminated series of filenames
+		while (!stream.eos()) {
+			Common::String fname = stream.readString();
+			if (fname.empty())
+				break;
+			ExtraCell ec;
+			ec._vidFilename = fname;
+			_extraCells.push_back(ec);
+		}
 	}
 
 	for (int16 fileNum = stream.readSint16LE(); fileNum != -1; fileNum = stream.readSint16LE()) {
 		SoundIdent fi;
 		fi._fileNum = fileNum;
-		fi._subfile = stream.readUint16LE();
+		if (fileNum == 0xff) {
+			fi._fileNum = -1;
+			fi._soundFilename = stream.readString();
+		} else {
+			fi._subfile = stream.readUint16LE();
+		}
 		fi._priority = stream.readUint16LE();
 
 		_sounds.push_back(fi);
diff --git a/engines/access/room.h b/engines/access/room.h
index 7a200bee78c..4485160e9f6 100644
--- a/engines/access/room.h
+++ b/engines/access/room.h
@@ -138,7 +138,7 @@ public:
 
 	void doRoom();
 
-	virtual void loadRoom(int roomNumber) = 0;
+	void loadRoom(int roomNumber);
 
 	virtual void roomMenu() = 0;
 
@@ -179,6 +179,7 @@ public:
 class RoomInfo {
 public:
 	struct SoundIdent : FileIdent {
+		Common::String _soundFilename;
 		int _priority;
 	};
 public:
diff --git a/engines/access/sound.cpp b/engines/access/sound.cpp
index b95963f6d38..caf26b0af8b 100644
--- a/engines/access/sound.cpp
+++ b/engines/access/sound.cpp
@@ -26,8 +26,9 @@
 #include "audio/midiparser.h"
 #include "audio/decoders/raw.h"
 #include "audio/decoders/wave.h"
-// Miles Audio
 #include "audio/miles.h"
+#include "audio/midiparser_smf.h"
+
 #include "access/access.h"
 #include "access/sound.h"
 
@@ -109,7 +110,7 @@ void SoundManager::playSound(Resource *res, int priority, bool loop, int soundIn
 	Audio::RewindableAudioStream *audioStream;
 
 	if (READ_BE_UINT32(resourceData) == MKTAG('R','I','F','F')) {
-		// CD version uses WAVE-files
+		// Noctropolis and Amazon CD version use raw WAVE-files
 		Common::SeekableReadStream *waveStream = new Common::MemoryReadStream(resourceData, res->_size, DisposeAfterUse::NO);
 		audioStream = Audio::makeWAVStream(waveStream, DisposeAfterUse::YES);
 	} else if (READ_BE_UINT32(resourceData) == MKTAG('S', 'T', 'E', 'V')) {
@@ -198,7 +199,19 @@ void SoundManager::loadSounds(const Common::Array<RoomInfo::SoundIdent> &sounds)
 	clearSounds();
 
 	for (const auto &sound : sounds) {
-		Resource *soundRes = loadSound(sound._fileNum, sound._subfile);
+		Resource *soundRes;
+		if (sound._soundFilename.empty()) {
+			soundRes = loadSound(sound._fileNum, sound._subfile);
+		} else {
+			// TODO: should be running from DARK parent directory
+			Common::Path origpath = Common::Path(sound._soundFilename);
+			Common::StringArray components = origpath.splitComponents();
+			assert(components.size() == 3);
+			Common::Path path (components[1]);
+			path.joinInPlace(components[2]);
+			debugC(1, kDebugSound, "loadRawSound(%s)", path.toString().c_str());
+			soundRes = _vm->_files->loadRawFile(path);
+		}
 		_soundTable.push_back(SoundEntry(soundRes, sound._priority));
 	}
 }
@@ -311,7 +324,19 @@ void MusicManager::midiPlay() {
 	stop();
 
 	uint32 magic = READ_BE_UINT32(_music->data());
-	if (magic == MKTAG('B', 'E', 'm', 'd')) {
+	if (magic == MKTAG('M', 'T', 'h', 'd')) {
+		_parser = new MidiParser_SMF();
+
+		if (!_parser->loadMusic(_music->data(), _music->_size))
+			error("midiPlay() couldn't load music resource");
+
+		_parser->setTrack(0);
+		_parser->setMidiDriver(this);
+		_parser->setTimerRate(_driver->getBaseTempo());
+		_parser->property(MidiParser::mpAutoLoop, _isLooping);
+		setVolume(127);
+		_isPlaying = true;
+	} else if (magic == MKTAG('B', 'E', 'm', 'd')) {
 		_parser = new MidiParser_BEmd();
 
 		if (!_parser->loadMusic(_music->data(), _music->_size))


Commit: ff822a7703d7159c869011aa054c582622eae4f6
    https://github.com/scummvm/scummvm/commit/ff822a7703d7159c869011aa054c582622eae4f6
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add mouse cursor extraction for Noctropolis

Changed paths:
    devtools/create_access/extract_noctropolis_resources.py


diff --git a/devtools/create_access/extract_noctropolis_resources.py b/devtools/create_access/extract_noctropolis_resources.py
index 66517a836b8..ebe02c935b4 100644
--- a/devtools/create_access/extract_noctropolis_resources.py
+++ b/devtools/create_access/extract_noctropolis_resources.py
@@ -8,224 +8,266 @@ extract the data and read it with our code as-is.  Instead, we pull out the
 individual bits and print them out to go into CPP files.
 """
 
-def read_c_string(f, offset = None):
-	"""Read a null-terminated string from file starting at offset."""
-	if offset is not None:
-		f.seek(offset)
-	chars = []
-	while True:
-		b = f.read(1)
-		if not b or b == b'\x00':
-			break
-		chars.append(b.decode('latin1'))  # latin1 avoids decode errors
-	return "".join(chars)
+
+def read_c_string(f, offset=None):
+    """Read a null-terminated string from file starting at offset."""
+    if offset is not None:
+        f.seek(offset)
+    chars = []
+    while True:
+        b = f.read(1)
+        if not b or b == b"\x00":
+            break
+        chars.append(b.decode("latin1"))  # latin1 avoids decode errors
+    return "".join(chars)
 
 
 def read_one_pointer(f):
-	data = f.read(8)
-	if len(data) < 8:
-		return 0
-	value, = struct.unpack("<Q", data)
-	# strip off the segment
-	value &= 0xffffff
-	return value
+    data = f.read(8)
+    if len(data) < 8:
+        return 0
+    (value,) = struct.unpack("<Q", data)
+    # strip off the segment
+    value &= 0xFFFFFF
+    return value
 
 
 def read_pointer_list(f, count=None):
-	"""
-	Read a list of pointers (64-bit) from the current file offset.
-	Read count pointers (if set) or until a null pointer is hit otherwise.
-	"""
-	offsets = []
-	# Read 64-bit little-endian integers until 0 or count
-	while True:
-		value = read_one_pointer(f)
-		if count is None and value == 0:
-			break
-		offsets.append(value)
-		if count is not None:
-			count -= 1
-			if count == 0:
-				break
-	return offsets
+    """
+    Read a list of pointers (64-bit) from the current file offset.
+    Read count pointers (if set) or until a null pointer is hit otherwise.
+    """
+    offsets = []
+    # Read 64-bit little-endian integers until 0 or count
+    while True:
+        value = read_one_pointer(f)
+        if count is None and value == 0:
+            break
+        offsets.append(value)
+        if count is not None:
+            count -= 1
+            if count == 0:
+                break
+    return offsets
+
 
 # read a file/subfile pair and as shorts
 def file_ints_to_shorts(f):
-	"""
-	Read the file/subfile pair of int32s and recode them as int16
-	"""
-	data = f.read(8)
-	file, subfile = struct.unpack("<ii", data)
-	return struct.pack("<hh", file, subfile)
+    """
+    Read the file/subfile pair of int32s and recode them as int16
+    """
+    data = f.read(8)
+    file, subfile = struct.unpack("<ii", data)
+    return struct.pack("<hh", file, subfile)
 
 
 def read_room_cell_data(f):
-	alldata = b''
-	while True:
-		data = f.read(4)
-		alldata += data[0:1] # convert int32 -> byte for cell num
-		cell, = struct.unpack("<I", data)
-		if cell == 0xff:
-			return alldata
-		alldata += file_ints_to_shorts(f)
+    alldata = b""
+    while True:
+        data = f.read(4)
+        alldata += data[0:1]  # convert int32 -> byte for cell num
+        (cell,) = struct.unpack("<I", data)
+        if cell == 0xFF:
+            return alldata
+        alldata += file_ints_to_shorts(f)
+
 
 def read_room_vid_data(f):
-	"""
-	Read the video data table for the room data
-	"""
-	offsets = read_pointer_list(f)
+    """
+    Read the video data table for the room data
+    """
+    offsets = read_pointer_list(f)
 
-	# Collect strings from those offsets
-	strings = [read_c_string(f, off) for off in offsets]
-	asbytes = [x.encode('utf-8') for x in strings]
+    # Collect strings from those offsets
+    strings = [read_c_string(f, off) for off in offsets]
+    asbytes = [x.encode("utf-8") for x in strings]
 
-	result = b'\0'.join(asbytes) + b'\0'
-	return result
+    result = b"\0".join(asbytes) + b"\0"
+    return result
 
 
 def read_room_sound_data(f):
-	"""
-	Read the sound list for room data.  Each sound entry is 24 bytes:
-	 * file/subfile/priority int32s and 12 bytes of null
-	 * if the file is -1, it's the end of the list
-	 * if the priority is 0xff, the last 8 bytes can be a pointer to a file name.
-
-	 convert that to a more compact and similar-to-others format:
-	 * if file is 0xff -> read a file name string, else read subfile
-	 * write ints as int16
-	"""
-	alldata = b''
-	while True:
-		data = f.read(8)
-		file, subfile = struct.unpack("<ii", data)
-		# print(f"{file}, {subfile}")
-		if file == -1:
-			alldata += struct.pack("<h", file)
-			return alldata
-
-		priodata = f.read(4)
-		priority, = struct.unpack("<I", priodata)
-
-		dummy = f.read(4)
-		if priority == 0xff:
-			strptr = read_one_pointer(f)
-			if strptr != 0:
-				curpos = f.tell()
-				filename = read_c_string(f, strptr)
-				alldata += struct.pack("<H", 0xff)
-				alldata += filename.encode('utf-8')
-				alldata += b'\0'
-				# print(f"Read string {filename} from 0x%x" % strptr)
-				f.seek(curpos)
-			else:
-				alldata += struct.pack("<HH", file, subfile)
-		else:
-			f.read(8) # null str ptr
-			alldata += struct.pack("<HH", file, subfile)
-
-		alldata += struct.pack("<H", priority)
+    """
+    Read the sound list for room data.  Each sound entry is 24 bytes:
+     * file/subfile/priority int32s and 12 bytes of null
+     * if the file is -1, it's the end of the list
+     * if the priority is 0xff, the last 8 bytes can be a pointer to a file name.
+
+     convert that to a more compact and similar-to-others format:
+     * if file is 0xff -> read a file name string, else read subfile
+     * write ints as int16
+    """
+    alldata = b""
+    while True:
+        data = f.read(8)
+        file, subfile = struct.unpack("<ii", data)
+        # print(f"{file}, {subfile}")
+        if file == -1:
+            alldata += struct.pack("<h", file)
+            return alldata
+
+        priodata = f.read(4)
+        (priority,) = struct.unpack("<I", priodata)
+
+        _dummy = f.read(4)
+        if priority == 0xFF:
+            strptr = read_one_pointer(f)
+            if strptr != 0:
+                curpos = f.tell()
+                filename = read_c_string(f, strptr)
+                alldata += struct.pack("<H", 0xFF)
+                alldata += filename.encode("utf-8")
+                alldata += b"\0"
+                # print(f"Read string {filename} from 0x%x" % strptr)
+                f.seek(curpos)
+            else:
+                alldata += struct.pack("<HH", file, subfile)
+        else:
+            f.read(8)  # null str ptr
+            alldata += struct.pack("<HH", file, subfile)
+
+        alldata += struct.pack("<H", priority)
+
+
+def print_data_as_c_array(data):
+    for o in range((len(data) + 15) // 16):
+        subdata = data[16 * o : 16 * (o + 1)]
+        subdata_str = ["0x%02x," % v for v in subdata]
+        result = " ".join(subdata_str)
+        print("\t" + result)
 
 
 def read_room_data(f, i: int, offset: int):
-	f.seek(offset)
-	data = f.read(2) # roomflag and pal intensity
-	f.read(2) # unused
-	data += file_ints_to_shorts(f) # music file/subfile
-	data += f.read(3) # scale vals
-	f.read(1) # unused
-	data += file_ints_to_shorts(f) # playfield file/subfile
-	cellptr = read_one_pointer(f)
-	if cellptr == 0:
-		data += bytes([0xff])
-	else:
-		curpos = f.tell()
-		f.seek(cellptr)
-		data += read_room_cell_data(f)
-		f.seek(curpos)
-
-	data += file_ints_to_shorts(f) # script file/subfile
-	data += file_ints_to_shorts(f) # anim file/subfile
-	data += f.read(1) # scaleI
-	f.read(1) # unused
-	scrollThreshold, = struct.unpack("<h", f.read(2))
-	assert scrollThreshold <= 0xff
-	data += struct.pack("<B", scrollThreshold)
-
-	f.read(12) # Skip palette file nums (unused) and 4 bytes after
-
-	videoptr = read_one_pointer(f)
-	if videoptr:
-		curpos = f.tell()
-		f.seek(videoptr)
-		data += read_room_vid_data(f)
-		f.seek(curpos)
-	else:
-		data += b'\0'
-
-	soundptr = read_one_pointer(f)
-	if soundptr:
-		curpos = f.tell()
-		f.seek(soundptr)
-		# print("Read sounds from 0x%x" % soundptr)
-		data += read_room_sound_data(f)
-		f.seek(curpos)
-	else:
-		data += struct.pack("<h", -1)
-
-	print("static const byte ROOMDATA_%02d[] = {" % i)
-	for o in range((len(data) + 15) // 16):
-		subdata = data[16*o:16*(o+1)]
-		subdata_str = ['0x%02x,' % v for v in subdata]
-		result = ' '.join(subdata_str)
-		print("\t" + result)
-	print("};")
+    f.seek(offset)
+    data = f.read(2)  # roomflag and pal intensity
+    f.read(2)  # unused
+    data += file_ints_to_shorts(f)  # music file/subfile
+    data += f.read(3)  # scale vals
+    f.read(1)  # unused
+    data += file_ints_to_shorts(f)  # playfield file/subfile
+    cellptr = read_one_pointer(f)
+    if cellptr == 0:
+        data += bytes([0xFF])
+    else:
+        curpos = f.tell()
+        f.seek(cellptr)
+        data += read_room_cell_data(f)
+        f.seek(curpos)
+
+    data += file_ints_to_shorts(f)  # script file/subfile
+    data += file_ints_to_shorts(f)  # anim file/subfile
+    data += f.read(1)  # scaleI
+    f.read(1)  # unused
+    (scrollThreshold,) = struct.unpack("<h", f.read(2))
+    assert scrollThreshold <= 0xFF
+    data += struct.pack("<B", scrollThreshold)
+
+    f.read(12)  # Skip palette file nums (unused) and 4 bytes after
+
+    videoptr = read_one_pointer(f)
+    if videoptr:
+        curpos = f.tell()
+        f.seek(videoptr)
+        data += read_room_vid_data(f)
+        f.seek(curpos)
+    else:
+        data += b"\0"
+
+    soundptr = read_one_pointer(f)
+    if soundptr:
+        curpos = f.tell()
+        f.seek(soundptr)
+        # print("Read sounds from 0x%x" % soundptr)
+        data += read_room_sound_data(f)
+        f.seek(curpos)
+    else:
+        data += struct.pack("<h", -1)
+
+    print("static const byte ROOMDATA_%02d[] = {" % i)
+    print_data_as_c_array(data)
+    print("};")
 
 
 def read_rooms(f):
-	f.seek(0x9f400)
-	offsets = read_pointer_list(f, count=100)
+    f.seek(0x9F400)
+    offsets = read_pointer_list(f, count=100)
+
+    for i, offset in enumerate(offsets):
+        if offset != 0:
+            read_room_data(f, i, offset)
+
+    print("")
+    print("")
+    for i, offset in enumerate(offsets):
+        if offset == 0:
+            print(
+                '\tROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));'
+            )
+        else:
+            print(
+                '\tROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_%02d, ARRAYSIZE(ROOMDATA_%02d))}));'
+                % (i, i)
+            )
 
-	for i, offset in enumerate(offsets):
-		if offset != 0:
-			read_room_data(f, i, offset)
 
-	print("")
-	print("")
-	for i, offset in enumerate(offsets):
-		if offset == 0:
-			print("\tROOMTBL.push_back(RoomEntry({\"\", Common::Point(), Common::Array<byte>()}));")
-		else:
-			print("\tROOMTBL.push_back(RoomEntry({\"\", Common::Point(), Common::Array<byte>(ROOMDATA_%02d, ARRAYSIZE(ROOMDATA_%02d))}));" % (i, i))
+def read_filenames(f):
+    base_offset = 0x94830
+    f.seek(base_offset)
 
+    offsets = read_pointer_list(f)
 
+    # Collect strings from those offsets
+    strings = [read_c_string(f, off) for off in offsets]
+
+    print("static const char *FILENAMES[] = {")
+    for s in strings:
+        escaped = s.replace("\\", "\\\\").replace('"', '\\"')
+        print(f'\t"{escaped}",')
+    print("};")
 
-def read_filenames(f):
-	base_offset = 0x94830
-	f.seek(base_offset)
 
-	offsets = read_pointer_list(f)
+def read_mouse_cursor(f):
+    hotdata = f.read(4)
+    hotx, hoty = struct.unpack("<HH", hotdata)
+    width, height = struct.unpack("<HH", f.read(4))
+    gfxptr = read_one_pointer(f)
+    _texptr = read_one_pointer(f)
 
-	# Collect strings from those offsets
-	strings = [read_c_string(f, off) for off in offsets]
+    f.seek(gfxptr)
+    gfxdata = f.read(width * height)
 
-	# Print C source array
-	print("static const char *FILENAMES[] = {")
-	for s in strings:
-		escaped = s.replace("\\", "\\\\").replace('"', '\\"')
-		print(f'\t"{escaped}",')
-	print("};")
+    print(
+        "\t0x%02x, 0x%02x, 0x%02x, 0x%02x,   // hot x,y"
+        % (hotdata[0], hotdata[1], hotdata[2], hotdata[3])
+    )
+    print_data_as_c_array(gfxdata)
+    pass
+
+
+def read_mouse_cursors(f):
+    base_offset = 0x95030
+    f.seek(base_offset)
+
+    offsets = read_pointer_list(f)
+
+    for i, pointer in enumerate(offsets):
+        print("static const byte CURSOR_%d_DATA[] = {" % i)
+        f.seek(pointer)
+        read_mouse_cursor(f)
+        print("};")
 
 
 def main():
-	if len(sys.argv) < 2:
-		print(f"Usage: {sys.argv[0]} Macos-Noctropolis-Executable")
-		return
-	filename = sys.argv[1]
+    if len(sys.argv) < 2:
+        print(f"Usage: {sys.argv[0]} Macos-Noctropolis-Executable")
+        return
+    filename = sys.argv[1]
 
-	with open(filename, "rb") as f:
-		#read_filenames(f)
-		read_rooms(f)
+    with open(filename, "rb") as f:
+        # read_filenames(f)
+        # read_rooms(f)
+        read_mouse_cursors(f)
 
-if __name__ == "__main__":
-	main()
 
+if __name__ == "__main__":
+    main()


Commit: 9f9a2af9712d9a44f10d433a498ca6f446d7948c
    https://github.com/scummvm/scummvm/commit/9f9a2af9712d9a44f10d433a498ca6f446d7948c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add stubs for Noctropolis-specific script cmds

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/access/events.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_resources.h
    engines/access/noctropolis/noctropolis_scripts.cpp
    engines/access/resources.h
    engines/access/scripts.cpp
    engines/access/scripts.h


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 3bc873d160a..e540d98b115 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -115,6 +115,7 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_vidEnd = false;
 
 	_icons = nullptr;
+	_stilOff = false;
 
 	ARRAYCLEAR(_countTbl);
 }
diff --git a/engines/access/access.h b/engines/access/access.h
index 955a094bced..ec74f5090f4 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -286,6 +286,8 @@ public:
 	bool _clearSummaryFlag;
 	bool _cheatFl;
 	bool _restartFl;
+	bool _stilOff; // Used in Noctropolis walk
+
 	// Fields mapped into the flags array
 	int &_useItem;
 	int &_startup;
diff --git a/engines/access/events.cpp b/engines/access/events.cpp
index b3adef7a6b7..aa320162c28 100644
--- a/engines/access/events.cpp
+++ b/engines/access/events.cpp
@@ -29,9 +29,6 @@
 #include "access/player.h"
 #include "access/amazon/amazon_resources.h"
 
-#define CURSOR_WIDTH 16
-#define CURSOR_HEIGHT 16
-
 namespace Access {
 
 EventsManager::EventsManager(AccessEngine *vm) : _vm(vm) {
@@ -64,10 +61,6 @@ void EventsManager::setNormalCursor(CursorType cursorId) {
 }
 
 void EventsManager::setCursor(CursorType cursorId) {
-	if (_vm->getGameID() == kGameNoctropolis) {
-		warning("*** FIXME *** setCursor: Need data for Noctropolis cursors");
-		return;
-	}
 	if (cursorId == _cursorId)
 		return;
 	_cursorId = cursorId;
@@ -78,20 +71,22 @@ void EventsManager::setCursor(CursorType cursorId) {
 	} else {
 		// Get a pointer to the mouse data to use, and get the cursor hotspot
 		const byte *srcP = _vm->_res->getCursor(cursorId);
-		int hotspotX = (int16)READ_LE_UINT16(srcP);
-		int hotspotY = (int16)READ_LE_UINT16(srcP + 2);
+		const int width = _vm->_res->getCursorWidth(cursorId);
+		const int height = _vm->_res->getCursorHeight(cursorId);
+		const int hotspotX = (int16)READ_LE_UINT16(srcP);
+		const int hotspotY = (int16)READ_LE_UINT16(srcP + 2);
 		srcP += 4;
 
 		// Create a surface to build up the cursor on
 		Graphics::Surface cursorSurface;
-		cursorSurface.create(CURSOR_WIDTH, CURSOR_HEIGHT, Graphics::PixelFormat::createFormatCLUT8());
+		cursorSurface.create(width, height, Graphics::PixelFormat::createFormatCLUT8());
 		byte *destP = (byte *)cursorSurface.getPixels();
-		Common::fill(destP, destP + CURSOR_WIDTH * CURSOR_HEIGHT, 0);
+		Common::fill(destP, destP + width * height, 0);
 
 		// Loop to build up the cursor
-		for (int y = 0; y < CURSOR_HEIGHT; ++y) {
+		for (int y = 0; y < height; ++y) {
 			destP = (byte *)cursorSurface.getBasePtr(0, y);
-			int width = CURSOR_WIDTH;
+			int w = width;
 			int skip = *srcP++;
 			int plot = *srcP++;
 			if (skip >= width)
@@ -99,13 +94,13 @@ void EventsManager::setCursor(CursorType cursorId) {
 
 			// Skip over pixels
 			destP += skip;
-			width -= skip;
+			w -= skip;
 
 			// Write out the pixels to plot
-			while (plot > 0 && width > 0) {
+			while (plot > 0 && w > 0) {
 				*destP++ = *srcP++;
 				--plot;
-				--width;
+				--w;
 			}
 		}
 
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index ef2bc9ed56b..b1ea17ccb97 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -212,7 +212,7 @@ void NoctropolisEngine::doIntro() {
 	_screen->forceFadeOut();
 
 	// TODO: midi files have been split into MUSIC/Mxx.MID files
-	//_midi->loadMusic(98, 1);
+	_midi->loadMusic(98, 1);
 	_room->loadPlayField(1, 0);
 	_buffer2.copyFrom(*_screen);
 	_buffer1.copyFrom(*_screen);
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index efd927cbaf8..55db72c9c5f 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -1418,10 +1418,229 @@ static const byte ROOMDATA_97[] = {
 	0x41, 0x52, 0x53, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
 };
 
+///////////////////////////////////////////////////////////////
 
 
-///////////////////////////////////////////////////////////////
+static const int CURSOR_HEIGHTS[] = {
+	16, 13, 14, 14, 14, 14, 14, 14, 14, 14, 27
+};
+
 
+static const byte CURSOR_0_DATA[] = {
+	0x00, 0x00, 0x00, 0x00,   // hot x,y
+	0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xee, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xee, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xee, 0xee, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xee, 0xee, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xee, 0xee, 0xee, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xee, 0xee, 0xee, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xee, 0xee, 0xee, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xee, 0xee, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+static const byte CURSOR_1_DATA[] = {
+	0x07, 0x00, 0x07, 0x00,   // hot x,y
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0xfb, 0xfb, 0x00, 0xfb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xfb, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x00,
+	0xee, 0x00, 0x00, 0xee, 0x00, 0xee, 0x00, 0xee, 0x00, 0xee, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00,
+	0x00, 0xfb, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0xfb, 0xfb, 0x00, 0xfb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+static const byte CURSOR_2_DATA[] = {
+	0x00, 0x00, 0x00, 0x00,   // hot x,y
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00,
+	0xff, 0xf7, 0x00, 0x00, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7,
+	0xff, 0xf7, 0x00, 0x00, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0x00, 0xf7,
+	0xff, 0xf7, 0x00, 0x00, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x00,
+	0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7,
+	0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0x00, 0xf7,
+};
+static const byte CURSOR_3_DATA[] = {
+	0x00, 0x00, 0x00, 0x00,   // hot x,y
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00,
+	0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xf7,
+	0xff, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xf7,
+	0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xf7, 0xf7, 0xff, 0xf7, 0xf7, 0x00, 0xff, 0xf7, 0xff, 0xf7,
+	0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7,
+	0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0x00, 0xf7,
+};
+static const byte CURSOR_4_DATA[] = {
+	0x00, 0x00, 0x00, 0x00,   // hot x,y
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00,
+	0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xf7, 0xf7,
+	0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xf7, 0x00,
+	0xff, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0x00, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0x00,
+	0x00, 0xf7, 0x00, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0xf7, 0x00, 0x00, 0xf7, 0xf7, 0xf7,
+};
+static const byte CURSOR_5_DATA[] = {
+	0x00, 0x00, 0x00, 0x00,   // hot x,y
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xf7, 0xf7, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0xff, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xf7, 0x00, 0x00, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+static const byte CURSOR_6_DATA[] = {
+	0x00, 0x00, 0x00, 0x00,   // hot x,y
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00,
+	0x00, 0xff, 0xf7, 0xf7, 0xff, 0x00, 0xff, 0x00, 0xff, 0xf7, 0x00, 0x00, 0xff, 0xf7, 0xff, 0xf7,
+	0x00, 0xff, 0xf7, 0x00, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0xf7,
+	0x00, 0xff, 0xf7, 0x00, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0x00, 0x00, 0xff, 0xf7, 0xff, 0x00,
+	0x00, 0xff, 0xf7, 0x00, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0xff, 0xf7, 0xff, 0xf7,
+	0x00, 0x00, 0xf7, 0x00, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0x00, 0xf7,
+};
+static const byte CURSOR_7_DATA[] = {
+	0x00, 0x00, 0x00, 0x00,   // hot x,y
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xf7, 0xf7, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0xf7, 0x00, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00,
+};
+static const byte CURSOR_8_DATA[] = {
+	0x00, 0x00, 0x00, 0x00,   // hot x,y
+	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xf7, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00,
+	0xff, 0xf7, 0xf7, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0x00, 0xff, 0xf7, 0xf7, 0xff, 0xf7, 0xff, 0xf7,
+	0xff, 0xf7, 0xff, 0x00, 0xff, 0xf7, 0xff, 0xf7, 0x00, 0xff, 0xf7, 0x00, 0xff, 0xf7, 0xff, 0xf7,
+	0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0x00, 0xff, 0xf7, 0x00, 0xff, 0xf7, 0xff, 0xf7,
+	0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0x00, 0xff, 0xf7, 0x00, 0xff, 0xff, 0xff, 0xf7,
+	0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0xf7, 0x00, 0x00, 0xf7, 0xf7, 0xf7,
+};
+static const byte CURSOR_9_DATA[] = {
+	0x00, 0x00, 0x00, 0x00,   // hot x,y
+	0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xf4, 0xf4, 0xf4, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xf4, 0xf4, 0xf4, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xf4, 0xf7, 0xf4, 0xf4, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xf4, 0xf7, 0x00, 0xf4, 0xf4, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xf7, 0x00, 0x00, 0xf4, 0xf4, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xf4, 0xf4, 0xf4, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0xf4, 0xf4, 0xf4, 0x00, 0xf4, 0xf4, 0xf4, 0x00,
+	0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00,
+	0xf4, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00,
+	0xf4, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00,
+	0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00,
+	0xf4, 0xf4, 0xf4, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0xf4, 0xf4, 0xf4, 0x00, 0x00, 0xf4, 0x00, 0x00,
+};
+static const byte CURSOR_10_DATA[] = {
+	0x00, 0x00, 0x00, 0x00,   // hot x,y
+	0x00, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
+	0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa,
+	0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xf7, 0x00, 0x00, 0x00, 0xfa, 0xfa,
+	0xfa, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xfc, 0xfa, 0xfa, 0xf7,
+	0xf7, 0x00, 0x00, 0x00, 0x00, 0xfa, 0xfa, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0xfa, 0xfa, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0xfa, 0xfa, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0xf7,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0xfa, 0xfa, 0x00, 0x00, 0x00,
+	0xfc, 0xfa, 0xfa, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xfa, 0xfa, 0xfa, 0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0xfa, 0xfc, 0xfa, 0xfa, 0xf7, 0xf7, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa,
+	0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0x00, 0x00, 0xfa, 0xfa, 0xfa,
+	0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa,
+	0xf7, 0xf7, 0x00, 0x00, 0xfa, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xfa, 0xfa, 0xfa, 0xf7, 0xf7,
+	0xf7, 0xf7, 0xf7, 0xf7, 0xfa, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xfa,
+	0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
+	0xfa, 0xfa, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xfa,
+	0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xfa, 0xf7, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
+	0xfa, 0xfa, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,
+};
+
+
+///////////////////////////////////////////////////////////////
 
 NoctropolisResources::NoctropolisResources(AccessEngine *_vm) : Resources(_vm), _fontChaleteu(nullptr), _fontSystemeu(nullptr),
 _fontSml3x5(nullptr), _fontNaples12(nullptr), _fontGothiceu(nullptr), _fontChaletse(nullptr),_fontComicseu(nullptr)
@@ -1573,6 +1792,36 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 }
 
 
+int NoctropolisResources::getCursorWidth(int num) const {
+	if (num == 10)
+		return 22;
+	return 16;
+}
+
+int NoctropolisResources::getCursorHeight(int num) const {
+	if (num < ARRAYSIZE(CURSOR_HEIGHTS))
+		return CURSOR_HEIGHTS[num];
+	return 0;
+}
+
+const byte *NoctropolisResources::getCursor(int num) const {
+	switch (num) {
+	default:
+	case 0:  return CURSOR_0_DATA;
+	case 1:  return CURSOR_1_DATA;
+	case 2:  return CURSOR_2_DATA;
+	case 3:  return CURSOR_3_DATA;
+	case 4:  return CURSOR_4_DATA;
+	case 5:  return CURSOR_5_DATA;
+	case 6:  return CURSOR_6_DATA;
+	case 7:  return CURSOR_7_DATA;
+	case 8:  return CURSOR_8_DATA;
+	case 9:  return CURSOR_9_DATA;
+	case 10: return CURSOR_10_DATA;
+	}
+}
+
+
 } // end namespace Noctropolis
 
 } // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_resources.h b/engines/access/noctropolis/noctropolis_resources.h
index a9c3ef2d41e..c38c10ac059 100644
--- a/engines/access/noctropolis/noctropolis_resources.h
+++ b/engines/access/noctropolis/noctropolis_resources.h
@@ -37,17 +37,16 @@ public:
 	NoctropolisResources(AccessEngine *_vm);
 	~NoctropolisResources();
 
-	// TODO implement these for real.
-	const byte *getCursor(int num) const override { return nullptr; }
+	const byte *getCursor(int num) const override;
 	const char *getEgoName() const override;
 	int getRMouse(int i, int j) const override { return 0; };
 	int inButtonXRange(int x) const override { return 0; };
 
-	/**
-	 * Load data from the access.dat file
-	 */
 	void load(Common::SeekableReadStream &s) override;
 
+	int getCursorWidth(int num) const override;
+	int getCursorHeight(int num) const override;
+
 private:
 	Font *_fontChaleteu;
 	Font *_fontSystemeu;
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index 7750a2b0aa1..41e3b383471 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -27,6 +27,7 @@ namespace Access {
 namespace Noctropolis {
 
 NoctropolisScripts::NoctropolisScripts(NoctropolisEngine *vm) : Scripts(vm) {
+	setOpcodes_v3();
 }
 
 void NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2) {
diff --git a/engines/access/resources.h b/engines/access/resources.h
index 6229496be07..41377cad626 100644
--- a/engines/access/resources.h
+++ b/engines/access/resources.h
@@ -98,6 +98,18 @@ public:
 	 */
 	virtual const byte *getCursor(int num) const = 0;
 
+	/**
+	 * Get the width of the cursor data for a given cursor num.
+	 * In Martian and Amazon this is always 16.
+	 */
+	virtual int getCursorWidth(int num) const { return 16; }
+
+	/**
+	 * Get the height of the cursor data for a given cursor num
+	 * In Martian and Amazon this is always 16.
+	 */
+	virtual int getCursorHeight(int num) const { return 16; }
+
 	/**
 	 * Get the name of the lead character
 	 */
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 16355970fdf..c5240c62f16 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -65,7 +65,7 @@ void Scripts::setOpcodes() {
 	COMMAND_LIST[15] = &Scripts::cmdAddScore;
 	COMMAND_LIST[16] = &Scripts::cmdSetInventory;
 	COMMAND_LIST[17] = &Scripts::cmdCheckInventory;
-	COMMAND_LIST[18] = &Scripts::cmdSetTex;
+	COMMAND_LIST[18] = &Scripts::cmdSetPlayerCoords;
 	COMMAND_LIST[19] = &Scripts::cmdNewRoom;
 	COMMAND_LIST[20] = &Scripts::cmdConverse;
 	COMMAND_LIST[21] = &Scripts::cmdCheckFrame;
@@ -88,7 +88,7 @@ void Scripts::setOpcodes() {
 	COMMAND_LIST[38] = &Scripts::cmdSetBuffer;
 	COMMAND_LIST[39] = &Scripts::cmdSetScroll;
 	COMMAND_LIST[40] = &Scripts::cmdSaveRect;
-	COMMAND_LIST[41] = &Scripts::cmdVideoEnded;
+	COMMAND_LIST[41] = &Scripts::cmdVideoEnded; // aka CheckVid
 	COMMAND_LIST[42] = &Scripts::cmdSetBufVid;
 	COMMAND_LIST[43] = &Scripts::cmdPlayBufVid;
 	COMMAND_LIST[44] = &Scripts::cmdRemoveLast;
@@ -124,6 +124,7 @@ void Scripts::setOpcodes() {
 }
 
 void Scripts::setOpcodes_v2() {
+	// Modify command list for Amazon
 	COMMAND_LIST[3] = &Scripts::cmdJumpHelp;
 	COMMAND_LIST[9] = &Scripts::cmdPrint_v2;
 	COMMAND_LIST[15] = &Scripts::cmdSetInventory;
@@ -135,6 +136,36 @@ void Scripts::setOpcodes_v2() {
 	COMMAND_LIST[63] = COMMAND_LIST[64] = COMMAND_LIST[65] = COMMAND_LIST[66] = COMMAND_LIST[67] = &Scripts::cmdPushLocation;
 }
 
+void Scripts::setOpcodes_v3() {
+	COMMAND_LIST[57] = &Scripts::cmdDigitalPlay;
+	COMMAND_LIST[60] = &Scripts::cmdFillSound;
+	COMMAND_LIST[61] = &Scripts::cmdBD;
+	COMMAND_LIST[62] = &Scripts::cmdPlayVid1;
+	COMMAND_LIST[63] = &Scripts::cmdNull; // empty function CmdPRINTWITHOUT
+	COMMAND_LIST[74] = &Scripts::cmdCharWait;
+	COMMAND_LIST[75] = &Scripts::cmdUndoText;
+	COMMAND_LIST[76] = &Scripts::cmdResetAnim;
+	COMMAND_LIST[77] = &Scripts::cmdWalkTo;
+	COMMAND_LIST[78] = &Scripts::cmdWalkCheck;
+	COMMAND_LIST[79] = &Scripts::cmdSoundEnd;
+	COMMAND_LIST[80] = &Scripts::cmdFadeWhite;
+	COMMAND_LIST[81] = &Scripts::cmdGotoFrame;
+	COMMAND_LIST[82] = &Scripts::cmdPlayerScale;
+	COMMAND_LIST[83] = &Scripts::cmdRestoreBlock;
+	COMMAND_LIST[84] = &Scripts::cmdCopyScnBuf;
+	COMMAND_LIST[85] = &Scripts::cmdStilWalkTo;
+	COMMAND_LIST[86] = &Scripts::cmdStilWalkCheck;
+	COMMAND_LIST[87] = &Scripts::cmdStilOff;
+	COMMAND_LIST[88] = &Scripts::cmdStilOn;
+	COMMAND_LIST[89] = &Scripts::cmdReturnExit;
+	COMMAND_LIST[90] = &Scripts::cmdSetStilCoords;
+	COMMAND_LIST[91] = &Scripts::cmdSetPlayerDir;
+	COMMAND_LIST[92] = &Scripts::cmdSetStilDir;
+	COMMAND_LIST[93] = &Scripts::cmdStilScale;
+	COMMAND_LIST[94] = &Scripts::cmdLockInterface;
+	COMMAND_LIST[94] = &Scripts::cmdUnlockInterface;
+}
+
 void Scripts::setScript(Resource *res, bool restartFlag) {
 	debugC(1, kDebugScripts, "setScript(res=%p (%s), restartFlag=%d)", (void *)res, res->getFileName(), restartFlag);
 	_resource = res;
@@ -483,7 +514,7 @@ void Scripts::cmdCheckInventory() {
 	}
 }
 
-void Scripts::cmdSetTex() {
+void Scripts::cmdSetPlayerCoords() {
 	const int xStart = _data->readSint16LE();
 	const int yStart = _data->readSint16LE();
 	debugC(1, kDebugScripts, "cmdSetTex(xStart=%d, yStart=%d)", xStart, yStart);
@@ -594,6 +625,11 @@ void Scripts::cmdRetNeg() {
 	_returnCode = -1;
 }
 
+void Scripts::cmdBD() {
+	debugC(1, kDebugScripts, "cmdBD()");
+	_endFlag = true;
+}
+
 void Scripts::cmdCheckLoc() {
 	int minX = _data->readUint16LE();
 	int minY = _data->readUint16LE();
@@ -856,6 +892,14 @@ void Scripts::cmdDoTravel() {
 	}
 }
 
+void Scripts::cmdDoTravel_Noct() {
+	_vm->_events->setCursor(CURSOR_ARROW);
+	_vm->_player->_playerOff = true;
+	_vm->_stilOff = true;
+	cmdRetPos();
+	error("TODO: Finish Noct style cmdTravel");
+}
+
 void Scripts::cmdHelp_v1() {
 	debugC(1, kDebugScripts, "cmdHelp_v1()");
 	int idx = 0;
@@ -1259,4 +1303,105 @@ void Scripts::cmdEndVideo() {
 	_vm->_video->_videoEnd = true;
 }
 
+void Scripts::cmdDigitalPlay() {
+    error("TODO: Implement Scripts::cmdDigitalPlay");
+}
+
+void Scripts::cmdFillSound() {
+    error("TODO: Implement Scripts::cmdFillSound");
+}
+
+void Scripts::cmdPlayVid1() {
+    error("TODO: Implement Scripts::cmdPlayVid1");
+}
+
+void Scripts::cmdCharWait() {
+    error("TODO: Implement Scripts::cmdCharWait");
+}
+
+void Scripts::cmdUndoText() {
+    error("TODO: Implement Scripts::cmdUndoText");
+}
+
+void Scripts::cmdResetAnim() {
+    error("TODO: Implement Scripts::cmdResetAnim");
+}
+
+void Scripts::cmdWalkTo() {
+    error("TODO: Implement Scripts::cmdWalkTo");
+}
+
+void Scripts::cmdWalkCheck() {
+    error("TODO: Implement Scripts::cmdWalkCheck");
+}
+
+void Scripts::cmdSoundEnd() {
+    error("TODO: Implement Scripts::cmdSoundEnd");
+}
+
+void Scripts::cmdFadeWhite() {
+    error("TODO: Implement Scripts::cmdFadeWhite");
+}
+
+void Scripts::cmdGotoFrame() {
+    error("TODO: Implement Scripts::cmdGotoFrame");
+}
+
+void Scripts::cmdPlayerScale() {
+    error("TODO: Implement Scripts::cmdPlayerScale");
+}
+
+void Scripts::cmdRestoreBlock() {
+    error("TODO: Implement Scripts::cmdRestoreBlock");
+}
+
+void Scripts::cmdCopyScnBuf() {
+    error("TODO: Implement Scripts::cmdCopyScnBuf");
+}
+
+void Scripts::cmdStilWalkTo() {
+    error("TODO: Implement Scripts::cmdStilWalkTo");
+}
+
+void Scripts::cmdStilWalkCheck() {
+    error("TODO: Implement Scripts::cmdStilWalkCheck");
+}
+
+void Scripts::cmdStilOff() {
+	_vm->_stilOff = true;
+}
+
+void Scripts::cmdStilOn() {
+	_vm->_stilOff = false;
+}
+
+void Scripts::cmdReturnExit() {
+    error("TODO: Implement Scripts::cmdReturnExit");
+}
+
+void Scripts::cmdSetStilCoords() {
+    error("TODO: Implement Scripts::cmdSetStilCoords");
+}
+
+void Scripts::cmdSetPlayerDir() {
+    error("TODO: Implement Scripts::cmdSetPlayerDir");
+}
+
+void Scripts::cmdSetStilDir() {
+    error("TODO: Implement Scripts::cmdSetStilDir");
+}
+
+void Scripts::cmdStilScale() {
+    error("TODO: Implement Scripts::cmdStilScale");
+}
+
+void Scripts::cmdLockInterface() {
+    error("TODO: Implement Scripts::cmdLockInterface");
+}
+
+void Scripts::cmdUnlockInterface() {
+    error("TODO: Implement Scripts::cmdUnlockInterface");
+}
+
+
 } // End of namespace Access
diff --git a/engines/access/scripts.h b/engines/access/scripts.h
index 5752985629e..4a268c0da24 100644
--- a/engines/access/scripts.h
+++ b/engines/access/scripts.h
@@ -80,13 +80,14 @@ protected:
 	void cmdAddScore();
 	void cmdSetInventory();
 	void cmdCheckInventory();
-	void cmdSetTex();
+	void cmdSetPlayerCoords();
 	void cmdNewRoom();
 	void cmdConverse();
 	void cmdCheckFrame();
 	void cmdCheckAnim();
 	void cmdSnd();
 	void cmdRetNeg();
+	void cmdBD();
 	void cmdCheckLoc();
 	void cmdSetAnim();
 	void cmdDispInv_v1();
@@ -139,6 +140,33 @@ protected:
 	void cmdHelp_v2();
 	void cmdCycleBack();
 	void cmdSetHelp();
+	void cmdDoTravel_Noct();
+	void cmdDigitalPlay();
+	void cmdFillSound();
+	void cmdPlayVid1();
+	void cmdCharWait();
+	void cmdUndoText();
+	void cmdResetAnim();
+	void cmdWalkTo();
+	void cmdWalkCheck();
+	void cmdSoundEnd();
+	void cmdFadeWhite();
+	void cmdGotoFrame();
+	void cmdPlayerScale();
+	void cmdRestoreBlock();
+	void cmdCopyScnBuf();
+	void cmdStilWalkTo();
+	void cmdStilWalkCheck();
+	void cmdStilOff();
+	void cmdStilOn();
+	void cmdReturnExit();
+	void cmdSetStilCoords();
+	void cmdSetPlayerDir();
+	void cmdSetStilDir();
+	void cmdStilScale();
+	void cmdLockInterface();
+	void cmdUnlockInterface();
+
 public:
 	int _sequence;
 	bool _endFlag;
@@ -155,6 +183,7 @@ public:
 
 	void setOpcodes();
 	void setOpcodes_v2();
+	void setOpcodes_v3();
 
 	void setScript(Resource *data, bool restartFlag = false);
 


Commit: ce07683e8720e120c11b00efd1183c74889340ca
    https://github.com/scummvm/scummvm/commit/ce07683e8720e120c11b00efd1183c74889340ca
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Initialize Noctropols timers correctly

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index b1ea17ccb97..7161ca8982d 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -51,9 +51,15 @@ void NoctropolisEngine::setupGame() {
 		TimerEntry te;
 		te._initTm = 1;
 		te._timer = 1;
-		te._flag = false;
+		te._flag = true;
 		_timers.push_back(te);
 	}
+	_timers[1]._initTm = _timers[1]._timer = 10;
+	_timers[2]._initTm = _timers[2]._timer = 8;
+	_timers[3]._initTm = _timers[3]._timer = 4;
+	_timers[4]._initTm = _timers[4]._timer = 2;
+	_timers[8]._initTm = _timers[8]._timer = 10;
+	_timers[25]._initTm = _timers[25]._timer = 3600;
 }
 
 void NoctropolisEngine::initVariables() {


Commit: 198b25949f54b70136dd4c6ae9f065697a3ca06f
    https://github.com/scummvm/scummvm/commit/198b25949f54b70136dd4c6ae9f065697a3ca06f
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Correct ego name logic for Noctropolis

Changed paths:
    engines/access/noctropolis/noctropolis_resources.cpp


diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 55db72c9c5f..461bbe1b69b 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -1659,7 +1659,8 @@ NoctropolisResources::~NoctropolisResources() {
 
 
 const char *NoctropolisResources::getEgoName() const {
-	return _vm->_flags[1] == 0 ? "PETER" : "DARKSHEER";
+	return _vm->_flags[1] == 0 ? "PETER" :
+		_vm->getLanguage() == Common::ES_ESP ? "TENEBROSO" : "DARKSHEER";
 }
 
 void NoctropolisResources::load(Common::SeekableReadStream &s) {


Commit: 04d48d9d37e431305e93a0dd52412a06d51c03f9
    https://github.com/scummvm/scummvm/commit/04d48d9d37e431305e93a0dd52412a06d51c03f9
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add initial reloadRoom1 for Noctropolis

Changed paths:
    engines/access/noctropolis/noctropolis_room.cpp


diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 8939db79842..6b38945f589 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -35,6 +35,35 @@ void NoctropolisRoom::reloadRoom() {
 }
 
 void NoctropolisRoom::reloadRoom1() {
+	// TODO: Check this. Currently just copied from MartianRoom.
+	_selectCommand = -1;
+	_vm->_boxSelect = false; //-1
+	_vm->_player->_playerOff = false;
+
+	_vm->_screen->forceFadeOut();
+	_vm->_events->hideCursor();
+	_vm->_screen->clearScreen();
+	_vm->_events->showCursor();
+	roomInit();
+	_vm->_player->load();
+
+	if (_vm->_player->_roomNumber != 47)
+		_vm->_player->calcManScale();
+
+	_vm->_events->hideCursor();
+	roomMenu();
+	_vm->_screen->setBufferScan();
+	setupRoom();
+	setWallCodes();
+	buildScreen();
+	_vm->copyBF2Vid();
+
+	_vm->_screen->setManPalette();
+	_vm->_events->showCursor();
+	_vm->_player->_frame = 0;
+	_vm->_oldRects.clear();
+	_vm->_newRects.clear();
+	_vm->_events->clearEvents();
 }
 
 void NoctropolisRoom::buildScreenXScroll() {


Commit: 1787cbbef26f5e1721fb0e32cee50ce2e10c6b2f
    https://github.com/scummvm/scummvm/commit/1787cbbef26f5e1721fb0e32cee50ce2e10c6b2f
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Initial implementation of text drawing ops

Changed paths:
    engines/access/bubble_box.cpp
    engines/access/bubble_box.h
    engines/access/font.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/scripts.cpp
    engines/access/scripts.h


diff --git a/engines/access/bubble_box.cpp b/engines/access/bubble_box.cpp
index 1222d6ee55f..e0ae51a8df5 100644
--- a/engines/access/bubble_box.cpp
+++ b/engines/access/bubble_box.cpp
@@ -162,10 +162,19 @@ void BubbleBox::calcBubble(const Common::String &msg) {
 }
 
 void BubbleBox::printBubble(const Common::String &msg) {
-	if (_vm->getGameID() == kGameMartianMemorandum)
+	switch (_vm->getGameID()) {
+	case kGameMartianMemorandum:
 		printBubble_v1(msg);
-	else
+		break;
+	case kGameAmazon:
 		printBubble_v2(msg);
+		break;
+	case kGameNoctropolis:
+		printBubble_v3(msg);
+		break;
+	default:
+		error("BubbleBox::printBubble: Unsupported game");
+	}
 }
 
 void BubbleBox::printBubble_v1(const Common::String &msg) {
@@ -226,16 +235,60 @@ void BubbleBox::printBubble_v2(const Common::String &msg) {
 	} while (!lastLine);
 }
 
+void BubbleBox::printBubble_v3(const Common::String &msg) {
+	Font::_fontColors[1] = 255;
+
+	drawBubble(_bubbles.size() - 1);
+
+	Font::_fontColors[1] = 247;
+
+	// Loop through drawing the lines
+	Common::String s = msg;
+	Common::String line;
+	int width = 0;
+	bool lastLine;
+	do {
+		// Get next line
+		const Font *font = _vm->_fonts.getFont(4);
+		_vm->_fonts._font1 = font;
+		lastLine = font->getLine(s, _vm->_screen->_maxChars, line, width, Font::kWidthInChars);
+		// Draw the text
+		printString(line);
+
+		// Move print position
+		_vm->_screen->_printOrg.y += 6;
+		_vm->_screen->_printOrg.x = _vm->_screen->_printStart.x;
+	} while (!lastLine);
+
+}
+
+
 void BubbleBox::drawBubble(int index) {
 	_bounds = _bubbles[index];
-	if (_vm->getGameID() == kGameMartianMemorandum) {
-		int btnSelected = 0;
+	int btnSelected = 0;
+
+	switch (_vm->getGameID()) {
+	case kGameMartianMemorandum:
 		doBox_v1(0, 0, btnSelected);
-	} else
-		doBox(0, 0);
+		break;
+	case kGameAmazon:
+		doBox_v2(0, 0);
+		break;
+	case kGameNoctropolis:
+		doBox_v3(0, 0);
+		break;
+	default:
+		error("BubbleBox::drawBubble: Unsupported game");
+	}
+}
+
+
+void BubbleBox::doBox_v3(int item, int box) {
+	const Font *font = _vm->_fonts.getFont(4);
+	int textWidth = font->stringWidth(_bubbleDisplStr);
 }
 
-void BubbleBox::doBox(int item, int box) {
+void BubbleBox::doBox_v2(int item, int box) {
 	FontManager &fonts = _vm->_fonts;
 	Screen &screen = *_vm->_screen;
 
diff --git a/engines/access/bubble_box.h b/engines/access/bubble_box.h
index 05146159f85..f796ec7c4ed 100644
--- a/engines/access/bubble_box.h
+++ b/engines/access/bubble_box.h
@@ -55,6 +55,7 @@ private:
 	 */
 	void printBubble_v1(const Common::String &msg);
 	void printBubble_v2(const Common::String &msg);
+	void printBubble_v3(const Common::String &msg);
 
 public:
 	BoxType _type;
@@ -99,7 +100,8 @@ public:
 	 */
 	void drawBubble(int index);
 
-	void doBox(int item, int box);
+	void doBox_v2(int item, int box);
+	void doBox_v3(int item, int box);
 
 	int doBox_v1(int item, int box, int &btnSelected);
 	void getList(const char *const data[], const byte *flags);
diff --git a/engines/access/font.cpp b/engines/access/font.cpp
index a33163a5082..eec84ab7b58 100644
--- a/engines/access/font.cpp
+++ b/engines/access/font.cpp
@@ -57,7 +57,7 @@ bool Font::getLine(Common::String &s, int maxWidth, Common::String &line, int &w
 	char c;
 
 	while ((c = *src) != '\0') {
-		if (c == '\r') {
+		if (c == '\r' || c == '\n') {
 			// End of line, so return calculated line
 			line = Common::String(s.c_str(), src);
 			s = Common::String(src + 1);
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 7161ca8982d..d10fbe210ba 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -24,6 +24,7 @@
 #include "access/noctropolis/noctropolis_scripts.h"
 #include "image/png.h"
 #include "graphics/color_quantizer.h"
+#include "common/config-manager.h"
 
 namespace Access {
 
@@ -84,7 +85,8 @@ void NoctropolisEngine::initVariables() {
 }
 
 void NoctropolisEngine::playGame() {
-	if (_loadSaveSlot == -1) {
+	bool skipIntro = ConfMan.getBool("skip_intro");
+	if (_loadSaveSlot == -1 && !skipIntro) {
 		bool keepGoing = true;
 		Common::CustomEventType action = kActionNone;
 		doFlashLogo();
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 461bbe1b69b..dda862872a4 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -1688,6 +1688,10 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	_vm->_fonts.addFont(_fontGothiceu);
 	_vm->_fonts.addFont(_fontChaletse);
 	_vm->_fonts.addFont(_fontComicseu);
+	
+	// Set some default fonts
+	_vm->_fonts._font1 = _fontChaleteu;
+	_vm->_fonts._font2 = _fontSystemeu;
 
 	// Set up the room data
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index c5240c62f16..15fcd858e20 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -137,6 +137,7 @@ void Scripts::setOpcodes_v2() {
 }
 
 void Scripts::setOpcodes_v3() {
+	COMMAND_LIST[50] = &Scripts::cmdCharSpeak_v3;
 	COMMAND_LIST[57] = &Scripts::cmdDigitalPlay;
 	COMMAND_LIST[60] = &Scripts::cmdFillSound;
 	COMMAND_LIST[61] = &Scripts::cmdBD;
@@ -996,6 +997,21 @@ void Scripts::cmdCharSpeak() {
 	findNull();
 }
 
+void Scripts::cmdCharSpeak_v3() {
+	int16 x = _data->readUint16LE();
+	int16 y = _data->readUint16LE();
+	_charsOrg = Common::Point(x, y);
+	_vm->_screen->_printOrg = _charsOrg;
+	_vm->_screen->_printStart = _charsOrg;
+
+	// TODO: Duck (reduce) music volume to 50%
+
+	Common::String str = _data->readString();
+	debugC(1, kDebugScripts, "cmdCharSpeak(str=\"%s\")", str.c_str());
+	_vm->_bubbleBox->placeBubble(str);
+	findNull();
+}
+
 void Scripts::cmdTexSpeak() {
 	_vm->_screen->_printOrg = _texsOrg;
 	_vm->_screen->_printStart = _texsOrg;
@@ -1308,7 +1324,16 @@ void Scripts::cmdDigitalPlay() {
 }
 
 void Scripts::cmdFillSound() {
-    error("TODO: Implement Scripts::cmdFillSound");
+	debugCN(1, kDebugScripts, "cmdFillSound()");
+	while (_vm->_sound->isSFXPlaying() && !_vm->shouldQuit()) {
+		_vm->_events->pollEventsAndWait();
+		Common::CustomEventType action;
+		if (_vm->_events->getAction(action) && action == kActionSkip) {
+			_vm->_sound->stopSound();
+			_vm->_events->zeroKeysActions();
+			break;
+		}
+	}
 }
 
 void Scripts::cmdPlayVid1() {
@@ -1320,7 +1345,11 @@ void Scripts::cmdCharWait() {
 }
 
 void Scripts::cmdUndoText() {
-    error("TODO: Implement Scripts::cmdUndoText");
+	debugCN(1, kDebugScripts, "cmdUndoText()");
+
+	// TODO: Restore music volume to 100%
+
+	_vm->_bubbleBox->clearBubbles();
 }
 
 void Scripts::cmdResetAnim() {
@@ -1336,7 +1365,14 @@ void Scripts::cmdWalkCheck() {
 }
 
 void Scripts::cmdSoundEnd() {
-    error("TODO: Implement Scripts::cmdSoundEnd");
+	debugCN(1, kDebugScripts, "cmdSoundEnd()");
+	if (!_vm->_sound->isSFXPlaying()) {
+		debugC(1, kDebugScripts, " -> True");
+		cmdGoto();
+	} else {
+		debugC(1, kDebugScripts, " -> False");
+		_data->skip(2);
+	}
 }
 
 void Scripts::cmdFadeWhite() {
@@ -1368,10 +1404,12 @@ void Scripts::cmdStilWalkCheck() {
 }
 
 void Scripts::cmdStilOff() {
+	debugCN(1, kDebugScripts, "cmdStilOff()");
 	_vm->_stilOff = true;
 }
 
 void Scripts::cmdStilOn() {
+	debugCN(1, kDebugScripts, "cmdStilOn()");
 	_vm->_stilOff = false;
 }
 
diff --git a/engines/access/scripts.h b/engines/access/scripts.h
index 4a268c0da24..c9d9c8d7cab 100644
--- a/engines/access/scripts.h
+++ b/engines/access/scripts.h
@@ -166,6 +166,7 @@ protected:
 	void cmdStilScale();
 	void cmdLockInterface();
 	void cmdUnlockInterface();
+	void cmdCharSpeak_v3();
 
 public:
 	int _sequence;


Commit: 4d7cc2d9b5f768da1a5042ace76dae21e9e04585
    https://github.com/scummvm/scummvm/commit/4d7cc2d9b5f768da1a5042ace76dae21e9e04585
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix noctropolis extractor

Changed paths:
    devtools/create_access/extract_noctropolis_resources.py


diff --git a/devtools/create_access/extract_noctropolis_resources.py b/devtools/create_access/extract_noctropolis_resources.py
index ebe02c935b4..c53c0ff7649 100644
--- a/devtools/create_access/extract_noctropolis_resources.py
+++ b/devtools/create_access/extract_noctropolis_resources.py
@@ -10,264 +10,267 @@ individual bits and print them out to go into CPP files.
 
 
 def read_c_string(f, offset=None):
-    """Read a null-terminated string from file starting at offset."""
-    if offset is not None:
-        f.seek(offset)
-    chars = []
-    while True:
-        b = f.read(1)
-        if not b or b == b"\x00":
-            break
-        chars.append(b.decode("latin1"))  # latin1 avoids decode errors
-    return "".join(chars)
+	"""Read a null-terminated string from file starting at offset."""
+	if offset is not None:
+		f.seek(offset)
+	chars = []
+	while True:
+		b = f.read(1)
+		if not b or b == b"\x00":
+			break
+		chars.append(b.decode("latin1"))  # latin1 avoids decode errors
+	return "".join(chars)
 
 
 def read_one_pointer(f):
-    data = f.read(8)
-    if len(data) < 8:
-        return 0
-    (value,) = struct.unpack("<Q", data)
-    # strip off the segment
-    value &= 0xFFFFFF
-    return value
+	data = f.read(8)
+	if len(data) < 8:
+		return 0
+	(value,) = struct.unpack("<Q", data)
+	# strip off the segment
+	value &= 0xFFFFFF
+	return value
 
 
 def read_pointer_list(f, count=None):
-    """
-    Read a list of pointers (64-bit) from the current file offset.
-    Read count pointers (if set) or until a null pointer is hit otherwise.
-    """
-    offsets = []
-    # Read 64-bit little-endian integers until 0 or count
-    while True:
-        value = read_one_pointer(f)
-        if count is None and value == 0:
-            break
-        offsets.append(value)
-        if count is not None:
-            count -= 1
-            if count == 0:
-                break
-    return offsets
+	"""
+	Read a list of pointers (64-bit) from the current file offset.
+	Read count pointers (if set) or until a null pointer is hit otherwise.
+	"""
+	offsets = []
+	# Read 64-bit little-endian integers until 0 or count
+	while True:
+		value = read_one_pointer(f)
+		if count is None and value == 0:
+			break
+		offsets.append(value)
+		if count is not None:
+			count -= 1
+			if count == 0:
+				break
+	return offsets
 
 
 # read a file/subfile pair and as shorts
 def file_ints_to_shorts(f):
-    """
-    Read the file/subfile pair of int32s and recode them as int16
-    """
-    data = f.read(8)
-    file, subfile = struct.unpack("<ii", data)
-    return struct.pack("<hh", file, subfile)
+	"""
+	Read the file/subfile pair of int32s and recode them as int16
+	"""
+	data = f.read(8)
+	file, subfile = struct.unpack("<ii", data)
+	return struct.pack("<hh", file, subfile)
 
 
 def read_room_cell_data(f):
-    alldata = b""
-    while True:
-        data = f.read(4)
-        alldata += data[0:1]  # convert int32 -> byte for cell num
-        (cell,) = struct.unpack("<I", data)
-        if cell == 0xFF:
-            return alldata
-        alldata += file_ints_to_shorts(f)
+	alldata = b""
+	while True:
+		data = f.read(4)
+		alldata += data[0:1]  # convert int32 -> byte for cell num
+		(cell,) = struct.unpack("<I", data)
+		if cell == 0xFF:
+			return alldata
+		alldata += file_ints_to_shorts(f)
 
 
 def read_room_vid_data(f):
-    """
-    Read the video data table for the room data
-    """
-    offsets = read_pointer_list(f)
+	"""
+	Read the video data table for the room data
+	"""
+	offsets = read_pointer_list(f)
 
-    # Collect strings from those offsets
-    strings = [read_c_string(f, off) for off in offsets]
-    asbytes = [x.encode("utf-8") for x in strings]
+	if not offsets:
+		return b"\0"
 
-    result = b"\0".join(asbytes) + b"\0"
-    return result
+	# Collect strings from those offsets
+	strings = [read_c_string(f, off) for off in offsets]
+	asbytes = [x.encode("utf-8") for x in strings]
+
+	result = b"\0".join(asbytes) + b"\0\0"
+	return result
 
 
 def read_room_sound_data(f):
-    """
-    Read the sound list for room data.  Each sound entry is 24 bytes:
-     * file/subfile/priority int32s and 12 bytes of null
-     * if the file is -1, it's the end of the list
-     * if the priority is 0xff, the last 8 bytes can be a pointer to a file name.
-
-     convert that to a more compact and similar-to-others format:
-     * if file is 0xff -> read a file name string, else read subfile
-     * write ints as int16
-    """
-    alldata = b""
-    while True:
-        data = f.read(8)
-        file, subfile = struct.unpack("<ii", data)
-        # print(f"{file}, {subfile}")
-        if file == -1:
-            alldata += struct.pack("<h", file)
-            return alldata
-
-        priodata = f.read(4)
-        (priority,) = struct.unpack("<I", priodata)
-
-        _dummy = f.read(4)
-        if priority == 0xFF:
-            strptr = read_one_pointer(f)
-            if strptr != 0:
-                curpos = f.tell()
-                filename = read_c_string(f, strptr)
-                alldata += struct.pack("<H", 0xFF)
-                alldata += filename.encode("utf-8")
-                alldata += b"\0"
-                # print(f"Read string {filename} from 0x%x" % strptr)
-                f.seek(curpos)
-            else:
-                alldata += struct.pack("<HH", file, subfile)
-        else:
-            f.read(8)  # null str ptr
-            alldata += struct.pack("<HH", file, subfile)
-
-        alldata += struct.pack("<H", priority)
+	"""
+	Read the sound list for room data.  Each sound entry is 24 bytes:
+	 * file/subfile/priority int32s and 12 bytes of null
+	 * if the file is -1, it's the end of the list
+	 * if the priority is 0xff, the last 8 bytes can be a pointer to a file name.
+
+	 convert that to a more compact and similar-to-others format:
+	 * if file is 0xff -> read a file name string, else read subfile
+	 * write ints as int16
+	"""
+	alldata = b""
+	while True:
+		data = f.read(8)
+		file, subfile = struct.unpack("<ii", data)
+		# print(f"{file}, {subfile}")
+		if file == -1:
+			alldata += struct.pack("<h", file)
+			return alldata
+
+		priodata = f.read(4)
+		(priority,) = struct.unpack("<I", priodata)
+
+		_dummy = f.read(4)
+		if priority == 0xFF:
+			strptr = read_one_pointer(f)
+			if strptr != 0:
+				curpos = f.tell()
+				filename = read_c_string(f, strptr)
+				alldata += struct.pack("<H", 0xFF)
+				alldata += filename.encode("utf-8")
+				alldata += b"\0"
+				# print(f"Read string {filename} from 0x%x" % strptr)
+				f.seek(curpos)
+			else:
+				alldata += struct.pack("<HH", file, subfile)
+		else:
+			f.read(8)  # null str ptr
+			alldata += struct.pack("<HH", file, subfile)
+
+		alldata += struct.pack("<H", priority)
 
 
 def print_data_as_c_array(data):
-    for o in range((len(data) + 15) // 16):
-        subdata = data[16 * o : 16 * (o + 1)]
-        subdata_str = ["0x%02x," % v for v in subdata]
-        result = " ".join(subdata_str)
-        print("\t" + result)
+	for o in range((len(data) + 15) // 16):
+		subdata = data[16 * o : 16 * (o + 1)]
+		subdata_str = ["0x%02x," % v for v in subdata]
+		result = " ".join(subdata_str)
+		print("\t" + result)
 
 
 def read_room_data(f, i: int, offset: int):
-    f.seek(offset)
-    data = f.read(2)  # roomflag and pal intensity
-    f.read(2)  # unused
-    data += file_ints_to_shorts(f)  # music file/subfile
-    data += f.read(3)  # scale vals
-    f.read(1)  # unused
-    data += file_ints_to_shorts(f)  # playfield file/subfile
-    cellptr = read_one_pointer(f)
-    if cellptr == 0:
-        data += bytes([0xFF])
-    else:
-        curpos = f.tell()
-        f.seek(cellptr)
-        data += read_room_cell_data(f)
-        f.seek(curpos)
-
-    data += file_ints_to_shorts(f)  # script file/subfile
-    data += file_ints_to_shorts(f)  # anim file/subfile
-    data += f.read(1)  # scaleI
-    f.read(1)  # unused
-    (scrollThreshold,) = struct.unpack("<h", f.read(2))
-    assert scrollThreshold <= 0xFF
-    data += struct.pack("<B", scrollThreshold)
-
-    f.read(12)  # Skip palette file nums (unused) and 4 bytes after
-
-    videoptr = read_one_pointer(f)
-    if videoptr:
-        curpos = f.tell()
-        f.seek(videoptr)
-        data += read_room_vid_data(f)
-        f.seek(curpos)
-    else:
-        data += b"\0"
-
-    soundptr = read_one_pointer(f)
-    if soundptr:
-        curpos = f.tell()
-        f.seek(soundptr)
-        # print("Read sounds from 0x%x" % soundptr)
-        data += read_room_sound_data(f)
-        f.seek(curpos)
-    else:
-        data += struct.pack("<h", -1)
-
-    print("static const byte ROOMDATA_%02d[] = {" % i)
-    print_data_as_c_array(data)
-    print("};")
+	f.seek(offset)
+	data = f.read(2)  # roomflag and pal intensity
+	f.read(2)  # unused
+	data += file_ints_to_shorts(f)  # music file/subfile
+	data += f.read(3)  # scale vals
+	f.read(1)  # unused
+	data += file_ints_to_shorts(f)  # playfield file/subfile
+	cellptr = read_one_pointer(f)
+	if cellptr == 0:
+		data += bytes([0xFF])
+	else:
+		curpos = f.tell()
+		f.seek(cellptr)
+		data += read_room_cell_data(f)
+		f.seek(curpos)
+
+	data += file_ints_to_shorts(f)  # script file/subfile
+	data += file_ints_to_shorts(f)  # anim file/subfile
+	data += f.read(1)  # scaleI
+	f.read(1)  # unused
+	(scrollThreshold,) = struct.unpack("<h", f.read(2))
+	assert scrollThreshold <= 0xFF
+	data += struct.pack("<B", scrollThreshold)
+
+	f.read(12)  # Skip palette file nums (unused) and 4 bytes after
+
+	videoptr = read_one_pointer(f)
+	if videoptr:
+		curpos = f.tell()
+		f.seek(videoptr)
+		data += read_room_vid_data(f)
+		f.seek(curpos)
+	else:
+		data += b"\0"
+
+	soundptr = read_one_pointer(f)
+	if soundptr:
+		curpos = f.tell()
+		f.seek(soundptr)
+		# print("Read sounds from 0x%x" % soundptr)
+		data += read_room_sound_data(f)
+		f.seek(curpos)
+	else:
+		data += struct.pack("<h", -1)
+
+	print("static const byte ROOMDATA_%02d[] = {" % i)
+	print_data_as_c_array(data)
+	print("};")
 
 
 def read_rooms(f):
-    f.seek(0x9F400)
-    offsets = read_pointer_list(f, count=100)
-
-    for i, offset in enumerate(offsets):
-        if offset != 0:
-            read_room_data(f, i, offset)
-
-    print("")
-    print("")
-    for i, offset in enumerate(offsets):
-        if offset == 0:
-            print(
-                '\tROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));'
-            )
-        else:
-            print(
-                '\tROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_%02d, ARRAYSIZE(ROOMDATA_%02d))}));'
-                % (i, i)
-            )
+	f.seek(0x9F400)
+	offsets = read_pointer_list(f, count=100)
+
+	for i, offset in enumerate(offsets):
+		if offset != 0:
+			read_room_data(f, i, offset)
+
+	print("")
+	print("")
+	for i, offset in enumerate(offsets):
+		if offset == 0:
+			print(
+				'\tROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));'
+			)
+		else:
+			print(
+				'\tROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_%02d, ARRAYSIZE(ROOMDATA_%02d))}));'
+				% (i, i)
+			)
 
 
 def read_filenames(f):
-    base_offset = 0x94830
-    f.seek(base_offset)
+	base_offset = 0x94830
+	f.seek(base_offset)
 
-    offsets = read_pointer_list(f)
+	offsets = read_pointer_list(f)
 
-    # Collect strings from those offsets
-    strings = [read_c_string(f, off) for off in offsets]
+	# Collect strings from those offsets
+	strings = [read_c_string(f, off) for off in offsets]
 
-    print("static const char *FILENAMES[] = {")
-    for s in strings:
-        escaped = s.replace("\\", "\\\\").replace('"', '\\"')
-        print(f'\t"{escaped}",')
-    print("};")
+	print("static const char *FILENAMES[] = {")
+	for s in strings:
+		escaped = s.replace("\\", "\\\\").replace('"', '\\"')
+		print(f'\t"{escaped}",')
+	print("};")
 
 
 def read_mouse_cursor(f):
-    hotdata = f.read(4)
-    hotx, hoty = struct.unpack("<HH", hotdata)
-    width, height = struct.unpack("<HH", f.read(4))
-    gfxptr = read_one_pointer(f)
-    _texptr = read_one_pointer(f)
+	hotdata = f.read(4)
+	hotx, hoty = struct.unpack("<HH", hotdata)
+	width, height = struct.unpack("<HH", f.read(4))
+	gfxptr = read_one_pointer(f)
+	_texptr = read_one_pointer(f)
 
-    f.seek(gfxptr)
-    gfxdata = f.read(width * height)
+	f.seek(gfxptr)
+	gfxdata = f.read(width * height)
 
-    print(
-        "\t0x%02x, 0x%02x, 0x%02x, 0x%02x,   // hot x,y"
-        % (hotdata[0], hotdata[1], hotdata[2], hotdata[3])
-    )
-    print_data_as_c_array(gfxdata)
-    pass
+	print(
+		"\t0x%02x, 0x%02x, 0x%02x, 0x%02x,   // hot x,y"
+		% (hotdata[0], hotdata[1], hotdata[2], hotdata[3])
+	)
+	print_data_as_c_array(gfxdata)
+	pass
 
 
 def read_mouse_cursors(f):
-    base_offset = 0x95030
-    f.seek(base_offset)
+	base_offset = 0x95030
+	f.seek(base_offset)
 
-    offsets = read_pointer_list(f)
+	offsets = read_pointer_list(f)
 
-    for i, pointer in enumerate(offsets):
-        print("static const byte CURSOR_%d_DATA[] = {" % i)
-        f.seek(pointer)
-        read_mouse_cursor(f)
-        print("};")
+	for i, pointer in enumerate(offsets):
+		print("static const byte CURSOR_%d_DATA[] = {" % i)
+		f.seek(pointer)
+		read_mouse_cursor(f)
+		print("};")
 
 
 def main():
-    if len(sys.argv) < 2:
-        print(f"Usage: {sys.argv[0]} Macos-Noctropolis-Executable")
-        return
-    filename = sys.argv[1]
+	if len(sys.argv) < 2:
+		print(f"Usage: {sys.argv[0]} Macos-Noctropolis-Executable")
+		return
+	filename = sys.argv[1]
 
-    with open(filename, "rb") as f:
-        # read_filenames(f)
-        # read_rooms(f)
-        read_mouse_cursors(f)
+	with open(filename, "rb") as f:
+		# read_filenames(f)
+		read_rooms(f)
+		#read_mouse_cursors(f)
 
 
 if __name__ == "__main__":
-    main()
+	main()


Commit: c7b90b2629ad03f9fbebfc29068276e3a473445d
    https://github.com/scummvm/scummvm/commit/c7b90b2629ad03f9fbebfc29068276e3a473445d
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix noctropolis room 3 loading

Changed paths:
    engines/access/animation.cpp
    engines/access/animation.h
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_resources.cpp


diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index f7593693cf6..c9f0ef4e497 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -56,7 +56,7 @@ Animation::Animation(AccessEngine *vm, Common::SeekableReadStream *stream) : Man
 	// WORKAROUND: In Amazon floppy English, there's an animation associated with
 	// the librarian that isn't used, and has junk data. Luckily, it's animation
 	// type is also invalid, so if the _type isn't in range, exit immediately
-	if (_type > 7) {
+	if (_type > 7 && _vm->getGameID() == kGameAmazon) {
 		_scaling = -1;
 		_frameNumber = -1;
 		_initialTicks = _countdownTicks = 0;
@@ -96,9 +96,11 @@ Animation::~Animation() {
 typedef void(Animation::*AnimationMethodPtr)();
 
 void Animation::animate() {
-	static const AnimationMethodPtr METHODS[8] = {
+	static const AnimationMethodPtr METHODS[13] = {
 	   &Animation::anim0, &Animation::anim1, &Animation::anim2, &Animation::anim3,
-	   &Animation::anim4, &Animation::animNone, &Animation::animNone, &Animation::anim7
+	   &Animation::anim4, &Animation::animNone, &Animation::animNone, &Animation::anim7,
+	   &Animation::anim8, &Animation::anim9, &Animation::anim10, &Animation::anim11,
+	   &Animation::anim12,
 	};
 
 	(this->*METHODS[_type])();
@@ -209,6 +211,30 @@ void Animation::anim7() {
 	setFrame(calcFrame1());
 }
 
+void Animation::anim8() {
+	debug("TODO: Animation::anim8");
+}
+
+void Animation::anim9() {
+	debug("TODO: Animation::anim9");
+}
+
+void Animation::anim10() {
+	debug("TODO: Animation::anim10");
+}
+
+void Animation::anim11() {
+     // Actor idle
+	const AnimationFrame *frame = calcFrame();
+	setFrame(frame);
+	_countdownTicks += frame->_frameDelay;
+	setFrame1(frame, _vm->_player->_rawPlayer.x, _vm->_player->_rawPlayer.y - _vm->_player->_playerOffset.y);
+ }
+
+void Animation::anim12() {
+}
+
+
 const AnimationFrame *Animation::calcFrame() {
 	return (_frameNumber < (int)_frames.size()) ? _frames[_frameNumber] : nullptr;
 }
@@ -223,9 +249,9 @@ void Animation::setFrame(const AnimationFrame *frame) {
 	setFrame1(frame);
 }
 
-void Animation::setFrame1(const AnimationFrame *frame) {
-	_vm->_animation->_base.x = frame->_baseX;
-	_vm->_animation->_base.y = frame->_baseY;
+void Animation::setFrame1(const AnimationFrame *frame, int16 xoff, int16 yoff) {
+	_vm->_animation->_base.x = frame->_baseX + xoff;
+	_vm->_animation->_base.y = frame->_baseY + yoff;
 
 	// Loop to add image draw requests for the parts of the frame
 	for (const AnimationFramePart &part: frame->_parts) {
diff --git a/engines/access/animation.h b/engines/access/animation.h
index 5b1aafb49e1..b769fa8d3f5 100644
--- a/engines/access/animation.h
+++ b/engines/access/animation.h
@@ -97,11 +97,16 @@ private:
 	void anim4();
 	void animNone();
 	void anim7();
+	void anim8();
+	void anim9();
+	void anim10();
+	void anim11();
+	void anim12();
 
 	const AnimationFrame *calcFrame();
 	const AnimationFrame *calcFrame1();
 	void setFrame(const AnimationFrame *frame);
-	void setFrame1(const AnimationFrame *frame);
+	void setFrame1(const AnimationFrame *frame, int16 xoff = 0, int16 yoff = 0);
 public:
 	int _type;
 	int _scaling;
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index d10fbe210ba..16cc2c51e1f 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -65,7 +65,7 @@ void NoctropolisEngine::setupGame() {
 
 void NoctropolisEngine::initVariables() {
 	// Set player room and position
-	_player->_roomNumber = 2;
+	_player->_roomNumber = 3;
 
 	_invScript->setScript(_files->loadRawFile("INVTEXT.AP"));
 
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index dda862872a4..1b1615e0215 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -95,9 +95,9 @@ static const byte ROOMDATA_03[] = {
 	0x31, 0x30, 0x31, 0x31, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
 	0x49, 0x44, 0x2f, 0x41, 0x31, 0x4f, 0x44, 0x31, 0x30, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00,
 	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x46, 0x4c, 0x49, 0x50, 0x2e, 0x56,
-	0x49, 0x44, 0x00, 0x63, 0x00, 0x03, 0x00, 0x01, 0x00, 0x63, 0x00, 0x04, 0x00, 0x03, 0x00, 0x63,
-	0x00, 0x02, 0x00, 0x02, 0x00, 0x63, 0x00, 0x07, 0x00, 0x03, 0x00, 0x63, 0x00, 0x3c, 0x00, 0x03,
-	0x00, 0xff, 0xff,
+	0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x03, 0x00, 0x01, 0x00, 0x63, 0x00, 0x04, 0x00, 0x03, 0x00,
+	0x63, 0x00, 0x02, 0x00, 0x02, 0x00, 0x63, 0x00, 0x07, 0x00, 0x03, 0x00, 0x63, 0x00, 0x3c, 0x00,
+	0x03, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_04[] = {
 	0x00, 0x02, 0x62, 0x00, 0x07, 0x00, 0xa0, 0x84, 0x5a, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00,
@@ -133,7 +133,7 @@ static const byte ROOMDATA_11[] = {
 	0x41, 0x32, 0x30, 0x32, 0x31, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
 	0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x31, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
 	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x31, 0x39, 0x2e, 0x56,
-	0x49, 0x44, 0x00, 0xff, 0xff,
+	0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_12[] = {
 	0x03, 0x02, 0x62, 0x00, 0x15, 0x00, 0x64, 0x28, 0x70, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00,
@@ -157,9 +157,9 @@ static const byte ROOMDATA_12[] = {
 	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x36, 0x30, 0x33, 0x31, 0x33, 0x2e, 0x56,
 	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x36, 0x30,
 	0x33, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
-	0x32, 0x2f, 0x43, 0x36, 0x30, 0x33, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x08,
-	0x00, 0x01, 0x00, 0x63, 0x00, 0x09, 0x00, 0x01, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x63,
-	0x00, 0x0b, 0x00, 0x01, 0x00, 0xff, 0xff,
+	0x32, 0x2f, 0x43, 0x36, 0x30, 0x33, 0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00,
+	0x08, 0x00, 0x01, 0x00, 0x63, 0x00, 0x09, 0x00, 0x01, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00,
+	0x63, 0x00, 0x0b, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_13[] = {
 	0x03, 0x02, 0x62, 0x00, 0x16, 0x00, 0x4b, 0x3f, 0x32, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x0d, 0x00,
@@ -178,9 +178,9 @@ static const byte ROOMDATA_13[] = {
 	0x37, 0x31, 0x30, 0x31, 0x41, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
 	0x49, 0x44, 0x2f, 0x41, 0x37, 0x31, 0x30, 0x31, 0x42, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
 	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x31, 0x30, 0x31, 0x43, 0x2e, 0x56, 0x49,
-	0x44, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x63, 0x00, 0x15, 0x00, 0x01, 0x00, 0x63, 0x00,
-	0x2c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00, 0x00,
-	0x63, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x44, 0x00, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x63, 0x00, 0x15, 0x00, 0x01, 0x00, 0x63,
+	0x00, 0x2c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00,
+	0x00, 0x63, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_14[] = {
 	0x80, 0x02, 0x62, 0x00, 0x15, 0x00, 0x4b, 0x3c, 0x32, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x0e, 0x00,
@@ -254,8 +254,8 @@ static const byte ROOMDATA_14[] = {
 	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x35,
 	0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41,
 	0x33, 0x30, 0x34, 0x35, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
-	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x35, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x35, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_15[] = {
 	0x80, 0x02, 0x62, 0x00, 0x07, 0x00, 0xc8, 0x96, 0x6a, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00,
@@ -287,12 +287,12 @@ static const byte ROOMDATA_15[] = {
 	0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x31, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x32, 0x30, 0x2e, 0x56, 0x49, 0x44,
 	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x32, 0x31,
-	0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x27, 0x00, 0x01, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
-	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x30, 0x2e, 0x57, 0x41, 0x56,
-	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x41, 0x34,
-	0x31, 0x31, 0x30, 0x31, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
-	0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x32, 0x2e, 0x57, 0x41, 0x56,
-	0x00, 0xff, 0x00, 0xff, 0xff,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x27, 0x00, 0x01, 0x00, 0xff, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x30, 0x2e, 0x57, 0x41,
+	0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x41,
+	0x34, 0x31, 0x31, 0x30, 0x31, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41,
+	0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x32, 0x2e, 0x57, 0x41,
+	0x56, 0x00, 0xff, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_16[] = {
 	0x81, 0x02, 0x62, 0x00, 0x06, 0x00, 0xc8, 0x96, 0x6a, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,
@@ -309,8 +309,8 @@ static const byte ROOMDATA_16[] = {
 	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x37, 0x30, 0x36, 0x30, 0x37,
 	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43,
 	0x37, 0x30, 0x36, 0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
-	0x49, 0x44, 0x32, 0x2f, 0x43, 0x37, 0x30, 0x36, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63,
-	0x00, 0x28, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x49, 0x44, 0x32, 0x2f, 0x43, 0x37, 0x30, 0x36, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00,
+	0x63, 0x00, 0x28, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_17[] = {
 	0x03, 0x02, 0x62, 0x00, 0x17, 0x00, 0x68, 0x34, 0x78, 0x11, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00,
@@ -370,10 +370,10 @@ static const byte ROOMDATA_20[] = {
 	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38, 0x31, 0x34, 0x2e, 0x56,
 	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x37, 0x30, 0x38,
 	0x31, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
-	0x41, 0x37, 0x30, 0x38, 0x31, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x1d, 0x00, 0x00,
-	0x00, 0x63, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x24, 0x00, 0x00, 0x00, 0x63, 0x00, 0x68,
-	0x00, 0x00, 0x00, 0x63, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x63,
-	0x00, 0x3e, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x41, 0x37, 0x30, 0x38, 0x31, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x1d, 0x00,
+	0x00, 0x00, 0x63, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x24, 0x00, 0x00, 0x00, 0x63, 0x00,
+	0x68, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x4a, 0x00, 0x00, 0x00,
+	0x63, 0x00, 0x3e, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_22[] = {
 	0x01, 0x02, 0x62, 0x00, 0x21, 0x00, 0xc8, 0x96, 0x6a, 0x16, 0x00, 0x00, 0x00, 0x16, 0x16, 0x00,
@@ -385,7 +385,7 @@ static const byte ROOMDATA_24[] = {
 	0x00, 0x02, 0x62, 0x00, 0x19, 0x00, 0xc8, 0x96, 0x6a, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
 	0x02, 0x00, 0xff, 0x18, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x53, 0x55, 0x43, 0x53, 0x50, 0x4c, 0x54, 0x31, 0x2e,
-	0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+	0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_26[] = {
 	0x03, 0x01, 0x62, 0x00, 0x1c, 0x00, 0xa5, 0x32, 0x8a, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x1a, 0x00,
@@ -439,9 +439,9 @@ static const byte ROOMDATA_26[] = {
 	0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f,
 	0x43, 0x32, 0x33, 0x32, 0x32, 0x33, 0x35, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33, 0x32, 0x32, 0x33, 0x35, 0x31, 0x2e,
-	0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00, 0x00,
-	0x63, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x28, 0x00,
-	0x00, 0x00, 0xff, 0xff,
+	0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00,
+	0x00, 0x63, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x28,
+	0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_27[] = {
 	0x03, 0x02, 0x62, 0x00, 0x0e, 0x00, 0x48, 0x30, 0x34, 0x1b, 0x00, 0x00, 0x00, 0x1b, 0x1b, 0x00,
@@ -500,7 +500,8 @@ static const byte ROOMDATA_27[] = {
 	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x33, 0x39,
 	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44,
 	0x31, 0x31, 0x32, 0x34, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
-	0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+	0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff,
+	0xff,
 };
 static const byte ROOMDATA_28[] = {
 	0x02, 0x02, 0x62, 0x00, 0x1e, 0x00, 0x69, 0x5a, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00,
@@ -532,7 +533,7 @@ static const byte ROOMDATA_28[] = {
 	0x44, 0x2f, 0x41, 0x34, 0x31, 0x34, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x34, 0x30, 0x33, 0x2e, 0x56, 0x49, 0x44,
 	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x34, 0x31, 0x30,
-	0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x72, 0x00, 0xfe, 0x00, 0xff, 0xff,
+	0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x72, 0x00, 0xfe, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_29[] = {
 	0x03, 0x02, 0x62, 0x00, 0x10, 0x00, 0x6e, 0x3e, 0xbe, 0x1d, 0x00, 0x00, 0x00, 0x1d, 0x1d, 0x00,
@@ -580,7 +581,8 @@ static const byte ROOMDATA_29[] = {
 	0x31, 0x37, 0x31, 0x31, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
 	0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
 	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x38, 0x2e, 0x56, 0x49,
-	0x44, 0x00, 0x63, 0x00, 0x25, 0x00, 0x03, 0x00, 0x63, 0x00, 0x1f, 0x00, 0x03, 0x00, 0xff, 0xff,
+	0x44, 0x00, 0x00, 0x63, 0x00, 0x25, 0x00, 0x03, 0x00, 0x63, 0x00, 0x1f, 0x00, 0x03, 0x00, 0xff,
+	0xff,
 };
 static const byte ROOMDATA_30[] = {
 	0x03, 0x03, 0x62, 0x00, 0x13, 0x00, 0x7d, 0x33, 0x5b, 0x1e, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x00,
@@ -639,8 +641,8 @@ static const byte ROOMDATA_30[] = {
 	0x44, 0x2f, 0x41, 0x34, 0x32, 0x31, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x32, 0x31, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44,
 	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x37,
-	0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x63, 0x00, 0x1b, 0x00, 0x00,
-	0x00, 0x63, 0x00, 0x04, 0x00, 0x03, 0x00, 0x63, 0x00, 0x2c, 0x00, 0x03, 0x00, 0xff, 0xff,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x63, 0x00, 0x1b, 0x00,
+	0x00, 0x00, 0x63, 0x00, 0x04, 0x00, 0x03, 0x00, 0x63, 0x00, 0x2c, 0x00, 0x03, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_31[] = {
 	0x00, 0x02, 0x62, 0x00, 0x1a, 0x00, 0xc8, 0x96, 0x6a, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00,
@@ -663,7 +665,7 @@ static const byte ROOMDATA_31[] = {
 	0x30, 0x32, 0x33, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
 	0x49, 0x44, 0x31, 0x2f, 0x42, 0x30, 0x32, 0x33, 0x31, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
 	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x30, 0x32, 0x33, 0x31, 0x34, 0x2e,
-	0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+	0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_32[] = {
 	0x03, 0x02, 0x62, 0x00, 0x06, 0x00, 0xa4, 0x36, 0x6f, 0x20, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00,
@@ -687,7 +689,7 @@ static const byte ROOMDATA_32[] = {
 	0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
 	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34, 0x31, 0x33, 0x2e, 0x56,
 	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e,
-	0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+	0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_33[] = {
 	0x81, 0x02, 0x62, 0x00, 0x08, 0x00, 0xc8, 0x96, 0x6a, 0x21, 0x00, 0x00, 0x00, 0x21, 0x21, 0x00,
@@ -723,7 +725,7 @@ static const byte ROOMDATA_33[] = {
 	0x44, 0x30, 0x32, 0x35, 0x32, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
 	0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x32, 0x33, 0x2e, 0x56, 0x49, 0x44, 0x00,
 	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x32, 0x34,
-	0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_34[] = {
 	0x00, 0x02, 0x62, 0x00, 0x23, 0x00, 0xc8, 0x96, 0x6a, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00,
@@ -766,7 +768,7 @@ static const byte ROOMDATA_35[] = {
 	0x42, 0x31, 0x34, 0x31, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f,
 	0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x34, 0x31, 0x32, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44,
 	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x34, 0x31, 0x32,
-	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_37[] = {
 	0x03, 0x02, 0x62, 0x00, 0x24, 0x00, 0x41, 0x2a, 0x38, 0x25, 0x00, 0x00, 0x00, 0x25, 0x25, 0x00,
@@ -788,8 +790,8 @@ static const byte ROOMDATA_38[] = {
 	0x32, 0x32, 0x37, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
 	0x49, 0x44, 0x31, 0x2f, 0x42, 0x32, 0x32, 0x37, 0x30, 0x37, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
 	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x32, 0x32, 0x37, 0x31, 0x30, 0x30,
-	0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x63, 0x00, 0x60, 0x00, 0x01,
-	0x00, 0x63, 0x00, 0x6e, 0x00, 0x01, 0x00, 0xff, 0xff,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x63, 0x00, 0x60, 0x00,
+	0x01, 0x00, 0x63, 0x00, 0x6e, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_39[] = {
 	0x00, 0x02, 0x62, 0x00, 0x18, 0x00, 0xc8, 0x96, 0x6a, 0x27, 0x00, 0x00, 0x00, 0x27, 0x27, 0x00,
@@ -830,8 +832,8 @@ static const byte ROOMDATA_41[] = {
 	0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x33, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00,
 	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x33, 0x37,
 	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x46,
-	0x4c, 0x41, 0x53, 0x48, 0x45, 0x52, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x0c, 0x00, 0x00,
-	0x00, 0xff, 0xff,
+	0x4c, 0x41, 0x53, 0x48, 0x45, 0x52, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x0c, 0x00,
+	0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_42[] = {
 	0x81, 0x02, 0x62, 0x00, 0x0d, 0x00, 0xc8, 0x96, 0x6a, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x2a, 0x00,
@@ -856,10 +858,10 @@ static const byte ROOMDATA_42[] = {
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x30, 0x30, 0x38, 0x2e, 0x56, 0x49,
 	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x31,
 	0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
-	0x41, 0x34, 0x32, 0x39, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x0d, 0x00, 0x00,
-	0x00, 0x63, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x69, 0x00, 0x00, 0x00, 0x63, 0x00, 0x34,
-	0x00, 0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x63,
-	0x00, 0x2c, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x41, 0x34, 0x32, 0x39, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x0d, 0x00,
+	0x00, 0x00, 0x63, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x69, 0x00, 0x00, 0x00, 0x63, 0x00,
+	0x34, 0x00, 0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00,
+	0x63, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_43[] = {
 	0x03, 0x01, 0x62, 0x00, 0x18, 0x00, 0x75, 0x1d, 0x66, 0x2b, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x00,
@@ -901,11 +903,11 @@ static const byte ROOMDATA_46[] = {
 	0x31, 0x2f, 0x42, 0x33, 0x33, 0x31, 0x30, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x31, 0x30, 0x37, 0x2e, 0x56, 0x49,
 	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x33, 0x33, 0x31,
-	0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x58, 0x00, 0x01, 0x00, 0x63, 0x00, 0x2a,
-	0x00, 0x01, 0x00, 0x63, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x63, 0x00, 0x4c, 0x00, 0x01, 0x00, 0x63,
-	0x00, 0x20, 0x00, 0x01, 0x00, 0x63, 0x00, 0x34, 0x00, 0x01, 0x00, 0x63, 0x00, 0x2c, 0x00, 0x01,
-	0x00, 0x63, 0x00, 0x36, 0x00, 0x01, 0x00, 0x63, 0x00, 0x2d, 0x00, 0x01, 0x00, 0x63, 0x00, 0x68,
-	0x00, 0x01, 0x00, 0x63, 0x00, 0x71, 0x00, 0x01, 0x00, 0xff, 0xff,
+	0x30, 0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x58, 0x00, 0x01, 0x00, 0x63, 0x00,
+	0x2a, 0x00, 0x01, 0x00, 0x63, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x63, 0x00, 0x4c, 0x00, 0x01, 0x00,
+	0x63, 0x00, 0x20, 0x00, 0x01, 0x00, 0x63, 0x00, 0x34, 0x00, 0x01, 0x00, 0x63, 0x00, 0x2c, 0x00,
+	0x01, 0x00, 0x63, 0x00, 0x36, 0x00, 0x01, 0x00, 0x63, 0x00, 0x2d, 0x00, 0x01, 0x00, 0x63, 0x00,
+	0x68, 0x00, 0x01, 0x00, 0x63, 0x00, 0x71, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_48[] = {
 	0x01, 0x02, 0x62, 0x00, 0x13, 0x00, 0xa0, 0x56, 0x57, 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00,
@@ -958,7 +960,7 @@ static const byte ROOMDATA_50[] = {
 	0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x32, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
 	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x32, 0x36, 0x2e,
 	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35,
-	0x33, 0x33, 0x31, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+	0x33, 0x33, 0x31, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_51[] = {
 	0x03, 0x01, 0x62, 0x00, 0x12, 0x00, 0xc8, 0x84, 0x65, 0x33, 0x00, 0x00, 0x00, 0x33, 0x33, 0x00,
@@ -982,8 +984,8 @@ static const byte ROOMDATA_51[] = {
 	0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34, 0x31, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
 	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34, 0x31, 0x33, 0x2e, 0x56,
 	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33,
-	0x34, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x26, 0x00, 0x00, 0x00, 0x63, 0x00,
-	0x4d, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x34, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x26, 0x00, 0x00, 0x00, 0x63,
+	0x00, 0x4d, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_52[] = {
 	0x02, 0x01, 0x62, 0x00, 0x20, 0x00, 0x8c, 0x7e, 0x54, 0x34, 0x00, 0x00, 0x00, 0x34, 0x34, 0x00,
@@ -1040,7 +1042,7 @@ static const byte ROOMDATA_54[] = {
 	0x30, 0x33, 0x36, 0x32, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
 	0x49, 0x44, 0x32, 0x2f, 0x43, 0x30, 0x33, 0x36, 0x33, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
 	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x50, 0x41, 0x53, 0x53, 0x4f, 0x55, 0x54,
-	0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x4e, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x4e, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_55[] = {
 	0x02, 0x02, 0x62, 0x00, 0x26, 0x00, 0xb9, 0x51, 0xa3, 0x37, 0x00, 0x00, 0x00, 0x37, 0x37, 0x00,
@@ -1051,9 +1053,9 @@ static const byte ROOMDATA_55[] = {
 	0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x31, 0x36, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
 	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x31, 0x37, 0x2e, 0x56, 0x49,
 	0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x31,
-	0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x16, 0x00, 0x01, 0x00, 0x63, 0x00, 0x55, 0x00,
-	0x01, 0x00, 0x63, 0x00, 0x63, 0x00, 0x01, 0x00, 0x63, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x63, 0x00,
-	0x7a, 0x00, 0x01, 0x00, 0xff, 0xff,
+	0x38, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x16, 0x00, 0x01, 0x00, 0x63, 0x00, 0x55,
+	0x00, 0x01, 0x00, 0x63, 0x00, 0x63, 0x00, 0x01, 0x00, 0x63, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x63,
+	0x00, 0x7a, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_57[] = {
 	0x03, 0x01, 0x62, 0x00, 0x0c, 0x00, 0xa0, 0x46, 0x85, 0x39, 0x00, 0x00, 0x00, 0x39, 0x39, 0x00,
@@ -1071,7 +1073,7 @@ static const byte ROOMDATA_59[] = {
 	0x03, 0x02, 0x62, 0x00, 0x21, 0x00, 0x70, 0x4b, 0x83, 0x3b, 0x00, 0x00, 0x00, 0x3b, 0x3b, 0x00,
 	0x02, 0x00, 0xff, 0x3b, 0x00, 0x01, 0x00, 0x3b, 0x00, 0x03, 0x00, 0x8f, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x31, 0x39, 0x2e, 0x56, 0x49, 0x44,
-	0x00, 0x63, 0x00, 0x4b, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x00, 0x00, 0x63, 0x00, 0x4b, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_60[] = {
 	0x03, 0x02, 0x62, 0x00, 0x17, 0x00, 0x96, 0x30, 0x90, 0x3c, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00,
@@ -1091,7 +1093,7 @@ static const byte ROOMDATA_63[] = {
 	0x03, 0x02, 0x62, 0x00, 0x13, 0x00, 0xb4, 0x8e, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x00,
 	0x02, 0x00, 0xff, 0x3f, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x03, 0x00, 0xe6, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x32, 0x30, 0x2e, 0x56, 0x49, 0x44,
-	0x00, 0x63, 0x00, 0x2d, 0x00, 0x01, 0x00, 0xff, 0xff,
+	0x00, 0x00, 0x63, 0x00, 0x2d, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_64[] = {
 	0x03, 0x03, 0x62, 0x00, 0x0c, 0x00, 0x3c, 0x17, 0xb6, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00,
@@ -1131,15 +1133,15 @@ static const byte ROOMDATA_65[] = {
 	0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x31, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41,
 	0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x32, 0x30, 0x30, 0x2e,
 	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31,
-	0x33, 0x38, 0x52, 0x45, 0x46, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x63, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x63, 0x00, 0x30, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x33, 0x38, 0x52, 0x45, 0x46, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x63, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x63, 0x00, 0x30, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_67[] = {
 	0x01, 0x02, 0x62, 0x00, 0x14, 0x00, 0x7e, 0x40, 0x6c, 0x43, 0x00, 0x00, 0x00, 0x43, 0x43, 0x00,
 	0x03, 0x00, 0xff, 0x43, 0x00, 0x01, 0x00, 0x43, 0x00, 0x02, 0x00, 0xa1, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x52, 0x4c, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44,
-	0x00, 0x63, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x49, 0x00, 0x01, 0x00, 0x63, 0x00, 0x6f,
-	0x00, 0x01, 0x00, 0xff, 0xff,
+	0x00, 0x00, 0x63, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x49, 0x00, 0x01, 0x00, 0x63, 0x00,
+	0x6f, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_68[] = {
 	0x01, 0x02, 0x62, 0x00, 0x0b, 0x00, 0x5b, 0x40, 0x8d, 0x44, 0x00, 0x00, 0x00, 0x44, 0x44, 0x00,
@@ -1167,7 +1169,7 @@ static const byte ROOMDATA_72[] = {
 	0x81, 0x02, 0x62, 0x00, 0x0c, 0x00, 0xc8, 0xc6, 0x27, 0x48, 0x00, 0x00, 0x00, 0x48, 0x48, 0x00,
 	0x03, 0x00, 0xff, 0x48, 0x00, 0x01, 0x00, 0x48, 0x00, 0x02, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x46, 0x49, 0x52, 0x45, 0x2e, 0x56, 0x49, 0x44, 0x00,
-	0xff, 0xff,
+	0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_73[] = {
 	0x01, 0x03, 0x62, 0x00, 0x09, 0x00, 0x20, 0x0c, 0x60, 0x49, 0x00, 0x00, 0x00, 0x49, 0x49, 0x00,
@@ -1189,7 +1191,7 @@ static const byte ROOMDATA_81[] = {
 	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33,
 	0x32, 0x32, 0x33, 0x39, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56,
 	0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33, 0x32, 0x32, 0x33, 0x39, 0x36, 0x2e, 0x56, 0x49, 0x44,
-	0x00, 0x63, 0x00, 0x19, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_82[] = {
 	0x81, 0x02, 0x62, 0x00, 0x00, 0x00, 0x48, 0x2c, 0x7b, 0x52, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00,
@@ -1201,8 +1203,8 @@ static const byte ROOMDATA_85[] = {
 	0x02, 0x00, 0xff, 0x55, 0x00, 0x01, 0x00, 0x55, 0x00, 0x03, 0x00, 0x85, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44,
 	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x32, 0x34,
-	0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x63, 0x00, 0x59, 0x00, 0x01,
-	0x00, 0xff, 0xff,
+	0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x63, 0x00, 0x59, 0x00,
+	0x01, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_86[] = {
 	0x01, 0x02, 0x62, 0x00, 0x18, 0x00, 0x78, 0x46, 0x69, 0x56, 0x00, 0x00, 0x00, 0x56, 0x56, 0x00,
@@ -1252,7 +1254,7 @@ static const byte ROOMDATA_89[] = {
 	0x03, 0x02, 0x62, 0x00, 0x1d, 0x00, 0x32, 0x28, 0xef, 0x59, 0x00, 0x00, 0x00, 0x59, 0x59, 0x00,
 	0x02, 0x00, 0xff, 0x59, 0x00, 0x01, 0x00, 0x59, 0x00, 0x03, 0x00, 0x40, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x32, 0x38, 0x2e, 0x56, 0x49, 0x44,
-	0x00, 0x63, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x00, 0x00, 0x63, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_90[] = {
 	0x03, 0x02, 0x62, 0x00, 0x1e, 0x00, 0x96, 0x64, 0xff, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x5a, 0x00,
@@ -1319,25 +1321,25 @@ static const byte ROOMDATA_91[] = {
 	0x2f, 0x43, 0x34, 0x34, 0x33, 0x31, 0x32, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x34, 0x34, 0x33, 0x35, 0x30, 0x30, 0x2e, 0x56,
 	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x46, 0x4c, 0x49,
-	0x50, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x38, 0x00, 0x00, 0x00, 0x63, 0x00, 0x45,
-	0x00, 0x00, 0x00, 0x63, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x63,
-	0x00, 0x6c, 0x00, 0x00, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f,
-	0x45, 0x4c, 0x34, 0x34, 0x30, 0x30, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44,
-	0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x45, 0x4c, 0x34, 0x34, 0x30, 0x31, 0x2e, 0x57,
-	0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f,
-	0x45, 0x4c, 0x34, 0x34, 0x30, 0x33, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44,
-	0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x45, 0x4c, 0x34, 0x34, 0x30, 0x35, 0x2e, 0x57,
-	0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f,
-	0x45, 0x4c, 0x34, 0x34, 0x30, 0x36, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44,
-	0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x45, 0x4c, 0x34, 0x34, 0x30, 0x37, 0x2e, 0x57,
-	0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f,
-	0x45, 0x4c, 0x34, 0x34, 0x36, 0x30, 0x39, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0x63, 0x00,
-	0x82, 0x00, 0x00, 0x00, 0x63, 0x00, 0x83, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x50, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x38, 0x00, 0x00, 0x00, 0x63, 0x00,
+	0x45, 0x00, 0x00, 0x00, 0x63, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0e, 0x00, 0x00, 0x00,
+	0x63, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44,
+	0x2f, 0x45, 0x4c, 0x34, 0x34, 0x30, 0x30, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x45, 0x4c, 0x34, 0x34, 0x30, 0x31, 0x2e,
+	0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44,
+	0x2f, 0x45, 0x4c, 0x34, 0x34, 0x30, 0x33, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x45, 0x4c, 0x34, 0x34, 0x30, 0x35, 0x2e,
+	0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44,
+	0x2f, 0x45, 0x4c, 0x34, 0x34, 0x30, 0x36, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00,
+	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x45, 0x4c, 0x34, 0x34, 0x30, 0x37, 0x2e,
+	0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44,
+	0x2f, 0x45, 0x4c, 0x34, 0x34, 0x36, 0x30, 0x39, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0x63,
+	0x00, 0x82, 0x00, 0x00, 0x00, 0x63, 0x00, 0x83, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_92[] = {
 	0x00, 0x02, 0x62, 0x00, 0x0f, 0x00, 0xb9, 0xa7, 0x69, 0x5c, 0x00, 0x00, 0x00, 0xff, 0x5c, 0x00,
 	0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xec, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
-	0x31, 0x2f, 0x53, 0x49, 0x4c, 0x4c, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+	0x31, 0x2f, 0x53, 0x49, 0x4c, 0x4c, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_93[] = {
 	0x81, 0x02, 0x62, 0x00, 0x01, 0x00, 0xb9, 0xa7, 0x69, 0x5d, 0x00, 0x00, 0x00, 0x5d, 0x5d, 0x00,
@@ -1359,8 +1361,8 @@ static const byte ROOMDATA_96[] = {
 	0x03, 0x02, 0x62, 0x00, 0x26, 0x00, 0x96, 0x64, 0xff, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00,
 	0x03, 0x00, 0x61, 0x60, 0x00, 0x04, 0x00, 0xff, 0x60, 0x00, 0x01, 0x00, 0x60, 0x00, 0x02, 0x00,
 	0xbf, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x32,
-	0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x63, 0x00, 0x46, 0x00, 0x00, 0x00, 0x63, 0x00, 0x47, 0x00,
-	0x00, 0x00, 0xff, 0xff,
+	0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x46, 0x00, 0x00, 0x00, 0x63, 0x00, 0x47,
+	0x00, 0x00, 0x00, 0xff, 0xff,
 };
 static const byte ROOMDATA_97[] = {
 	0x81, 0x01, 0x62, 0x00, 0x26, 0x00, 0x32, 0x2e, 0x2b, 0x61, 0x00, 0x00, 0x00, 0x61, 0x61, 0x00,
@@ -1415,9 +1417,10 @@ static const byte ROOMDATA_97[] = {
 	0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x33, 0x30, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44,
 	0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x34, 0x30, 0x36, 0x43,
 	0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42,
-	0x41, 0x52, 0x53, 0x2e, 0x56, 0x49, 0x44, 0x00, 0xff, 0xff,
+	0x41, 0x52, 0x53, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
 
+
 ///////////////////////////////////////////////////////////////
 
 


Commit: 79d76ccb8ae2686175327ca08c9f9a2ae0691556
    https://github.com/scummvm/scummvm/commit/79d76ccb8ae2686175327ca08c9f9a2ae0691556
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Revert file ident change

Changed paths:
    engines/access/char.cpp
    engines/access/files.cpp
    engines/access/files.h
    engines/access/room.cpp


diff --git a/engines/access/char.cpp b/engines/access/char.cpp
index 8438c60dce2..c5d4498dc4d 100644
--- a/engines/access/char.cpp
+++ b/engines/access/char.cpp
@@ -28,18 +28,17 @@ namespace Access {
 
 CharEntry::CharEntry(const byte *data, AccessEngine *vm) {
 	Common::MemoryReadStream s(data, 999);
-	AccessGameType gameType = vm->getGameID();
 
 	_charFlag = s.readByte();
 	if (vm->getGameID() != kGameAmazon || !vm->isCD()) {
-		_screenFile.load(s, gameType);
+		_screenFile.load(s);
 		_estabIndex = s.readSint16LE();
 	} else {
 		_estabIndex = s.readSint16LE();
-		_screenFile.load(s, gameType);
+		_screenFile.load(s);
 	}
 
-	_paletteFile.load(s, gameType);
+	_paletteFile.load(s);
 	_startColor = s.readUint16LE();
 	if (vm->getGameID() == kGameMartianMemorandum) {
 		int lastColor = s.readUint16LE();
@@ -51,19 +50,19 @@ CharEntry::CharEntry(const byte *data, AccessEngine *vm) {
 	for (byte cell = s.readByte(); cell != 0xff; cell = s.readByte()) {
 		CellIdent ci;
 		ci._cell = cell;
-		ci.load(s, gameType);
+		ci.load(s);
 
 		_cells.push_back(ci);
 	}
 
-	_animFile.load(s, gameType);
-	_scriptFile.load(s, gameType);
+	_animFile.load(s);
+	_scriptFile.load(s);
 
 	for (int16 v = s.readSint16LE(); v != -1; v = s.readSint16LE()) {
 		ExtraCell ec;
 		ec._vid._fileNum = v;
 		ec._vid._subfile = s.readSint16LE();
-		ec._vidSound.load(s, gameType);
+		ec._vidSound.load(s);
 
 		_extraCells.push_back(ec);
 	}
diff --git a/engines/access/files.cpp b/engines/access/files.cpp
index a93194c6bff..1489864ccda 100644
--- a/engines/access/files.cpp
+++ b/engines/access/files.cpp
@@ -32,14 +32,9 @@ FileIdent::FileIdent() {
 	_subfile = 0;
 }
 
-void FileIdent::load(Common::SeekableReadStream &s, AccessGameType gameType) {
-	if (gameType == kGameNoctropolis) {
-		_fileNum = s.readSint16LE();
-		_subfile = s.readUint16LE();
-	} else {
-		_fileNum = s.readSint32LE();
-		_subfile = s.readUint32LE();
-	}
+void FileIdent::load(Common::SeekableReadStream &s) {
+	_fileNum = s.readSint16LE();
+	_subfile = s.readUint16LE();
 }
 
 /*------------------------------------------------------------------------*/
diff --git a/engines/access/files.h b/engines/access/files.h
index 181526359fc..b565bd6ca29 100644
--- a/engines/access/files.h
+++ b/engines/access/files.h
@@ -40,7 +40,7 @@ struct FileIdent {
 	FileIdent();
 	FileIdent(int fileNum, int subfile) { _fileNum = fileNum; _subfile = subfile; }
 
-	void load(Common::SeekableReadStream &s, AccessGameType gameType);
+	void load(Common::SeekableReadStream &s);
 };
 
 struct CellIdent : FileIdent {
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 623fd63cde0..e5938f5bff0 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -1021,27 +1021,27 @@ RoomInfo::RoomInfo(const byte *data, AccessGameType gameType, bool isCD, bool is
 	else if (gameType == kGameNoctropolis)
 		_palIntensity = stream.readByte();
 
-	_musicFile.load(stream, gameType);
+	_musicFile.load(stream);
 	_scaleH1 = stream.readByte();
 	_scaleH2 = stream.readByte();
 	_scaleN1 = stream.readByte();
-	_playFieldFile.load(stream, gameType);
+	_playFieldFile.load(stream);
 
 	for (byte cell = stream.readByte(); cell != 0xff; cell = stream.readByte()) {
 		CellIdent ci;
 		ci._cell = cell;
-		ci.load(stream, gameType);
+		ci.load(stream);
 
 		_cells.push_back(ci);
 	}
 
-	_scriptFile.load(stream, gameType);
-	_animFile.load(stream, gameType);
+	_scriptFile.load(stream);
+	_animFile.load(stream);
 	_scaleI = stream.readByte();
 	_scrollThreshold = stream.readByte();
 
 	if (gameType != kGameNoctropolis) {
-		_paletteFile.load(stream, gameType);
+		_paletteFile.load(stream);
 	}
 
 	if (_paletteFile._fileNum == -1) {


Commit: e150f2ce8c108c78a994666bf332e1370e238402
    https://github.com/scummvm/scummvm/commit/e150f2ce8c108c78a994666bf332e1370e238402
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Start to implement more Noctropolis commands

Changed paths:
    engines/access/access.h
    engines/access/bubble_box.cpp
    engines/access/bubble_box.h
    engines/access/events.h
    engines/access/font.h
    engines/access/room.cpp
    engines/access/scripts.cpp


diff --git a/engines/access/access.h b/engines/access/access.h
index ec74f5090f4..7784cfd5634 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -287,6 +287,8 @@ public:
 	bool _cheatFl;
 	bool _restartFl;
 	bool _stilOff; // Used in Noctropolis walk
+	byte _stilDir;
+	uint16 _stilScale;
 
 	// Fields mapped into the flags array
 	int &_useItem;
diff --git a/engines/access/bubble_box.cpp b/engines/access/bubble_box.cpp
index e0ae51a8df5..c7b05dbf18b 100644
--- a/engines/access/bubble_box.cpp
+++ b/engines/access/bubble_box.cpp
@@ -70,8 +70,14 @@ void BubbleBox::clearBubbles() {
 }
 
 void BubbleBox::placeBubble(const Common::String &msg) {
-	_vm->_screen->_maxChars = (_vm->getGameID() == kGameMartianMemorandum) ? 30 : 27;
-	placeBubble1(msg);
+	/*if (_vm->getGameID() == kGameNoctropolis) {
+		calcBubble_v3(msg);
+		_vm->_screen->saveBlock(_bubbles[0]);
+		printBubble(msg);
+	} else {*/
+		_vm->_screen->_maxChars = (_vm->getGameID() == kGameMartianMemorandum) ? 30 : 27;
+		placeBubble1(msg);
+	//}
 }
 
 void BubbleBox::placeBubble1(const Common::String &msg) {
@@ -94,6 +100,7 @@ void BubbleBox::calcBubble(const Common::String &msg) {
 	Screen &screen = *_vm->_screen;
 	Common::Point printOrg = screen._printOrg;
 	Common::Point printStart = screen._printStart;
+	AccessGameType gameType = _vm->getGameID();
 
 	// Figure out maximum width allowed
 	if (_type == kBoxTypeFileDialog) {
@@ -111,11 +118,15 @@ void BubbleBox::calcBubble(const Common::String &msg) {
 	int width = 0;
 	bool lastLine;
 	do {
-		if (_vm->getGameID() == kGameMartianMemorandum) {
+		if (gameType == kGameMartianMemorandum) {
 			lastLine = _vm->_fonts._font1->getLine(s, screen._maxChars, line, width, Font::kWidthInChars);
 			width = _vm->_fonts._font1->stringWidth(line);
-		} else {
+		} else if (gameType == kGameAmazon){
 			lastLine = _vm->_fonts._font2->getLine(s, screen._maxChars * 6, line, width);
+		} else {
+			assert(gameType == kGameNoctropolis);
+			lastLine = _vm->_fonts.getFont(4)->getLine(s, screen._maxChars, line, width, Font::kWidthInChars);
+			width = _vm->_fonts.getFont(4)->stringWidth(line);
 		}
 
 		_vm->_fonts._printMaxX = MAX(width, _vm->_fonts._printMaxX);
@@ -124,10 +135,10 @@ void BubbleBox::calcBubble(const Common::String &msg) {
 		screen._printOrg.x = screen._printStart.x;
 	} while (!lastLine);
 
-	if (_vm->getGameID() == kGameMartianMemorandum) {
+	if (gameType == kGameMartianMemorandum) {
 		bounds.setWidth((_vm->_fonts._printMaxX / 16 + 2) * 16 + 2 + 1);
 		bounds.bottom = screen._printOrg.y + 4 + 1;
-	} else {
+	} else if (gameType == kGameAmazon) {
 		// TODO: Check this maths if we implement original file boxes.
 		if (_type == kBoxTypeFileDialog)
 			screen._printOrg.y += 6;
@@ -148,6 +159,24 @@ void BubbleBox::calcBubble(const Common::String &msg) {
 		height -= (_type == kBoxTypeFileDialog) ? 30 : 24;
 		if (height >= 0)
 			bounds.setHeight(bounds.height() + 13 - (height % 13));
+	} else {
+		assert(gameType == kGameNoctropolis);/*
+		if (!_bubbleTitle.empty())
+			textHeight += _vm->_fonts.getFont(4)->stringHeight(_bubbleTitle) - 4;
+
+		if (_type & kTextBoxCenter) {
+			// Center the box
+			boxX -= (textWidth + 27) / 2;
+			boxY -= (textHeight + 23) / 2;
+		}
+
+		boxWidth = (textWidth + 13) / 16;
+		boxHeight = (textHeight + 13) / 16;
+
+		if (!(flags & kTextBoxPlain)) {
+			boxWidth = MAX<int16>(boxWidth, 3);
+			boxHeight = MAX<int16>(boxHeight, 3);
+		}*/
 	}
 
 	if (bounds.bottom > screen.h)
diff --git a/engines/access/bubble_box.h b/engines/access/bubble_box.h
index f796ec7c4ed..e2406b1e26a 100644
--- a/engines/access/bubble_box.h
+++ b/engines/access/bubble_box.h
@@ -89,6 +89,11 @@ public:
 	 */
 	void calcBubble(const Common::String &msg);
 
+	/**
+	 * Noctropolis version of bubble calculation
+	 */
+	//void calcBubble_v3(const Common::String &msg);
+
 	/**
 	 * Prints a text bubble and it's contents
 	 */
diff --git a/engines/access/events.h b/engines/access/events.h
index 7257bb0070e..6a74ef754fa 100644
--- a/engines/access/events.h
+++ b/engines/access/events.h
@@ -31,8 +31,17 @@ namespace Access {
 enum CursorType {
 	// These names are for Amazon - Noctropolis uses a different order.
 	CURSOR_NONE = -1,
-	CURSOR_ARROW = 0, CURSOR_CROSSHAIRS, CURSOR_2, CURSOR_3, CURSOR_LOOK,
-	CURSOR_USE, CURSOR_TAKE, CURSOR_CLIMB, CURSOR_TALK, CURSOR_HELP,
+	CURSOR_ARROW = 0,
+	CURSOR_CROSSHAIRS = 1,
+	CURSOR_2 = 2,
+	CURSOR_3 = 3,
+	CURSOR_LOOK = 4,
+	CURSOR_USE = 5,
+	CURSOR_TAKE = 6,
+	CURSOR_CLIMB = 7,
+	CURSOR_TALK = 8,
+	CURSOR_HELP = 9,
+	CURSOR_DARK_ANKH = 10,
 	CURSOR_INVENTORY = 99
 };
 
@@ -68,6 +77,7 @@ public:
 	int _mouseCol, _mouseRow;
 	bool _cursorExitFlag;
 	int _vbCount;
+	bool _interfaceOff;
 public:
 	/**
 	 * Constructor
diff --git a/engines/access/font.h b/engines/access/font.h
index 31fd162957e..5dded08e260 100644
--- a/engines/access/font.h
+++ b/engines/access/font.h
@@ -62,7 +62,8 @@ public:
 	int charWidth(char c) const;
 
 	/**
-	 * Get the width of a given string
+	 * Get the width of a given string.
+	 * The string should already be broken into lines.
 	 */
 	int stringWidth(const Common::String &msg) const;
 
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index e5938f5bff0..fe40d2004a7 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -747,7 +747,7 @@ void Room::executeCommand(int commandId) {
 			events.setCursor(CURSOR_CROSSHAIRS);
 			break;
 		}
-	} else {
+	} else if (_vm->getGameID() == kGameAmazon) {
 		switch (commandId) {
 		case 0:
 		case 1:
@@ -781,6 +781,9 @@ void Room::executeCommand(int commandId) {
 		default:
 			break;
 		}
+	} else {
+		assert(_vm->getGameID() == kGameNoctropolis);
+		warning("TODO: implement executeCommand for Noctropolis");
 	}
 	screen.saveScreen();
 	screen.setDisplayScan();
@@ -791,7 +794,7 @@ void Room::executeCommand(int commandId) {
 	if (_vm->getGameID() == kGameMartianMemorandum) {
 		screen.plotImage(icons, 0, Common::Point(5, 184));
 		screen.plotImage(icons, 1, Common::Point(155, 184));
-	} else {
+	} else if (_vm->getGameID() == kGameNoctropolis) {
 		screen.plotImage(icons, 0, Common::Point(0, 177));
 		screen.plotImage(icons, 1, Common::Point(143, 177));
 	}
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 15fcd858e20..21f496f8373 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -1353,7 +1353,19 @@ void Scripts::cmdUndoText() {
 }
 
 void Scripts::cmdResetAnim() {
-    error("TODO: Implement Scripts::cmdResetAnim");
+	byte animNum = _data->readByte();
+	debugCN(1, kDebugScripts, "cmdResetAnim(%d)", animNum);
+	Animation *anim = _vm->_animation->findAnimation(animNum);
+	if (!anim)
+		error("cmdResetAnim: Invalid anim num %d", animNum);
+
+	anim->_countdownTicks = anim->_initialTicks;
+	anim->_frameNumber = 0;
+	if (anim->_type == 3 || anim->_type == 4) {
+		anim->_currentLoopCount = anim->_loopCount;
+	} else {
+		anim->_currentLoopCount = 0;
+	}
 }
 
 void Scripts::cmdWalkTo() {
@@ -1380,11 +1392,18 @@ void Scripts::cmdFadeWhite() {
 }
 
 void Scripts::cmdGotoFrame() {
-    error("TODO: Implement Scripts::cmdGotoFrame");
+	uint16 animNum = _data->readUint16LE();
+	uint16 frameNum = _data->readUint16LE();
+	debugCN(1, kDebugScripts, "cmdGotoFrame(%d, %d)", animNum, frameNum);
+	Animation *anim = _vm->_animation->findAnimation(animNum);
+	if (!anim)
+		error("cmdGotoFrame: Invalid anim num %d", animNum);
+	anim->_frameNumber = frameNum;
 }
 
 void Scripts::cmdPlayerScale() {
-    error("TODO: Implement Scripts::cmdPlayerScale");
+	_vm->_scale = _data->readUint16LE();
+    debugCN(1, kDebugScripts, "cmdPlayerScale(%d)", _vm->_scale);
 }
 
 void Scripts::cmdRestoreBlock() {
@@ -1414,6 +1433,10 @@ void Scripts::cmdStilOn() {
 }
 
 void Scripts::cmdReturnExit() {
+	debugCN(1, kDebugScripts, "cmdReturnExit()");
+	//_vm->_exitBox = true; -- work out what to do with this.
+	_endFlag = true;
+	_returnCode = 0;
     error("TODO: Implement Scripts::cmdReturnExit");
 }
 
@@ -1422,23 +1445,31 @@ void Scripts::cmdSetStilCoords() {
 }
 
 void Scripts::cmdSetPlayerDir() {
-    error("TODO: Implement Scripts::cmdSetPlayerDir");
+	debugCN(1, kDebugScripts, "cmdSetPlayerDir()");
+	_vm->_player->_playerDirection = (Direction)_data->readByte();
 }
 
 void Scripts::cmdSetStilDir() {
-    error("TODO: Implement Scripts::cmdSetStilDir");
+	debugCN(1, kDebugScripts, "cmdSetStilDir()");
+	_vm->_stilDir = _data->readByte();
 }
 
 void Scripts::cmdStilScale() {
-    error("TODO: Implement Scripts::cmdStilScale");
+	debugCN(1, kDebugScripts, "cmdStilScale()");
+	_vm->_stilScale = _data->readUint16LE();
 }
 
 void Scripts::cmdLockInterface() {
-    error("TODO: Implement Scripts::cmdLockInterface");
+	debugCN(1, kDebugScripts, "cmdLockInterface()");
+	_vm->_events->_interfaceOff = true;
+	_vm->_events->setCursor(CURSOR_DARK_ANKH);
 }
 
 void Scripts::cmdUnlockInterface() {
-    error("TODO: Implement Scripts::cmdUnlockInterface");
+	debugCN(1, kDebugScripts, "cmdUnlockInterface()");
+	_vm->_events->_interfaceOff = false;
+	warning("TODO: cmdUnlockInterface - restore cursor");
+	_vm->_events->setCursor(CURSOR_ARROW);
 }
 
 


Commit: 30329c91f96d726da15d4dad0cd29933a23dcc8a
    https://github.com/scummvm/scummvm/commit/30329c91f96d726da15d4dad0cd29933a23dcc8a
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add additional Noctropolis filenames

Changed paths:
    engines/access/noctropolis/noctropolis_resources.cpp


diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 1b1615e0215..cba571bc83c 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -28,7 +28,9 @@ namespace Access {
 
 namespace Noctropolis {
 
-static const char *NOCT_FILES[] = {
+// The original game has 4 files after a bunch of nullptrs.
+// We add them separately to make this file a little smaller.
+static const char *NOCT_FILES_1[] = {
 	"DARK/MAP.AP", "DARK/SCENE01.AP", "DARK/SCENE02.AP", "DARK/SCENE03.AP",
 	"DARK/SCENE04.AP", "R05.AP", "R06.AP", "R07.AP",
 	"R08.AP", "R09.AP", "R10.AP", "DARK/SCENE11.AP",
@@ -54,7 +56,11 @@ static const char *NOCT_FILES[] = {
 	"R88.AP", "DARK/SCENE89.AP", "DARK/SCENE90.AP", "DARK/SCENE91.AP",
 	"DARK/SCENE92.AP", "DARK/SCENE93.AP", "DARK/SCENE94.AP", "DARK/SCENE95.AP",
 	"DARK/SCENE96.AP", "DARK/SCENE97.AP", "DARK/MUSIC.AP", "DARK/SOUND.AP",
-	nullptr,
+};
+
+static const char *NOCT_FILES_2[] = {
+	"DARK/TOP.AP", "DARK/STILETTO.AP",
+	"DARK/PLAYER.AP", "DARK/DARKSHR.AP",
 };
 
 static const byte ROOMDATA_02[] = {
@@ -1670,8 +1676,16 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	// Note: *don't* call the base class here. Noctropolis doesn't have data in access.dat.
 
 	// TODO: For non-EN variants we want to use something other than DARK/ as the path.
-	for (int i = 0; i < ARRAYSIZE(NOCT_FILES); i++) {
-		Common::Path filename = Common::Path(NOCT_FILES[i]).getLastComponent();
+	for (int i = 0; i < ARRAYSIZE(NOCT_FILES_1); i++) {
+		Common::Path filename = Common::Path(NOCT_FILES_1[i]).getLastComponent();
+		FILENAMES.push_back(filename);
+	}
+	// TODO: These last few files are maybe only ever be used from hard-coded points,
+	// so maybe we can just hard-code the names and avoid this ugliness?
+	while (FILENAMES.size() < 255 - ARRAYSIZE(NOCT_FILES_2))
+		FILENAMES.push_back(Common::Path());
+	for (int i = 0; i < ARRAYSIZE(NOCT_FILES_2); i++) {
+		Common::Path filename = Common::Path(NOCT_FILES_2[i]).getLastComponent();
 		FILENAMES.push_back(filename);
 	}
 


Commit: 79a2790017e732150a17e8ba8acf0e0071a5d2ef
    https://github.com/scummvm/scummvm/commit/79a2790017e732150a17e8ba8acf0e0071a5d2ef
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: WIP loading for Noctropolis player data

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/access/animation.cpp
    engines/access/events.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/player.cpp
    engines/access/player.h
    engines/access/room.cpp
    engines/access/room.h
    engines/access/scripts.cpp


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index e540d98b115..17aac21712a 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -115,7 +115,7 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_vidEnd = false;
 
 	_icons = nullptr;
-	_stilOff = false;
+	_stilScale = 0;
 
 	ARRAYCLEAR(_countTbl);
 }
diff --git a/engines/access/access.h b/engines/access/access.h
index 7784cfd5634..947649e2f09 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -286,8 +286,6 @@ public:
 	bool _clearSummaryFlag;
 	bool _cheatFl;
 	bool _restartFl;
-	bool _stilOff; // Used in Noctropolis walk
-	byte _stilDir;
 	uint16 _stilScale;
 
 	// Fields mapped into the flags array
diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index c9f0ef4e497..96bed446265 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -229,7 +229,7 @@ void Animation::anim11() {
 	setFrame(frame);
 	_countdownTicks += frame->_frameDelay;
 	setFrame1(frame, _vm->_player->_rawPlayer.x, _vm->_player->_rawPlayer.y - _vm->_player->_playerOffset.y);
- }
+}
 
 void Animation::anim12() {
 }
diff --git a/engines/access/events.cpp b/engines/access/events.cpp
index aa320162c28..43e7be76d54 100644
--- a/engines/access/events.cpp
+++ b/engines/access/events.cpp
@@ -45,6 +45,7 @@ EventsManager::EventsManager(AccessEngine *vm) : _vm(vm) {
 	_keyCode = Common::KEYCODE_INVALID;
 	_priorTimerTime = 0;
 	_action = kActionNone;
+	_interfaceOff = false;
 }
 
 EventsManager::~EventsManager() {
@@ -225,6 +226,9 @@ void EventsManager::actionControl(Common::CustomEventType action, bool isKeyDown
 		}
 		return;
 	}
+	
+	if (_interfaceOff)
+		return;
 
 	_action = action;
 
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 16cc2c51e1f..2a89e7083a3 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -32,7 +32,7 @@ namespace Noctropolis {
 
 
 NoctropolisEngine::NoctropolisEngine(OSystem *syst, const AccessGameDescription *gameDesc) :
-AccessEngine(syst, gameDesc), _invScript(nullptr)
+AccessEngine(syst, gameDesc), _invScript(nullptr), _stil(nullptr)
 {
 }
 
@@ -44,6 +44,7 @@ void NoctropolisEngine::initObjects() {
 	_room = new NoctropolisRoom(this);
 	_scripts = new NoctropolisScripts(this);
 	_invScript = new NoctropolisScripts(this);
+	_stil = new Player(this);
 }
 
 void NoctropolisEngine::setupGame() {
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index 1fe8c6f1447..a05ee7729f9 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -41,6 +41,8 @@ public:
 	virtual int16 getScreenWidth() const override { return 640; }
 	virtual int16 getScreenHeight() const override { return 400; }
 
+	Player *_stil;
+
 protected:
 	void setupGame() override;
 	void initObjects() override;
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 6b38945f589..f65ee073670 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -31,6 +31,37 @@ NoctropolisRoom::NoctropolisRoom(AccessEngine *vm): Room(vm) {
 
 void NoctropolisRoom::reloadRoom() {
 	loadRoom(_vm->_player->_roomNumber);
+	int subFileBase = 1;
+	int numSubFiles = 0;
+	int objBase = 0;
+	int fileNum = 0;
+	if (!(_roomFlag & 4)) {
+		if (_roomFlag) {
+			// Peter
+			numSubFiles = 5;
+			objBase = 0x64;
+			fileNum = 0xfe;
+		} else {
+			// Dark
+			numSubFiles = 5;
+			objBase = 0x69;
+			fileNum = 0xff;
+		}
+	} else {
+		// Top
+		numSubFiles = 1;
+		objBase = 0x73;
+		fileNum = 0xfc;
+	}
+	
+	_vm->_player->loadNoctPalette(fileNum, _palIntensity + 6);
+	_vm->_player->loadAnimation(fileNum, 0);
+
+	for (int i = subFileBase; i > numSubFiles; i++) {
+		Resource *data = _vm->_files->loadFile(fileNum, i);
+		_vm->_objectsTable[objBase + i] = new SpriteResource(_vm, data);
+	}
+	
 	reloadRoom1();
 }
 
@@ -47,9 +78,6 @@ void NoctropolisRoom::reloadRoom1() {
 	roomInit();
 	_vm->_player->load();
 
-	if (_vm->_player->_roomNumber != 47)
-		_vm->_player->calcManScale();
-
 	_vm->_events->hideCursor();
 	roomMenu();
 	_vm->_screen->setBufferScan();
@@ -121,9 +149,6 @@ void NoctropolisRoom::buildColumnXScroll(int playX, int screenX) {
 	}
 }
 
-
-// TODO: Add more functions here.
-
 } // end namespace Noctropolis
 
 } // end namespace Access
diff --git a/engines/access/player.cpp b/engines/access/player.cpp
index bdae2602c73..2b9fe931f7e 100644
--- a/engines/access/player.cpp
+++ b/engines/access/player.cpp
@@ -46,6 +46,7 @@ Player *Player::init(AccessEngine *vm) {
 Player::Player(AccessEngine *vm) : Manager(vm), ImageEntry() {
 	_playerSprites = nullptr;
 	_playerSprites1 = nullptr;
+	_playerAnimation = nullptr;
 	_manPal1 = nullptr;
 	_frameNumber = 0;
 	_rawTempL = 0;
@@ -139,17 +140,32 @@ void Player::load() {
 	}
 }
 
-void Player::loadTexPalette() {
-	Resource *texPal = _vm->_files->loadRawFile("TEXPAL.COL");
-	int size = texPal->_size;
+void Player::loadPalResource(Resource *pal) {
+	int size = pal->_size;
 	assert(size == 768);
 	_manPal1 = new byte[size];
-	memcpy(_manPal1, texPal->data(), size);
+	memcpy(_manPal1, pal->data(), size);
 }
 
-void Player::loadSprites(const Common::Path &name) {
-	freeSprites();
+void Player::loadTexPalette() {
+	Resource *pal = _vm->_files->loadRawFile("TEXPAL.COL");
+	loadPalResource(pal);
+	delete pal;
+}
+
+void Player::loadNoctPalette(int fileNum, int subFile) {
+	Resource *pal = _vm->_files->loadFile(fileNum, subFile);
+	loadPalResource(pal);
+	delete pal;
+}
 
+void Player::loadAnimation(int fileNum, int subFile) {
+	Resource *data = _vm->_files->loadFile(fileNum, subFile);
+	_playerAnimation = new AnimationResource(_vm, data);
+	delete data;
+}
+
+void Player::loadSprites(const Common::Path &name) {
 	Resource *data = _vm->_files->loadRawFile(name);
 
 #if 0
diff --git a/engines/access/player.h b/engines/access/player.h
index 0a228e55285..536ac1d3f68 100644
--- a/engines/access/player.h
+++ b/engines/access/player.h
@@ -27,6 +27,7 @@
 #include "common/serializer.h"
 #include "access/asurface.h"
 #include "access/data.h"
+#include "access/animation.h"
 
 namespace Access {
 
@@ -78,9 +79,11 @@ protected:
 	bool isMMHover() const;
 	void jetpack();
 
+	void loadPalResource(Resource *pal);
 public:
 	Direction _playerDirection;
 	SpriteResource *_playerSprites;
+	AnimationResource *_playerAnimation;
 	// Fields in original Player structure
 	byte *_manPal1;
 	int *_walkOffRight;
@@ -125,8 +128,10 @@ public:
 	virtual void load();
 
 	void loadTexPalette();
+	void loadNoctPalette(int fileNum, int subFile);
 
 	void loadSprites(const Common::Path &name);
+	void loadAnimation(int fileNum, int subFile);
 
 	void freeSprites();
 
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index fe40d2004a7..10a109feb8c 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -38,6 +38,7 @@ Room::Room(AccessEngine *vm) : Manager(vm) {
 	_tile = nullptr;
 	_conFlag = false;
 	_selectCommand = -1;
+	_palIntensity = 0;
 
 	for (int i = 0; i < 10; i++) {
 		_rMouse[i][0] = vm->_res->getRMouse(i, 0);
@@ -302,6 +303,7 @@ void Room::loadRoomData(const byte *roomData) {
 	RoomInfo roomInfo(roomData, _vm->getGameID(), _vm->isCD(), _vm->isDemo());
 
 	_roomFlag = roomInfo._roomFlag;
+	_palIntensity = roomInfo._palIntensity;
 
 	// TODO: If roomFlag & 2 and noctropolis, load pal files.
 	// (see LoadRoom in noctropolis.)
diff --git a/engines/access/room.h b/engines/access/room.h
index 4485160e9f6..44dcb1c8c9f 100644
--- a/engines/access/room.h
+++ b/engines/access/room.h
@@ -123,6 +123,7 @@ public:
 	Common::Array<JetFrame> _jetFrame;
 	Function _function;
 	int _roomFlag;
+	byte _palIntensity;
 	uint16 *_playField;
 	int _matrixSize;
 	int _playFieldWidth;
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 21f496f8373..0841aefb21c 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -24,6 +24,7 @@
 #include "access/resources.h"
 #include "access/scripts.h"
 #include "access/martian/martian_resources.h"
+#include "access/noctropolis/noctropolis_game.h"
 
 namespace Access {
 
@@ -896,7 +897,7 @@ void Scripts::cmdDoTravel() {
 void Scripts::cmdDoTravel_Noct() {
 	_vm->_events->setCursor(CURSOR_ARROW);
 	_vm->_player->_playerOff = true;
-	_vm->_stilOff = true;
+	((Noctropolis::NoctropolisEngine *)_vm)->_stil->_playerOff = true;
 	cmdRetPos();
 	error("TODO: Finish Noct style cmdTravel");
 }
@@ -1424,12 +1425,12 @@ void Scripts::cmdStilWalkCheck() {
 
 void Scripts::cmdStilOff() {
 	debugCN(1, kDebugScripts, "cmdStilOff()");
-	_vm->_stilOff = true;
+	((Noctropolis::NoctropolisEngine *)_vm)->_stil->_playerOff = true;
 }
 
 void Scripts::cmdStilOn() {
 	debugCN(1, kDebugScripts, "cmdStilOn()");
-	_vm->_stilOff = false;
+	((Noctropolis::NoctropolisEngine *)_vm)->_stil->_playerOff = false;
 }
 
 void Scripts::cmdReturnExit() {
@@ -1442,6 +1443,7 @@ void Scripts::cmdReturnExit() {
 
 void Scripts::cmdSetStilCoords() {
     error("TODO: Implement Scripts::cmdSetStilCoords");
+    // ((Noctropolis::NoctropolisEngine *)_vm)->_stil->
 }
 
 void Scripts::cmdSetPlayerDir() {
@@ -1451,7 +1453,7 @@ void Scripts::cmdSetPlayerDir() {
 
 void Scripts::cmdSetStilDir() {
 	debugCN(1, kDebugScripts, "cmdSetStilDir()");
-	_vm->_stilDir = _data->readByte();
+	((Noctropolis::NoctropolisEngine *)_vm)->_stil->_playerDirection = (Direction)_data->readByte();
 }
 
 void Scripts::cmdStilScale() {


Commit: 6874f1c50a9f30207e2b946d28cc06d005b9aa08
    https://github.com/scummvm/scummvm/commit/6874f1c50a9f30207e2b946d28cc06d005b9aa08
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Implement a few more Noctropolis opcodes

Changed paths:
    engines/access/scripts.cpp


diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 0841aefb21c..5a84930ba9c 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -1370,11 +1370,26 @@ void Scripts::cmdResetAnim() {
 }
 
 void Scripts::cmdWalkTo() {
-    error("TODO: Implement Scripts::cmdWalkTo");
+	int16 x = _data->readSint16LE();
+	int16 y = _data->readSint16LE();
+	int16 dir = _data->readSint16LE();
+	debugCN(1, kDebugScripts, "cmdWalkTo(%d, %d, %d)", x, y, dir);
+
+	_vm->_player->_moveTo.x = x;
+	_vm->_player->_moveTo.y = y;
+	_vm->_player->_move = (Direction)dir;
+	_vm->_player->_playerMove = true;
 }
 
 void Scripts::cmdWalkCheck() {
-    error("TODO: Implement Scripts::cmdWalkCheck");
+	debugCN(1, kDebugScripts, "cmdWalkCheck()");
+	if (!_vm->_player->_playerMove) {
+		debugC(1, kDebugScripts, " -> True");
+		cmdGoto();
+	} else {
+		debugC(1, kDebugScripts, " -> False");
+		_data->skip(2);
+	}
 }
 
 void Scripts::cmdSoundEnd() {
@@ -1416,11 +1431,26 @@ void Scripts::cmdCopyScnBuf() {
 }
 
 void Scripts::cmdStilWalkTo() {
-    error("TODO: Implement Scripts::cmdStilWalkTo");
+	int16 x = _data->readSint16LE();
+	int16 y = _data->readSint16LE();
+	int16 dir = _data->readSint16LE();
+	debugCN(1, kDebugScripts, "cmdStilWalkTo(%d, %d, %d)", x, y, dir);
+
+	((Noctropolis::NoctropolisEngine*)_vm)->_stil->_moveTo.x = x;
+	((Noctropolis::NoctropolisEngine*)_vm)->_stil->_moveTo.y = y;
+	((Noctropolis::NoctropolisEngine*)_vm)->_stil->_move = (Direction)dir;
+	((Noctropolis::NoctropolisEngine*)_vm)->_stil->_playerMove = true;
 }
 
 void Scripts::cmdStilWalkCheck() {
-    error("TODO: Implement Scripts::cmdStilWalkCheck");
+	debugCN(1, kDebugScripts, "cmdStilWalkCheck()");
+	if (!((Noctropolis::NoctropolisEngine*)_vm)->_stil->_playerMove) {
+		debugC(1, kDebugScripts, " -> True");
+		cmdGoto();
+	} else {
+		debugC(1, kDebugScripts, " -> False");
+		_data->skip(2);
+	}
 }
 
 void Scripts::cmdStilOff() {


Commit: 5a9d1c0d23f06cf644207cf3cfa9a9e5e6a5381c
    https://github.com/scummvm/scummvm/commit/5a9d1c0d23f06cf644207cf3cfa9a9e5e6a5381c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: More wip for loading noctropolis player data

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/access/animation.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/player.cpp


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 17aac21712a..988b6fde491 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -80,8 +80,8 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_conversation = 0;
 	_newTime = 0;
 	_newDate = 0;
-	Common::fill(&_objectsTable[0], &_objectsTable[100], (SpriteResource *)nullptr);
-	Common::fill(&_establishTable[0], &_establishTable[100], false);
+	Common::fill(&_objectsTable[0], &_objectsTable[128], (SpriteResource *)nullptr);
+	Common::fill(&_establishTable[0], &_establishTable[128], false);
 	Common::fill(&_flags[0], &_flags[256], 0);
 	_establishFlag = false;
 	_establishMode = 0;
diff --git a/engines/access/access.h b/engines/access/access.h
index 947649e2f09..d317e389317 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -222,7 +222,7 @@ public:
 	ASurface _buffer2;
 	ASurface _vidBuf;
 	int _vidX, _vidY;
-	SpriteResource *_objectsTable[100];
+	SpriteResource *_objectsTable[128];
 	bool _establishTable[100];
 	bool _establishFlag;
 	int _establishMode;
diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index 96bed446265..188b2e89032 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -226,12 +226,12 @@ void Animation::anim10() {
 void Animation::anim11() {
      // Actor idle
 	const AnimationFrame *frame = calcFrame();
-	setFrame(frame);
 	_countdownTicks += frame->_frameDelay;
 	setFrame1(frame, _vm->_player->_rawPlayer.x, _vm->_player->_rawPlayer.y - _vm->_player->_playerOffset.y);
 }
 
 void Animation::anim12() {
+	debug("TODO: Animation::anim12");
 }
 
 
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 2a89e7083a3..94210ac4835 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -73,14 +73,14 @@ void NoctropolisEngine::initVariables() {
 	_converseMode = 0;
 	_inventory->_startInvItem = 0;
 	_inventory->_startInvBox = 0;
-	Common::fill(&_objectsTable[0], &_objectsTable[100], (SpriteResource *)nullptr);
+	Common::fill(&_objectsTable[0], &_objectsTable[128], (SpriteResource *)nullptr);
 	_player->_playerOff = false;
 	/*
 	_player->_playerX = _player->_rawPlayer.x = _res->ROOMTBL[_player->_roomNumber]._travelPos.x;
 	_player->_playerY = _player->_rawPlayer.y = _res->ROOMTBL[_player->_roomNumber]._travelPos.y;
 	*/
 	_room->_selectCommand = -1;
-	_events->setNormalCursor(CURSOR_ARROW);
+	_events->setNormalCursor(CURSOR_CROSSHAIRS);
 	_mouseMode = 0;
 	_animation->clearTimers();
 }
@@ -220,7 +220,6 @@ void NoctropolisEngine::doIntro() {
 	_screen->clearScreen();
 	_screen->forceFadeOut();
 
-	// TODO: midi files have been split into MUSIC/Mxx.MID files
 	_midi->loadMusic(98, 1);
 	_room->loadPlayField(1, 0);
 	_buffer2.copyFrom(*_screen);
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index cba571bc83c..7048740344a 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -1680,8 +1680,8 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 		Common::Path filename = Common::Path(NOCT_FILES_1[i]).getLastComponent();
 		FILENAMES.push_back(filename);
 	}
-	// TODO: These last few files are maybe only ever be used from hard-coded points,
-	// so maybe we can just hard-code the names and avoid this ugliness?
+	// TODO: These last few files are maybe only ever used from hard-coded points,
+	// so maybe we can just hard-code the names in those places and avoid this hack?
 	while (FILENAMES.size() < 255 - ARRAYSIZE(NOCT_FILES_2))
 		FILENAMES.push_back(Common::Path());
 	for (int i = 0; i < ARRAYSIZE(NOCT_FILES_2); i++) {
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index f65ee073670..949010fd520 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -57,9 +57,9 @@ void NoctropolisRoom::reloadRoom() {
 	_vm->_player->loadNoctPalette(fileNum, _palIntensity + 6);
 	_vm->_player->loadAnimation(fileNum, 0);
 
-	for (int i = subFileBase; i > numSubFiles; i++) {
+	for (int i = subFileBase; i < numSubFiles; i++) {
 		Resource *data = _vm->_files->loadFile(fileNum, i);
-		_vm->_objectsTable[objBase + i] = new SpriteResource(_vm, data);
+		_vm->_objectsTable[objBase + i - subFileBase] = new SpriteResource(_vm, data);
 	}
 	
 	reloadRoom1();
diff --git a/engines/access/player.cpp b/engines/access/player.cpp
index 2b9fe931f7e..44669d45b02 100644
--- a/engines/access/player.cpp
+++ b/engines/access/player.cpp
@@ -754,7 +754,10 @@ void Player::plotCom1() {
 
 void Player::plotCom2() {
 	// WORKAROUND: Amazon has at least one cutscene with the player not properly turned off
-	if (!_playerOff && _spritesPtr != nullptr) {
+	if (_playerOff)
+		return;
+
+	if (_spritesPtr != nullptr) {
 		ImageEntry ie = *this;
 		if (!isMMHover()) {
 			_vm->_images.addToList(ie);
@@ -764,6 +767,11 @@ void Player::plotCom2() {
 			ie._frameNumber = 13;
 			_vm->_images.addToList(ie);
 		}
+	} else if (_playerAnimation != nullptr) {
+		// Noctropolis player animation
+		int animNum = ((int)_playerDirection + (_playerMove ? 0 : 8));
+		Animation *anim = _playerAnimation->getAnimation(animNum);
+		anim->animate();
 	}
 }
 


Commit: 18918720158854ef40942fdb5878e456d5c459eb
    https://github.com/scummvm/scummvm/commit/18918720158854ef40942fdb5878e456d5c459eb
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Sync volume after main menu opened

Changed paths:
    engines/access/sound.cpp


diff --git a/engines/access/sound.cpp b/engines/access/sound.cpp
index caf26b0af8b..a310a593d36 100644
--- a/engines/access/sound.cpp
+++ b/engines/access/sound.cpp
@@ -334,7 +334,7 @@ void MusicManager::midiPlay() {
 		_parser->setMidiDriver(this);
 		_parser->setTimerRate(_driver->getBaseTempo());
 		_parser->property(MidiParser::mpAutoLoop, _isLooping);
-		setVolume(127);
+		syncVolume();
 		_isPlaying = true;
 	} else if (magic == MKTAG('B', 'E', 'm', 'd')) {
 		_parser = new MidiParser_BEmd();


Commit: d3a7415853eb54a0129616f133b733520dda6c8f
    https://github.com/scummvm/scummvm/commit/d3a7415853eb54a0129616f133b733520dda6c8f
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add a few more Noctropolis script stubs

Changed paths:
    engines/access/room.cpp
    engines/access/scripts.cpp
    engines/access/scripts.h


diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 10a109feb8c..da2a8a757c5 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -276,6 +276,8 @@ void Room::doRoom() {
 
 void Room::roomInit() {
 	_vm->_animation->clearTimers();
+	_vm->_scripts->_continuenceFlag = false;
+	_vm->_scripts->_continuenceType = 0;
 	_vm->_scripts->_sequence = INIT_ROOM_SCRIPT;
 	_vm->_scripts->searchForSequence();
 	_vm->_scripts->executeScript();
@@ -377,6 +379,8 @@ void Room::loadRoomData(const byte *roomData) {
 }
 
 void Room::roomLoop() {
+	_vm->_scripts->_continuenceType = 1;
+	_vm->_scripts->_continuenceFlag = false;
 	_vm->_scripts->_sequence = ROOM_SCRIPT;
 	_vm->_scripts->searchForSequence();
 	_vm->_scripts->executeScript();
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 5a84930ba9c..ca282251c22 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -34,6 +34,8 @@ Scripts::Scripts(AccessEngine *vm) : Manager(vm) {
 	_data = nullptr;
 	_sequence = 0;
 	_endFlag = false;
+	_continuenceType = 0;
+	_continuenceFlag = false;
 	_returnCode = 0;
 	_scriptCommand = 0;
 	_choice = 0;
@@ -82,7 +84,7 @@ void Scripts::setOpcodes() {
 	COMMAND_LIST[31] = &Scripts::cmdCheckTimer;
 	COMMAND_LIST[32] = &Scripts::cmdSetTravel;
 	COMMAND_LIST[33] = &Scripts::cmdJumpGoto;
-	COMMAND_LIST[34] = &Scripts::cmdSetVideo;
+	COMMAND_LIST[34] = &Scripts::cmdSetVideo_v1;
 	COMMAND_LIST[35] = &Scripts::cmdPlayVideo;
 	COMMAND_LIST[36] = &Scripts::cmdPlotImage;
 	COMMAND_LIST[37] = &Scripts::cmdSetDisplay;
@@ -138,7 +140,11 @@ void Scripts::setOpcodes_v2() {
 }
 
 void Scripts::setOpcodes_v3() {
+	COMMAND_LIST[34] = &Scripts::cmdSetVideo_v3;
 	COMMAND_LIST[50] = &Scripts::cmdCharSpeak_v3;
+	COMMAND_LIST[51] = &Scripts::cmdPlayerSpeak;
+	COMMAND_LIST[52] = &Scripts::cmdPlayerChoice;
+	// 52 to 57 unchanged
 	COMMAND_LIST[57] = &Scripts::cmdDigitalPlay;
 	COMMAND_LIST[60] = &Scripts::cmdFillSound;
 	COMMAND_LIST[61] = &Scripts::cmdBD;
@@ -718,7 +724,7 @@ void Scripts::cmdCheckTimer() {
 	byte val = (byte)_data->readUint16LE();
 
 	if (val != 0 && val != 1)
-        warning("Invalid check value %d in cmdCheckTimer - expect only 1 or 0??", val);
+		warning("Invalid check value %d in cmdCheckTimer - expect only 1 or 0??", val);
 
 	if (_vm->_timers[idx]._flag == val) {
 		debugC(1, kDebugScripts, " -> True");
@@ -748,16 +754,47 @@ void Scripts::cmdJumpGoto() {
 	}
 }
 
-void Scripts::cmdSetVideo() {
+void Scripts::cmdSetVideo_v1() {
 	Common::Point pt;
 	pt.x = _data->readSint16LE();
 	pt.y = _data->readSint16LE();
 	int cellIndex = _data->readUint16LE();
 	int rate = _data->readUint16LE();
-	debugC(1, kDebugScripts, "cmdSetVideo(x=%d, y=%d, cellIndex=%d, rate=%d)", pt.x, pt.y, cellIndex, rate);
+	debugC(1, kDebugScripts, "cmdSetVideo_v1(x=%d, y=%d, cellIndex=%d, rate=%d)", pt.x, pt.y, cellIndex, rate);
 	_vm->_video->setVideo(_vm->_screen, pt, _vm->_extraCells[cellIndex]._vid, rate);
 }
 
+void Scripts::cmdSetVideo_v3() {
+	Common::Point pt;
+	short rawx = _data->readSint16LE();
+	pt.y = _data->readSint16LE();
+	int cellIndex = _data->readUint16LE();
+	int rate = _data->readUint16LE();
+
+	if (cellIndex > 0x3f)
+		error("Invalid room video number %d", cellIndex);
+
+	bool loop;
+	const int roomNum = _vm->_player->_roomNumber;
+
+	if ((roomNum == 0x1e && cellIndex == 0) || roomNum == 0x21 || (roomNum == 0x36 && cellIndex < 32))
+		loop = true;
+	else
+		loop = false;
+
+	if (roomNum == 0x1b || roomNum == 0x1e)
+		pt.x = rawx + -5;
+	else
+		pt.x = rawx;
+
+	debugC(1, kDebugScripts, "cmdSetVideo_v3(x=%d, y=%d, cellIndex=%d, rate=%d)", pt.x, pt.y, cellIndex, rate);
+	warning("TODO: cmdSetVideo_v3: Use loop flag");
+	_vm->_video->setVideo(_vm->_screen, pt, _vm->_extraCells[cellIndex]._vid, rate);
+
+	if (cellIndex == 1 && roomNum == 0x36)
+		_vm->_screen->setIconPalette();
+}
+
 void Scripts::cmdPlayVideo() {
 	debugC(1, kDebugScripts, "cmdPlayVideo()");
 	_vm->_video->playVideo();
@@ -1013,6 +1050,18 @@ void Scripts::cmdCharSpeak_v3() {
 	findNull();
 }
 
+void Scripts::cmdPlayerSpeak() {
+	int16 a = _data->readUint16LE();
+	int16 b = _data->readUint16LE();
+	debugC(1, kDebugScripts, "cmdPlayerSpeak(%d, %d)", a, b);
+	error("TODO: implement cmdPlayerSpeak()");
+}
+
+
+void Scripts::cmdPlayerChoice() {
+	error("TODO: cmdPlayerChoice()");
+}
+
 void Scripts::cmdTexSpeak() {
 	_vm->_screen->_printOrg = _texsOrg;
 	_vm->_screen->_printStart = _texsOrg;
@@ -1209,7 +1258,7 @@ void Scripts::cmdSetVideoSound() {
 	_data->skip(4);
 	cmdLoadSound();
 	_data->seek(startPos);
-	cmdSetVideo();
+	cmdSetVideo_v1();
 
 	_vm->_video->_soundFrame = _data->readUint16LE();
 	_vm->_video->_soundFlag = false;
@@ -1257,7 +1306,7 @@ void Scripts::cmdPushLocation_v1() {
 
 void Scripts::cmdPushLocation() {
 	// TODO: Double-check this code.  It doesn't seem to match function
-	//   sub13BC0 in Amazon?
+	// sub13BC0 in Amazon?
 	debugC(1, kDebugScripts, "cmdPushLocation()");
 	_choiceStart = _data->pos() - 1;
 }
@@ -1321,7 +1370,8 @@ void Scripts::cmdEndVideo() {
 }
 
 void Scripts::cmdDigitalPlay() {
-    error("TODO: Implement Scripts::cmdDigitalPlay");
+	error("TODO: Implement Scripts::cmdDigitalPlay");
+	_continuenceFlag = true;
 }
 
 void Scripts::cmdFillSound() {
@@ -1335,14 +1385,16 @@ void Scripts::cmdFillSound() {
 			break;
 		}
 	}
+	_continuenceFlag = true;
 }
 
 void Scripts::cmdPlayVid1() {
-    error("TODO: Implement Scripts::cmdPlayVid1");
+	error("TODO: Implement Scripts::cmdPlayVid1");
+	_continuenceFlag = true;
 }
 
 void Scripts::cmdCharWait() {
-    error("TODO: Implement Scripts::cmdCharWait");
+	error("TODO: Implement Scripts::cmdCharWait");
 }
 
 void Scripts::cmdUndoText() {
@@ -1404,7 +1456,7 @@ void Scripts::cmdSoundEnd() {
 }
 
 void Scripts::cmdFadeWhite() {
-    error("TODO: Implement Scripts::cmdFadeWhite");
+	error("TODO: Implement Scripts::cmdFadeWhite");
 }
 
 void Scripts::cmdGotoFrame() {
@@ -1419,15 +1471,15 @@ void Scripts::cmdGotoFrame() {
 
 void Scripts::cmdPlayerScale() {
 	_vm->_scale = _data->readUint16LE();
-    debugCN(1, kDebugScripts, "cmdPlayerScale(%d)", _vm->_scale);
+	debugCN(1, kDebugScripts, "cmdPlayerScale(%d)", _vm->_scale);
 }
 
 void Scripts::cmdRestoreBlock() {
-    error("TODO: Implement Scripts::cmdRestoreBlock");
+	error("TODO: Implement Scripts::cmdRestoreBlock");
 }
 
 void Scripts::cmdCopyScnBuf() {
-    error("TODO: Implement Scripts::cmdCopyScnBuf");
+	error("TODO: Implement Scripts::cmdCopyScnBuf");
 }
 
 void Scripts::cmdStilWalkTo() {
@@ -1468,12 +1520,12 @@ void Scripts::cmdReturnExit() {
 	//_vm->_exitBox = true; -- work out what to do with this.
 	_endFlag = true;
 	_returnCode = 0;
-    error("TODO: Implement Scripts::cmdReturnExit");
+	error("TODO: Implement Scripts::cmdReturnExit");
 }
 
 void Scripts::cmdSetStilCoords() {
-    error("TODO: Implement Scripts::cmdSetStilCoords");
-    // ((Noctropolis::NoctropolisEngine *)_vm)->_stil->
+	error("TODO: Implement Scripts::cmdSetStilCoords");
+	// ((Noctropolis::NoctropolisEngine *)_vm)->_stil->
 }
 
 void Scripts::cmdSetPlayerDir() {
diff --git a/engines/access/scripts.h b/engines/access/scripts.h
index c9d9c8d7cab..a0b4fe43083 100644
--- a/engines/access/scripts.h
+++ b/engines/access/scripts.h
@@ -97,7 +97,8 @@ protected:
 	void cmdCheckTimer();
 	void cmdJumpGoto();
 	void cmdSetTravel();
-	void cmdSetVideo();
+	void cmdSetVideo_v1();
+	void cmdSetVideo_v3();
 	void cmdPlayVideo();
 	void cmdPlotImage();
 	void cmdSetDisplay();
@@ -167,6 +168,8 @@ protected:
 	void cmdLockInterface();
 	void cmdUnlockInterface();
 	void cmdCharSpeak_v3();
+	void cmdPlayerSpeak();
+	void cmdPlayerChoice();
 
 public:
 	int _sequence;
@@ -177,6 +180,9 @@ public:
 	int32 _choiceStart;
 	Common::Point _charsOrg, _texsOrg;
 
+	bool _continuenceFlag; // only used in Noctropolis
+	int _continuenceType;  // only used in Noctropolis
+
 public:
 	Scripts(AccessEngine *vm);
 


Commit: d2503eb7af8434c3ef8568110a58557867aa2b9f
    https://github.com/scummvm/scummvm/commit/d2503eb7af8434c3ef8568110a58557867aa2b9f
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Properly load Noctropolis data and player animations

Can now walk around a bit, player animates and scales.  Still very janky.

Changed paths:
  A engines/access/noctropolis/noctropolis_player.cpp
  A engines/access/noctropolis/noctropolis_player.h
    engines/access/access.h
    engines/access/animation.cpp
    engines/access/animation.h
    engines/access/events.cpp
    engines/access/module.mk
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/noctropolis/noctropolis_room.h
    engines/access/player.cpp
    engines/access/player.h
    engines/access/room.cpp
    engines/access/room.h
    engines/access/screen.cpp
    engines/access/screen.h
    engines/access/scripts.cpp
    engines/access/scripts.h


diff --git a/engines/access/access.h b/engines/access/access.h
index d317e389317..f1efa7b59ee 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -223,7 +223,7 @@ public:
 	ASurface _vidBuf;
 	int _vidX, _vidY;
 	SpriteResource *_objectsTable[128];
-	bool _establishTable[100];
+	bool _establishTable[128];
 	bool _establishFlag;
 	int _establishMode;
 	int _establishGroup;
diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index 188b2e89032..f5847229765 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -212,6 +212,7 @@ void Animation::anim7() {
 }
 
 void Animation::anim8() {
+	// TODO: In here be careful with whether we are using playerX or raw.x
 	debug("TODO: Animation::anim8");
 }
 
@@ -227,11 +228,41 @@ void Animation::anim11() {
      // Actor idle
 	const AnimationFrame *frame = calcFrame();
 	_countdownTicks += frame->_frameDelay;
+	_scaling = _vm->_scale;
 	setFrame1(frame, _vm->_player->_rawPlayer.x, _vm->_player->_rawPlayer.y - _vm->_player->_playerOffset.y);
 }
 
 void Animation::anim12() {
-	debug("TODO: Animation::anim12");
+	// Actor walk
+	const AnimationFrame *frame = calcFrame();
+	if (_countdownTicks == 0) {
+		const AnimationFrame *prevAnimationFrame = frame;
+		_countdownTicks = _initialTicks;
+		_frameNumber++;
+		if (_frameNumber >= (int)_frames.size()) {
+			_frameNumber = 1;
+			prevAnimationFrame = calcFrame1();
+		}
+		frame = calcFrame();
+		int16 deltaX = (frame->_baseX + frame->_parts[0]._position.x) -
+			(prevAnimationFrame->_baseX + prevAnimationFrame->_parts[0]._position.x);
+		int16 deltaY = (frame->_baseY + frame->_parts[0]._position.y) -
+			(prevAnimationFrame->_baseY + prevAnimationFrame->_parts[0]._position.y);
+		int16 xadd = ABS(deltaX) * _vm->_scale / 256;
+		int16 yadd = ABS(deltaY) * _vm->_scale / 256;
+		if (deltaX < 0)
+			_vm->_player->_playerX -= xadd;
+		else
+			_vm->_player->_playerX += xadd;
+		if (deltaY < 0)
+			_vm->_player->_playerY -= yadd;
+		else
+			_vm->_player->_playerY += yadd;
+		_countdownTicks += frame->_frameDelay;
+		debug("anim12: player pos %d, %d (change %d %d -> %d %d) scale %d", _vm->_player->_playerX, _vm->_player->_playerY, deltaX, deltaY, xadd, yadd, _vm->_scale);
+	}
+	_scaling = _vm->_scale;
+	setFrame1(frame, _vm->_player->_playerX, _vm->_player->_playerY - _vm->_player->_playerOffset.y);
 }
 
 
@@ -259,14 +290,21 @@ void Animation::setFrame1(const AnimationFrame *frame, int16 xoff, int16 yoff) {
 
 		// Set the flags
 		ie._flags = part._flags & ~IMGFLAG_UNSCALED;
-		if (_vm->_animation->_frameScale == -1)
+		if (_scaling == -1)
 			ie._flags |= IMGFLAG_UNSCALED;
 
 		// Set the other fields
 		ie._spritesPtr = _vm->_objectsTable[part._spritesIndex];
 		ie._frameNumber = part._frameIndex;
-		ie._position = part._position + _vm->_animation->_base;
-		ie._offsetY = part._offsetY - ie._position.y;
+		ie._position.x = xoff ? xoff : (part._position.x + _vm->_animation->_base.x);
+		ie._position.y = yoff ? yoff : (part._position.y + _vm->_animation->_base.y);
+		if (xoff && _scaling != -1) {
+			// If xoff is set, the animation is for an actor so we need to apply scale factor
+			// to frame height
+			ie._offsetY = part._offsetY * _scaling / 256 - ie._position.y;
+		} else {
+			ie._offsetY = part._offsetY - ie._position.y;
+		}
 
 		_vm->_images.addToList(ie);
 	}
@@ -312,7 +350,7 @@ AnimationFramePart::AnimationFramePart(Common::SeekableReadStream *stream) {
 AnimationManager::AnimationManager(AccessEngine *vm) : Manager(vm) {
 	_animation = nullptr;
 	_animStart = nullptr;
-	_frameScale = 0;
+	//_frameScale = 0;
 }
 
 AnimationManager::~AnimationManager() {
@@ -360,7 +398,7 @@ Animation *AnimationManager::findAnimation(int animId) {
 
 void AnimationManager::animate(int animId) {
 	Animation *anim = findAnimation(animId);
-	_frameScale = anim->_scaling;
+	//_frameScale = anim->_scaling;
 	anim->animate();
 }
 
diff --git a/engines/access/animation.h b/engines/access/animation.h
index b769fa8d3f5..816a9ed3b4f 100644
--- a/engines/access/animation.h
+++ b/engines/access/animation.h
@@ -42,7 +42,7 @@ private:
 public:
 	Animation *_animStart;
 	Common::Point _base;
-	int _frameScale;
+	//int _frameScale;
 public:
 	AnimationManager(AccessEngine *vm);
 	~AnimationManager();
@@ -72,7 +72,7 @@ public:
 	/**
 	 * Remove the last animation timer
 	 */
-	void popBackTimer() { _animationTimers.pop_back(); }
+	void popBackTimer() { if (_animationTimers.size()) _animationTimers.pop_back(); }
 };
 
 class AnimationResource {
diff --git a/engines/access/events.cpp b/engines/access/events.cpp
index 43e7be76d54..226eabed846 100644
--- a/engines/access/events.cpp
+++ b/engines/access/events.cpp
@@ -300,6 +300,7 @@ void EventsManager::nextFrame() {
 void EventsManager::nextTimer() {
 	_vm->_animation->updateTimers();
 	_vm->_timers.updateTimers();
+	_vm->_player->updateTimers();
 }
 
 void EventsManager::delay(int time) {
diff --git a/engines/access/module.mk b/engines/access/module.mk
index 486f89a4ddd..87bf9fe1430 100644
--- a/engines/access/module.mk
+++ b/engines/access/module.mk
@@ -37,6 +37,7 @@ MODULE_OBJS := \
 	noctropolis/noctropolis_comicviewer.o \
 	noctropolis/noctropolis_font.o \
 	noctropolis/noctropolis_game.o \
+	noctropolis/noctropolis_player.o \
 	noctropolis/noctropolis_resources.o \
 	noctropolis/noctropolis_room.o \
 	noctropolis/noctropolis_scripts.o \
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 94210ac4835..1d341843e44 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -75,10 +75,9 @@ void NoctropolisEngine::initVariables() {
 	_inventory->_startInvBox = 0;
 	Common::fill(&_objectsTable[0], &_objectsTable[128], (SpriteResource *)nullptr);
 	_player->_playerOff = false;
-	/*
-	_player->_playerX = _player->_rawPlayer.x = _res->ROOMTBL[_player->_roomNumber]._travelPos.x;
-	_player->_playerY = _player->_rawPlayer.y = _res->ROOMTBL[_player->_roomNumber]._travelPos.y;
-	*/
+	debug("TODO: set player starting point - using first _TravManPos entry for now");
+	_player->_playerX = _player->_rawPlayer.x = _player->_moveTo.x = 280;
+	_player->_playerY = _player->_rawPlayer.y = _player->_moveTo.y = 390;
 	_room->_selectCommand = -1;
 	_events->setNormalCursor(CURSOR_CROSSHAIRS);
 	_mouseMode = 0;
diff --git a/engines/access/noctropolis/noctropolis_player.cpp b/engines/access/noctropolis/noctropolis_player.cpp
new file mode 100644
index 00000000000..71fadf10fd5
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_player.cpp
@@ -0,0 +1,216 @@
+/* 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/scummsys.h"
+#include "access/access.h"
+#include "access/room.h"
+#include "access/noctropolis/noctropolis_game.h"
+#include "access/noctropolis/noctropolis_player.h"
+#include "access/noctropolis/noctropolis_resources.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+NoctropolisPlayer::NoctropolisPlayer(AccessEngine *vm) : Player(vm), _lastDirection(DOWN), _animManager(nullptr) {
+	_game = (NoctropolisEngine *)vm;
+}
+
+NoctropolisPlayer::~NoctropolisPlayer() {
+	delete _animManager;
+}
+
+void NoctropolisPlayer::load() {
+	Player::load();
+
+	// Overwrite game-specific values
+	_playerOffset.x = _vm->_screen->_scaleTable1[20];
+	_playerOffset.y = _vm->_screen->_scaleTable1[62];
+	_leftDelta = -9;
+	_rightDelta = 33;
+	_upDelta = 5;
+	_downDelta = -5;
+	_scrollConst = 5;
+
+	_sideWalkMin = 0;
+	_sideWalkMax = 7;
+	_upWalkMin = 8;
+	_upWalkMax = 14;
+	_downWalkMin = 15;
+	_downWalkMax = 23;
+
+	// playerPalette is configured in Player::load.
+}
+
+void NoctropolisPlayer::loadAnimation(int fileNum, int subFile) {
+	if (!_animManager)
+		_animManager = new AnimationManager(_vm);
+	Resource *data = _vm->_files->loadFile(fileNum, subFile);
+	_animManager->loadAnimations(data);
+	delete data;
+}
+
+/*
+ * Get the animation number for the given direction.
+ * Noctropolis anim nums don't match the order of Direction in player.h.
+ */
+static int _animNumForDir(Direction dir) {
+	switch (dir) {
+    case UP:		return 0;
+    case UPRIGHT: 	return 1;
+	case RIGHT: 	return 2;
+	case DOWNRIGHT: return 3;
+    case DOWN: 		return 4;
+	case DOWNLEFT: 	return 5;
+	case LEFT: 		return 6;
+    case UPLEFT:    return 7;
+    default:	    return -1;
+	}
+}
+
+void NoctropolisPlayer::updatePlayerDirection() {
+	if (_playerOff)
+		return;
+	
+	int16 absDeltaX = abs(_moveTo.x - _rawPlayer.x);
+	int16 absDeltaY = abs(_moveTo.y - _rawPlayer.y);
+	
+	int scaleEntry = (_vm->_room->_roomFlag & kRoomFlagTopView) ? 4 : 20;
+	int16 minMove = _vm->_screen->_scaleTable1[scaleEntry];
+	if (minMove < absDeltaX) {
+		if (minMove < absDeltaY) {
+			if (_moveTo.y < _rawPlayer.y) {
+				if (_moveTo.x < _rawPlayer.x) {
+					_playerDirection = UPLEFT;
+				} else {
+					_playerDirection = UPRIGHT;
+				}
+			} else {
+				if (_moveTo.x < _playerX) {
+					_playerDirection = DOWNLEFT;
+				} else {
+					_playerDirection = DOWNRIGHT;
+				}
+			}
+		} else {
+			_rawPlayer.y = _moveTo.y;
+			if (_moveTo.x < _rawPlayer.x) {
+				_playerDirection = LEFT;
+			} else {
+				_playerDirection = RIGHT;
+			}
+		}
+	} else if (minMove < absDeltaY) {
+		_rawPlayer.x = _moveTo.x;
+		if (_moveTo.y < _rawPlayer.y) {
+			_playerDirection = UP;
+		} else {
+			_playerDirection = DOWN;
+		}
+	} else {
+		_playerDirection = NONE;
+		_rawPlayer.x = _moveTo.x;
+		_rawPlayer.y = _moveTo.y;
+	}
+}
+
+void NoctropolisPlayer::calcManScale() {
+	if (!_vm->_player->_playerOff) {
+		calcManScale1();
+	}
+}
+
+void NoctropolisPlayer::calcManScale1() {
+	_vm->_scale = _vm->_manScaleOff;
+	if (!(_vm->_room->_roomFlag & kRoomFlagTopView)) {
+		if (_vm->_scale == 0) {
+			/*
+			_vm->_scale = (_vm->_scaleI *
+						   ((_vm->_scaleH2 * 0x100 +
+							 _vm->_scaleT1 *
+							 (_vm->_scaleN1 + (_playerY - _vm->_scaleMaxY)) & 0xff00) /
+							_vm->_scaleH1) >> 8);
+							*/
+			_vm->_scale = ((((_rawPlayer.y - _vm->_scaleMaxY + _vm->_scaleN1) *
+				_vm->_scaleT1 + (_vm->_scaleH2 << 8)) & 0xff00) / _vm->_scaleH1 * _vm->_scaleI) >> 8;
+		}
+		
+		_vm->_screen->setScaleTable(_vm->_scale);
+		_playerOffset.x = _vm->_screen->_scaleTable1[60];
+		_playerOffset.y = _vm->_screen->_scaleTable1[200];
+	} else {
+		_vm->_screen->setScaleTable(_vm->_scale);
+		_playerOffset.x = _vm->_screen->_scaleTable1[6];
+		_playerOffset.y = _vm->_screen->_scaleTable1[6];
+	}
+}
+
+void NoctropolisPlayer::updateTimers() {
+	if (_animManager)
+		_animManager->updateTimers();
+}
+
+void NoctropolisPlayer::walk() {
+	if (_playerOff)
+		return;
+
+	updatePlayerDirection();
+
+	calcManScale();
+
+	if (_playerDirection == NONE) {
+		// Idle animation (using last direction)
+		_playerX = _rawPlayer.x;
+		_playerY = _rawPlayer.y;
+		_animManager->animate(_animNumForDir(_lastDirection) + 8);
+		_playerMove = false;
+	} else {
+		// Move animation
+		int dirAnimNum = _animNumForDir(_playerDirection);
+		if (_playerDirection != _lastDirection) {
+			_lastDirection = _playerDirection;
+			_animManager->popBackTimer();
+			Animation *anim = _animManager->setAnimation(dirAnimNum);
+			_animManager->setAnimTimer(anim);
+		}
+		_playerX = _rawPlayer.x;
+		_playerY = _rawPlayer.y;
+		/*local_30 =*/ _animManager->animate(dirAnimNum);
+		_rawPlayer.x = _playerX;
+		_rawPlayer.y = _playerY;
+		
+		calcManScale1();
+		
+		/*
+		if (local_30 != (byte *)0x0) {
+			local_48.animNum = dirAnimNum;
+			local_48.animTable = _playerAnimation;
+			local_48.somePtr = (byte *)&local_30;
+			SetPlayerRelFrame((uchar **)local_48.somePtr,&local_48);
+		}*/
+	}
+}
+
+
+
+} // End of namespace Noctropolis
+
+} // End of namespace Access
diff --git a/engines/access/noctropolis/noctropolis_player.h b/engines/access/noctropolis/noctropolis_player.h
new file mode 100644
index 00000000000..24402baec6e
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_player.h
@@ -0,0 +1,62 @@
+/* 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 ACCESS_NOCTROPOLIS_PLAYER_H
+#define ACCESS_NOCTROPOLIS_PLAYER_H
+
+#include "common/scummsys.h"
+#include "access/player.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+class NoctropolisEngine;
+
+class NoctropolisPlayer : public Player {
+private:
+	NoctropolisEngine *_game;
+	Direction _lastDirection;
+	AnimationManager *_animManager;
+
+	void updatePlayerDirection();
+
+	void calcManScale() override;
+	void calcManScale1();
+
+public:
+	NoctropolisPlayer(AccessEngine *vm);
+	~NoctropolisPlayer();
+
+	void load() override;
+
+	void loadAnimation(int fileNum, int subFile);
+	void walk() override;
+
+	void updateTimers() override;
+
+};
+
+} // End of namespace Noctropolis
+
+} // End of namespace Access
+
+#endif /* ACCESS_NOCTROPOLIS_PLAYER_H */
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 7048740344a..833d88d6511 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -1682,7 +1682,7 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	}
 	// TODO: These last few files are maybe only ever used from hard-coded points,
 	// so maybe we can just hard-code the names in those places and avoid this hack?
-	while (FILENAMES.size() < 255 - ARRAYSIZE(NOCT_FILES_2))
+	while (FILENAMES.size() < 256 - ARRAYSIZE(NOCT_FILES_2))
 		FILENAMES.push_back(Common::Path());
 	for (int i = 0; i < ARRAYSIZE(NOCT_FILES_2); i++) {
 		Common::Path filename = Common::Path(NOCT_FILES_2[i]).getLastComponent();
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 949010fd520..0e1e4d351cf 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "access/noctropolis/noctropolis_room.h"
+#include "access/noctropolis/noctropolis_player.h"
 #include "access/access.h"
 
 namespace Access {
@@ -31,33 +32,35 @@ NoctropolisRoom::NoctropolisRoom(AccessEngine *vm): Room(vm) {
 
 void NoctropolisRoom::reloadRoom() {
 	loadRoom(_vm->_player->_roomNumber);
+	
+	// This is LoadPlayer1
 	int subFileBase = 1;
-	int numSubFiles = 0;
-	int objBase = 0;
-	int fileNum = 0;
-	if (!(_roomFlag & 4)) {
+	int numSubFiles;
+	int objBase;
+	int fileNum;
+	if (!(_roomFlag & kRoomFlagTopView)) {
 		if (_roomFlag) {
 			// Peter
 			numSubFiles = 5;
-			objBase = 0x64;
+			objBase = 100;
 			fileNum = 0xfe;
 		} else {
 			// Dark
 			numSubFiles = 5;
-			objBase = 0x69;
+			objBase = 105;
 			fileNum = 0xff;
 		}
 	} else {
 		// Top
 		numSubFiles = 1;
-		objBase = 0x73;
+		objBase = 115;
 		fileNum = 0xfc;
 	}
 	
 	_vm->_player->loadNoctPalette(fileNum, _palIntensity + 6);
-	_vm->_player->loadAnimation(fileNum, 0);
+	((NoctropolisPlayer *)_vm->_player)->loadAnimation(fileNum, 0);
 
-	for (int i = subFileBase; i < numSubFiles; i++) {
+	for (int i = subFileBase; i <= numSubFiles; i++) {
 		Resource *data = _vm->_files->loadFile(fileNum, i);
 		_vm->_objectsTable[objBase + i - subFileBase] = new SpriteResource(_vm, data);
 	}
@@ -149,6 +152,17 @@ void NoctropolisRoom::buildColumnXScroll(int playX, int screenX) {
 	}
 }
 
+void NoctropolisRoom::mainAreaClick() {
+	//Common::Point &mousePos = _vm->_events->_mousePos;
+	Common::Point pt = _vm->_events->calcRawMouse();
+	//Screen &screen = *_vm->_screen;
+	Player &player = *_vm->_player;
+
+	// TODO: For now just add a move-to point for the player.
+	player._moveTo = pt;
+	player._playerMove = true;
+}
+
 } // end namespace Noctropolis
 
 } // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_room.h b/engines/access/noctropolis/noctropolis_room.h
index 04f4ed91095..8b14a5d3bea 100644
--- a/engines/access/noctropolis/noctropolis_room.h
+++ b/engines/access/noctropolis/noctropolis_room.h
@@ -46,7 +46,7 @@ protected:
 	
 	void reloadRoom1() override;
 
-	void mainAreaClick() override {}
+	void mainAreaClick() override;
 
 private:
 	// Like buildColumn but can handle negative playX.
diff --git a/engines/access/player.cpp b/engines/access/player.cpp
index 44669d45b02..bf764c42743 100644
--- a/engines/access/player.cpp
+++ b/engines/access/player.cpp
@@ -26,6 +26,7 @@
 #include "access/resources.h"
 #include "access/amazon/amazon_player.h"
 #include "access/martian/martian_player.h"
+#include "access/noctropolis/noctropolis_player.h"
 
 namespace Access {
 
@@ -37,6 +38,9 @@ Player *Player::init(AccessEngine *vm) {
 	case kGameMartianMemorandum:
 		vm->_playerDataCount = 10;
 		return new Martian::MartianPlayer(vm);
+	case kGameNoctropolis:
+		vm->_playerDataCount = 0;
+		return new Noctropolis::NoctropolisPlayer(vm);
 	default:
 		vm->_playerDataCount = 8;
 		return new Player(vm);
@@ -46,16 +50,15 @@ Player *Player::init(AccessEngine *vm) {
 Player::Player(AccessEngine *vm) : Manager(vm), ImageEntry() {
 	_playerSprites = nullptr;
 	_playerSprites1 = nullptr;
-	_playerAnimation = nullptr;
 	_manPal1 = nullptr;
 	_frameNumber = 0;
 	_rawTempL = 0;
 	_rawXTemp = 0;
 	_rawYTempL = 0;
 	_rawYTemp = 0;
-	_playerXLow = 0;
+	//_playerXLow = 0;
 	_playerX = 0;
-	_playerYLow = 0;
+	//_playerYLow = 0;
 	_playerY = 0;
 	_frame = 0;
 	_playerOff = false;
@@ -133,10 +136,18 @@ void Player::load() {
 
 	_playerSprites = _playerSprites1;
 	if (_manPal1) {
-		// Those values are from MM as Amazon doesn't use it
-		Common::copy(_manPal1 + 0x2A0, _manPal1 + 0x2A0 + 0x42, _vm->_screen->_manPal);
+		if (_vm->getGameID() == kGameNoctropolis) {
+			if (_vm->_room->_roomFlag & kRoomFlagStiletto) {
+				error("TODO: Copy _stilPal in to palette");
+				//Common::copy(_stilPal + 0x1e0, _stilPal + 0x1e0 + 99, _vm->_screen->_manPal);
+			}
+			Common::copy(_manPal1 + 0x240, _manPal1 + 0x240 + 0x84, _vm->_screen->_manPal);
+		} else {
+			// Those values are from MM as Amazon doesn't use it
+			Common::copy(_manPal1 + 0x2A0, _manPal1 + 0x2A0 + 0x42, _vm->_screen->_manPal);
+		}
 	} else {
-		Common::fill(_vm->_screen->_manPal, _vm->_screen->_manPal + 0x60, 0);
+		Common::fill(_vm->_screen->_manPal, _vm->_screen->_manPal + 0x84, 0);
 	}
 }
 
@@ -159,12 +170,6 @@ void Player::loadNoctPalette(int fileNum, int subFile) {
 	delete pal;
 }
 
-void Player::loadAnimation(int fileNum, int subFile) {
-	Resource *data = _vm->_files->loadFile(fileNum, subFile);
-	_playerAnimation = new AnimationResource(_vm, data);
-	delete data;
-}
-
 void Player::loadSprites(const Common::Path &name) {
 	Resource *data = _vm->_files->loadRawFile(name);
 
@@ -767,11 +772,6 @@ void Player::plotCom2() {
 			ie._frameNumber = 13;
 			_vm->_images.addToList(ie);
 		}
-	} else if (_playerAnimation != nullptr) {
-		// Noctropolis player animation
-		int animNum = ((int)_playerDirection + (_playerMove ? 0 : 8));
-		Animation *anim = _playerAnimation->getAnimation(animNum);
-		anim->animate();
 	}
 }
 
diff --git a/engines/access/player.h b/engines/access/player.h
index 536ac1d3f68..c1d3432ced0 100644
--- a/engines/access/player.h
+++ b/engines/access/player.h
@@ -40,7 +40,7 @@ enum Direction {
 	UPRIGHT = 5,
 	DOWNRIGHT = 6,
 	UPLEFT = 7,
-	DOWNLEFT = 8
+	DOWNLEFT = 8,
 };
 
 class AccessEngine;
@@ -83,7 +83,6 @@ protected:
 public:
 	Direction _playerDirection;
 	SpriteResource *_playerSprites;
-	AnimationResource *_playerAnimation;
 	// Fields in original Player structure
 	byte *_manPal1;
 	int *_walkOffRight;
@@ -99,9 +98,9 @@ public:
 	byte _rawYTempL;
 	int _rawYTemp;
 	Common::Point _playerOffset;
-	int _playerXLow;
+	//int _playerXLow;
 	int _playerX;
-	int _playerYLow;
+	//int _playerYLow;
 	int _playerY;
 	int _frame;
 	int _xFlag, _yFlag;
@@ -131,17 +130,16 @@ public:
 	void loadNoctPalette(int fileNum, int subFile);
 
 	void loadSprites(const Common::Path &name);
-	void loadAnimation(int fileNum, int subFile);
 
 	void freeSprites();
 
 	void removeSprite1();
 
-	void calcManScale();
+	virtual void calcManScale();
 
 	void extracted();
 
-	void walk();
+	virtual void walk();
 
 	void calcPlayer();
 
@@ -152,6 +150,8 @@ public:
 	void checkScroll();
 
 	void checkMove();
+	
+	virtual void updateTimers() {};
 
 	/**
 	* Synchronize savegame data
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index da2a8a757c5..22bd47c9328 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -639,7 +639,7 @@ void Room::doCommands() {
 		handleCommand(7);
 
 	} else if (_vm->_events->_leftButton) {
-		if (_vm->_events->_mouseRow >= 22) {
+		if (_vm->getGameID() != kGameNoctropolis && _vm->_events->_mouseRow >= 22) {
 			// Mouse in user interface area
 			for (commandId = 0; commandId < 10; ++commandId) {
 				if (_vm->_events->_mousePos.x >= _rMouse[commandId][0] &&
diff --git a/engines/access/room.h b/engines/access/room.h
index 44dcb1c8c9f..4a84d86b00c 100644
--- a/engines/access/room.h
+++ b/engines/access/room.h
@@ -60,6 +60,13 @@ public:
 
 enum Function { FN_NONE = 0, FN_CLEAR1 = 1, FN_CLEAR2 = 2, FN_RELOAD = 3, FN_BREAK = 4 };
 
+// room flags for Noctropolis
+enum RoomFlag {
+	kRoomFlagStiletto = 2,
+	kRoomFlagTopView = 4,
+	kRoomFlagNoPlayer = 0x80,
+};
+
 class Room : public Manager {
 private:
 	void roomLoop();
diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp
index 8f8bb44ca6a..869286efa10 100644
--- a/engines/access/screen.cpp
+++ b/engines/access/screen.cpp
@@ -50,7 +50,7 @@ ScreenSave::ScreenSave() : _clipWidth(0), _clipHeight(0), _windowXAdd(0), _windo
 Screen::Screen(AccessEngine *vm) : _vm(vm) {
 	Graphics::Screen::create(_vm->getScreenWidth(), _vm->getScreenHeight());
 	Common::fill(&_tempPalette[0], &_tempPalette[Graphics::PALETTE_SIZE], 0);
-	Common::fill(&_manPal[0], &_manPal[0x60], 0);
+	Common::fill(&_manPal[0], &_manPal[0x84], 0);
 	Common::fill(&_scaleTable1[0], &_scaleTable1[256], 0);
 	Common::fill(&_scaleTable2[0], &_scaleTable2[256], 0);
 	_savedPaletteCount = 0;
@@ -125,9 +125,15 @@ void Screen::setInitialPalettte() {
 }
 
 void Screen::setManPalette() {
-	// Player palette is colors 224~246
-	for (int i = 0; i < 0x42; i++) {
-		_rawPalette[672 + i] = PALETTE_6BIT_TO_8BIT(_manPal[i]);
+	// Player palette is colors 224~246 in MM
+	if (_vm->getGameID() == kGameMartianMemorandum) {
+		for (int i = 0; i < 0x42; i++) {
+			_rawPalette[0x2a0 + i] = PALETTE_6BIT_TO_8BIT(_manPal[i]);
+		}
+	} else if (_vm->getGameID() == kGameNoctropolis) {
+		for (int i = 0; i < 0x84; i++) {
+			_rawPalette[0x240 + i] = PALETTE_6BIT_TO_8BIT(_manPal[i]);
+		}
 	}
 }
 
diff --git a/engines/access/screen.h b/engines/access/screen.h
index 5e4abadd977..dfcb6e77a04 100644
--- a/engines/access/screen.h
+++ b/engines/access/screen.h
@@ -70,7 +70,7 @@ public:
 	Common::Point _bufferStart;
 	int _windowXAdd, _windowYAdd;
 	int _screenYOff;
-	byte _manPal[0x60];
+	byte _manPal[0x84];
 	byte _scaleTable1[256];
 	byte _scaleTable2[256];
 	int _vWindowWidth;
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index ca282251c22..adc32b2ff08 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -140,6 +140,7 @@ void Scripts::setOpcodes_v2() {
 }
 
 void Scripts::setOpcodes_v3() {
+	COMMAND_LIST[18] = &Scripts::cmdSetCoords;
 	COMMAND_LIST[34] = &Scripts::cmdSetVideo_v3;
 	COMMAND_LIST[50] = &Scripts::cmdCharSpeak_v3;
 	COMMAND_LIST[51] = &Scripts::cmdPlayerSpeak;
@@ -1045,16 +1046,29 @@ void Scripts::cmdCharSpeak_v3() {
 	// TODO: Duck (reduce) music volume to 50%
 
 	Common::String str = _data->readString();
-	debugC(1, kDebugScripts, "cmdCharSpeak(str=\"%s\")", str.c_str());
+	debugC(1, kDebugScripts, "cmdCharSpeak(%d, %d, str=\"%s\")", x, y, str.c_str());
 	_vm->_bubbleBox->placeBubble(str);
 	findNull();
 }
 
 void Scripts::cmdPlayerSpeak() {
-	int16 a = _data->readUint16LE();
-	int16 b = _data->readUint16LE();
-	debugC(1, kDebugScripts, "cmdPlayerSpeak(%d, %d)", a, b);
-	error("TODO: implement cmdPlayerSpeak()");
+	int16 x = _data->readUint16LE();
+	int16 y = _data->readUint16LE();
+	
+	const char *title = _vm->_res->getEgoName();
+	Common::String str = _data->readString();
+	debugC(1, kDebugScripts, "cmdPlayerSpeak(%d, %d, \"%s\", \"%s\")", x, y, title, str.c_str());
+
+	// TODO: Check that this gives correct placement
+	_charsOrg = Common::Point(x, y);
+	_vm->_screen->_printOrg = _charsOrg;
+	_vm->_screen->_printStart = _charsOrg;
+	_vm->_bubbleBox->_bubbleTitle = title;
+
+	_vm->_bubbleBox->placeBubble(str);
+	_continuenceFlag = 1;
+	findNull();
+	warning("TODO: Check rendering for cmdPlayerSpeak() box");
 }
 
 
@@ -1429,6 +1443,7 @@ void Scripts::cmdWalkTo() {
 
 	_vm->_player->_moveTo.x = x;
 	_vm->_player->_moveTo.y = y;
+	_vm->_player->_playerDirection = (Direction)dir;
 	_vm->_player->_move = (Direction)dir;
 	_vm->_player->_playerMove = true;
 }
@@ -1470,8 +1485,8 @@ void Scripts::cmdGotoFrame() {
 }
 
 void Scripts::cmdPlayerScale() {
-	_vm->_scale = _data->readUint16LE();
-	debugCN(1, kDebugScripts, "cmdPlayerScale(%d)", _vm->_scale);
+	_vm->_manScaleOff = _data->readUint16LE();
+	debugCN(1, kDebugScripts, "cmdPlayerScale(%d)", _vm->_manScaleOff);
 }
 
 void Scripts::cmdRestoreBlock() {
@@ -1523,6 +1538,20 @@ void Scripts::cmdReturnExit() {
 	error("TODO: Implement Scripts::cmdReturnExit");
 }
 
+void Scripts::cmdSetCoords() {
+	const int x = _data->readSint16LE();
+	const int y = _data->readSint16LE();
+	debugC(1, kDebugScripts, "cmdSetCoords(x=%d, y=%d)", x, y);
+	_vm->_player->_playerX = x;
+	_vm->_player->_moveTo.x = x;
+	_vm->_player->checkScroll();
+	bool hscroll = _vm->_player->_scrollFlag;
+	_vm->_player->_playerY = y;
+	_vm->_player->_moveTo.y = y;
+	_vm->_player->checkScroll();
+	_vm->_player->_scrollFlag |= hscroll;
+}
+
 void Scripts::cmdSetStilCoords() {
 	error("TODO: Implement Scripts::cmdSetStilCoords");
 	// ((Noctropolis::NoctropolisEngine *)_vm)->_stil->
diff --git a/engines/access/scripts.h b/engines/access/scripts.h
index a0b4fe43083..e82941357cc 100644
--- a/engines/access/scripts.h
+++ b/engines/access/scripts.h
@@ -161,6 +161,7 @@ protected:
 	void cmdStilOff();
 	void cmdStilOn();
 	void cmdReturnExit();
+	void cmdSetCoords();
 	void cmdSetStilCoords();
 	void cmdSetPlayerDir();
 	void cmdSetStilDir();


Commit: e59824db7c75d9d838ae53cba26aeb46dbfc37a8
    https://github.com/scummvm/scummvm/commit/e59824db7c75d9d838ae53cba26aeb46dbfc37a8
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix Noctropolis cursors

Changed paths:
    engines/access/events.cpp
    engines/access/scripts.cpp


diff --git a/engines/access/events.cpp b/engines/access/events.cpp
index 226eabed846..12a6bed95d1 100644
--- a/engines/access/events.cpp
+++ b/engines/access/events.cpp
@@ -82,27 +82,32 @@ void EventsManager::setCursor(CursorType cursorId) {
 		Graphics::Surface cursorSurface;
 		cursorSurface.create(width, height, Graphics::PixelFormat::createFormatCLUT8());
 		byte *destP = (byte *)cursorSurface.getPixels();
-		Common::fill(destP, destP + width * height, 0);
-
-		// Loop to build up the cursor
-		for (int y = 0; y < height; ++y) {
-			destP = (byte *)cursorSurface.getBasePtr(0, y);
-			int w = width;
-			int skip = *srcP++;
-			int plot = *srcP++;
-			if (skip >= width)
-				break;
-
-			// Skip over pixels
-			destP += skip;
-			w -= skip;
-
-			// Write out the pixels to plot
-			while (plot > 0 && w > 0) {
-				*destP++ = *srcP++;
-				--plot;
-				--w;
+
+		if (_vm->getGameID() != kGameNoctropolis) {
+			Common::fill(destP, destP + width * height, 0);
+			// Loop to build up the cursor
+			for (int y = 0; y < height; ++y) {
+				destP = (byte *)cursorSurface.getBasePtr(0, y);
+				int w = width;
+				int skip = *srcP++;
+				int plot = *srcP++;
+				if (skip >= width)
+					break;
+
+				// Skip over pixels
+				destP += skip;
+				w -= skip;
+
+				// Write out the pixels to plot
+				while (plot > 0 && w > 0) {
+					*destP++ = *srcP++;
+					--plot;
+					--w;
+				}
 			}
+		} else {
+			// Simple bitmaps in Noctropolis.
+			memcpy(destP, srcP, width * height);
 		}
 
 		// Set the cursor
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index adc32b2ff08..e2ec005d46f 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -565,6 +565,8 @@ void Scripts::cmdNewRoom() {
 
 	_vm->_room->_function = FN_CLEAR1;
 	_vm->freeChar();
+	if (_vm->getGameID() == kGameNoctropolis)
+		_vm->_events->setCursor(CURSOR_ARROW);
 	_vm->_converseMode = 0;
 	cmdRetPos();
 }


Commit: 1119d110cd4672200c1ef07b5f9cdc3fddce48e9
    https://github.com/scummvm/scummvm/commit/1119d110cd4672200c1ef07b5f9cdc3fddce48e9
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add Noctropolis action codes

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/access/room.cpp


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 988b6fde491..16cd943df84 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -594,4 +594,56 @@ bool AccessEngine::readSavegameHeader(Common::InSaveFile *in, AccessSavegameHead
 bool AccessEngine::shouldQuitOrRestart() {
 	return shouldQuit() || _restartFl;
 }
+
+static const AccessActionCode AMAZON_ACTION_CODES[] = {
+	{ kActionLook, 1 },
+	{ kActionUse, 2 },
+	{ kActionTake, 3 },
+	{ kActionInventory, 4 },
+	{ kActionClimb, 5 },
+	{ kActionTalk, 6 },
+	{ kActionWalk, 7 },
+	{ kActionHelp, 8 },
+	{ kActionSaveLoad, -2 },
+	{ kActionNone, -1 },
+};
+
+static const AccessActionCode MARTIAN_ACTION_CODES[] = {
+	{ kActionLook, 0 },
+	{ kActionOpen, 1 },
+	{ kActionMove, 2 },
+	{ kActionTake, 3 },
+	{ kActionUse, 4 },
+	{ kActionWalk, 5 },
+	{ kActionTalk, 6 },
+	{ kActionTravel, 7 },
+	{ kActionHelp, 8 },
+	{ kActionSaveLoad, -2 },
+	{ kActionNone, -1 },
+};
+
+static const AccessActionCode NOCTROPOLIS_ACTION_CODES[] = {
+    { kActionLook,      0, },
+    { kActionOpen,      1, },
+    { kActionMove,      2, },
+    { kActionTake,      3, },
+    { kActionTalk,      4, },
+    { kActionUse,       5, },
+    { kActionWalk,      6, },
+    { kActionInventory, 7, },
+    { kActionTravel,    8, },
+    { kActionOptions,   9, },
+    { kActionSaveLoad,  10 },
+	{ kActionNone, -1 },
+};
+
+const AccessActionCode *AccessEngine::getActionCodes() {
+	switch (getGameID()) {
+	case kGameMartianMemorandum: return MARTIAN_ACTION_CODES;
+	case kGameAmazon: 			 return AMAZON_ACTION_CODES;
+	case kGameNoctropolis: 		 return NOCTROPOLIS_ACTION_CODES;
+	default: error("Unsupported game ID for action codes: %d", getGameID());
+	}
+}
+
 } // End of namespace Access
diff --git a/engines/access/access.h b/engines/access/access.h
index f1efa7b59ee..a7f506d193a 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -81,17 +81,18 @@ enum ACCESSActions : Common::CustomEventType {
 	kActionMoveDownRight,
 	kActionLook,
 	kActionUse,
-	kActionTake,
+	kActionTake,  // aka GET
 	kActionInventory,
 	kActionClimb,
 	kActionTalk,
-	kActionWalk,
+	kActionWalk, // aka GOTO
 	kActionHelp,
 	kActionOpen,
 	kActionMove,
 	kActionTravel,
 	kActionSkip,
 	kActionSaveLoad,
+	kActionOptions,
 };
 
 struct AccessActionCode {
@@ -99,33 +100,6 @@ struct AccessActionCode {
 	int8 _code;
 };
 
-static const AccessActionCode AMAZON_ACTION_CODES[] = {
-	{ kActionLook, 1 },
-	{ kActionUse, 2 },
-	{ kActionTake, 3 },
-	{ kActionInventory, 4 },
-	{ kActionClimb, 5 },
-	{ kActionTalk, 6 },
-	{ kActionWalk, 7 },
-	{ kActionHelp, 8 },
-	{ kActionSaveLoad, -2 },
-	{ kActionNone, -1 },
-};
-
-static const AccessActionCode MARTIAN_ACTION_CODES[] = {
-	{ kActionLook, 0 },
-	{ kActionOpen, 1 },
-	{ kActionMove, 2 },
-	{ kActionTake, 3 },
-	{ kActionUse, 4 },
-	{ kActionWalk, 5 },
-	{ kActionTalk, 6 },
-	{ kActionTravel, 7 },
-	{ kActionHelp, 8 },
-	{ kActionSaveLoad, -2 },
-	{ kActionNone, -1 },
-};
-
 #define ACCESS_SAVEGAME_VERSION 1
 
 struct AccessSavegameHeader {
@@ -185,7 +159,7 @@ protected:
 	* Synchronize savegame data
 	*/
 	virtual Common::Error synchronize(Common::Serializer &s);
-	
+
 	/**
 	 * Create game-specific objects, called just before setupGame.
 	 */
@@ -335,7 +309,7 @@ public:
 	void copyBF2Vid();
 
 	void freeChar();
-	
+
 	virtual int16 getScreenWidth() const { return 320; }
 	virtual int16 getScreenHeight() const { return 200; }
 
@@ -373,6 +347,8 @@ public:
 	static bool readSavegameHeader(Common::InSaveFile *in, AccessSavegameHeader &header, bool skipThumbnail = true);
 
 	bool playMovie(const Common::Path &filename, const Common::Point &pos);
+
+	const AccessActionCode *getActionCodes();
 };
 
 } // End of namespace Access
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 22bd47c9328..eb2a76ae066 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -654,7 +654,7 @@ void Room::doCommands() {
 			mainAreaClick();
 		}
 	} else if (_vm->_events->getAction(action)) {
-		const AccessActionCode *actionCodes = (_vm->getGameID() == kGameMartianMemorandum) ? MARTIAN_ACTION_CODES : AMAZON_ACTION_CODES;
+		const AccessActionCode *actionCodes = _vm->getActionCodes();
 		for (int i = 0; actionCodes[i]._action != kActionNone; ++i) {
 			if (actionCodes[i]._action == action) {
 				handleCommand(actionCodes[i]._code);


Commit: 62404365b08bc7e5999fe50daa7b7a8db9d5d9f0
    https://github.com/scummvm/scummvm/commit/62404365b08bc7e5999fe50daa7b7a8db9d5d9f0
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Various fixes for dialog rendering (still not complete)

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/access/amazon/amazon_room.cpp
    engines/access/amazon/amazon_room.h
    engines/access/bubble_box.cpp
    engines/access/bubble_box.h
    engines/access/martian/martian_room.cpp
    engines/access/martian/martian_room.h
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_resources.h
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/noctropolis/noctropolis_room.h
    engines/access/resources.cpp
    engines/access/resources.h
    engines/access/room.cpp
    engines/access/room.h
    engines/access/screen.cpp
    engines/access/scripts.cpp
    engines/access/scripts.h


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 16cd943df84..e1681de9aea 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -113,6 +113,8 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_pictureTaken = 0;
 
 	_vidEnd = false;
+	_textFlag = false;
+	_exitBox = false;
 
 	_icons = nullptr;
 	_stilScale = 0;
diff --git a/engines/access/access.h b/engines/access/access.h
index a7f506d193a..ca5bee46a9f 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -260,6 +260,8 @@ public:
 	bool _clearSummaryFlag;
 	bool _cheatFl;
 	bool _restartFl;
+	bool _textFlag; // whether subtitles are enabled
+	bool _exitBox; // whether the current hotspot is an exit (Noctropolis only)
 	uint16 _stilScale;
 
 	// Fields mapped into the flags array
diff --git a/engines/access/amazon/amazon_room.cpp b/engines/access/amazon/amazon_room.cpp
index 2988ece95c3..824db8f4ed5 100644
--- a/engines/access/amazon/amazon_room.cpp
+++ b/engines/access/amazon/amazon_room.cpp
@@ -144,7 +144,7 @@ void AmazonRoom::roomMenu() {
 	screen.restoreScreen();
 }
 
-void AmazonRoom::mainAreaClick() {
+void AmazonRoom::mainAreaLClick() {
 	Common::Point &mousePos = _vm->_events->_mousePos;
 	Common::Point pt = _vm->_events->calcRawMouse();
 	Screen &screen = *_vm->_screen;
diff --git a/engines/access/amazon/amazon_room.h b/engines/access/amazon/amazon_room.h
index 31307810edd..8cdfd98e9de 100644
--- a/engines/access/amazon/amazon_room.h
+++ b/engines/access/amazon/amazon_room.h
@@ -46,7 +46,7 @@ protected:
 
 	void setupRoom() override;
 
-	void mainAreaClick() override;
+	void mainAreaLClick() override;
 
 	void clearRoom() override;
 
diff --git a/engines/access/bubble_box.cpp b/engines/access/bubble_box.cpp
index c7b05dbf18b..8a52ec94be8 100644
--- a/engines/access/bubble_box.cpp
+++ b/engines/access/bubble_box.cpp
@@ -160,23 +160,31 @@ void BubbleBox::calcBubble(const Common::String &msg) {
 		if (height >= 0)
 			bounds.setHeight(bounds.height() + 13 - (height % 13));
 	} else {
-		assert(gameType == kGameNoctropolis);/*
-		if (!_bubbleTitle.empty())
+		assert(gameType == kGameNoctropolis);
+		// Don't do the same bounds offset as the other games
+		bounds = Common::Rect(printOrg.x, printOrg.y, printOrg.x, printOrg.y);
+
+		int textHeight = _vm->_fonts.getFont(4)->stringHeight(msg);
+		int textWidth = _vm->_fonts.getFont(4)->stringWidth(msg);
+
+		if (_type & kTextBoxNoctCaption)
 			textHeight += _vm->_fonts.getFont(4)->stringHeight(_bubbleTitle) - 4;
 
-		if (_type & kTextBoxCenter) {
+		if (_type & kTextBoxNoctCenter) {
 			// Center the box
-			boxX -= (textWidth + 27) / 2;
-			boxY -= (textHeight + 23) / 2;
+			bounds.left -= (textWidth + 27) / 2;
+			bounds.top -= (textHeight + 23) / 2;
 		}
 
-		boxWidth = (textWidth + 13) / 16;
-		boxHeight = (textHeight + 13) / 16;
+		bounds.setWidth((textWidth + 13) / 16);
+		bounds.setHeight((textHeight + 13) / 16);
 
-		if (!(flags & kTextBoxPlain)) {
-			boxWidth = MAX<int16>(boxWidth, 3);
-			boxHeight = MAX<int16>(boxHeight, 3);
-		}*/
+		if (!(_type & kTextBoxNoctPlain)) {
+			if (bounds.width() < 3)
+				bounds.setWidth(3);
+			if (bounds.height() < 3)
+				bounds.setHeight(3);
+		}
 	}
 
 	if (bounds.bottom > screen.h)
@@ -269,7 +277,8 @@ void BubbleBox::printBubble_v3(const Common::String &msg) {
 
 	drawBubble(_bubbles.size() - 1);
 
-	Font::_fontColors[1] = 247;
+	Font::_fontColors[1] = 255;
+	Font::_fontColors[0] = 0;
 
 	// Loop through drawing the lines
 	Common::String s = msg;
@@ -288,7 +297,6 @@ void BubbleBox::printBubble_v3(const Common::String &msg) {
 		_vm->_screen->_printOrg.y += 6;
 		_vm->_screen->_printOrg.x = _vm->_screen->_printStart.x;
 	} while (!lastLine);
-
 }
 
 
@@ -313,8 +321,100 @@ void BubbleBox::drawBubble(int index) {
 
 
 void BubbleBox::doBox_v3(int item, int box) {
+	// In practice this is the second half of Noctropolis' DoBox - the first half
+	// was in the noctropolis case part of calcBubble
 	const Font *font = _vm->_fonts.getFont(4);
-	int textWidth = font->stringWidth(_bubbleDisplStr);
+	const SpriteResource *icons = _vm->getIcons();
+	Screen &screen = *_vm->_screen;
+
+	screen.saveScreen();
+	screen.setDisplayScan();
+	//bool saveRect = true; // TODO: decide about this?
+
+	int boxX = _bounds.left;
+	int boxY = _bounds.top;
+	int boxHeight = _bounds.height();
+	int boxWidth = _bounds.width();
+	int fontHeight = font->stringHeight(_bubbleDisplStr);
+
+	// Convert the "draw" size (rows and cols of sprites) to actual pixel size
+	if (_type & kTextBoxNoctPlain)
+		_bounds = Common::Rect(Common::Point(boxX, boxY), boxWidth * 16 + 27, boxHeight * 16 + 20);
+	else
+		_bounds = Common::Rect(Common::Point(boxX - 34, boxY - 43), boxWidth * 16 + 27 + 34, boxHeight * 16 + 20 + 43);
+
+	screen.fillRect(Common::Rect(boxX + 5, boxY + 5, boxX + 5 + boxWidth * 16 + 15, boxY + 5 + boxHeight * 16 + 8), 246);
+
+	if (_type & kTextBoxNoctCaption) {
+		screen.fillRect(Common::Rect(boxX + 5, boxY + 5, boxX + 5 + boxWidth * 16 + 15, boxY + 5 + fontHeight), 236);
+		screen.hLine(boxX + 5, boxY + 5 + fontHeight, boxX + 5 + boxWidth * 16 + 15, 237);
+	}
+
+	int16 drawX = boxX, drawWidth = boxWidth;
+	int16 drawY = boxY, drawHeight = boxHeight;
+
+	if (!(_type & kTextBoxNoctPlain)) {
+		// Draw the Gargoyle
+		screen.plotImage(icons, 1, Common::Point(boxX - 34, boxY - 43));
+		drawX += 61;
+		drawWidth -= 3;
+		drawHeight -= 3;
+	} else {
+		screen.plotImage(icons, 7, Common::Point(boxX, boxY));
+		drawX += 13;
+	}
+
+	for (int i = 0; i < drawWidth; i++) {
+		screen.plotImage(icons, 2, Common::Point(drawX, drawY));
+		drawX += 16;
+	}
+
+	screen.plotImage(icons, 4, Common::Point(drawX, drawY));
+
+	drawY += 10;
+
+	for (int i = 0; i < boxHeight; i++) {
+		screen.plotImage(icons, 3, Common::Point(drawX + 8, drawY));
+		drawY += 16;
+	}
+
+	screen.plotImage(icons, 5, Common::Point(drawX, drawY));
+
+	for (int i = 0; i < boxWidth; i++) {
+		drawX -= 16;
+		screen.plotImage(icons, 2, Common::Point(drawX, drawY + 4));
+	}
+
+	drawX -= 13;
+
+	screen.plotImage(icons, 6, Common::Point(drawX, drawY));
+
+	for (int i = 0; i < drawHeight; i++) {
+		drawY -= 16;
+		screen.plotImage(icons, 3, Common::Point(drawX, drawY));
+	}
+
+	font->_fontColors[0] = 0;
+	if (_type & kTextBoxNoctCaption) {
+		int captionWidth = font->stringWidth(_bubbleTitle);
+		font->_fontColors[1] = 238;
+		font->drawString(&screen, _bubbleTitle, Common::Point(boxX + 14 + (boxWidth * 8) - (captionWidth / 2), boxY + 6));
+		_vm->_screen->_printOrg.x = boxX + 14;
+		_vm->_screen->_printOrg.y = boxY + 6 + fontHeight;
+		//font->_fontColors[1] = 255;
+		//font->drawString(&screen, _bubbleDisplStr, Common::Point(boxX + 14, boxY + 6 + fontHeight));
+	} else {
+		font->_fontColors[1] = 255;
+		font->drawString(&screen, _bubbleDisplStr, Common::Point(boxX + 14, boxY + 10));
+	}
+
+	/*if (boxDimensions) {
+		boxDimensions->x = boxX;
+		boxDimensions->y = boxY;
+		boxDimensions->width = boxWidth;
+		boxDimensions->height = boxHeight;
+	}*/
+	_vm->_screen->restoreScreen();
 }
 
 void BubbleBox::doBox_v2(int item, int box) {
@@ -422,7 +522,6 @@ void BubbleBox::setCursorPos(int posX, int posY) {
 }
 
 void BubbleBox::printString(Common::String msg) {
-
 	if (_vm->_fonts._charSet._hi & 2) {
 		// Draw a shadow for the text
 		Common::Point shadowPt = _vm->_screen->_printOrg + Common::Point(1, 1);
diff --git a/engines/access/bubble_box.h b/engines/access/bubble_box.h
index e2406b1e26a..958de19b9af 100644
--- a/engines/access/bubble_box.h
+++ b/engines/access/bubble_box.h
@@ -35,7 +35,16 @@ namespace Access {
 
 class AccessEngine;
 
-enum BoxType { TYPE_0 = 0, TYPE_1 = 1, TYPE_2 = 2, TYPE_3 = 3, kBoxTypeFileDialog = 4 };
+enum BoxType {
+	TYPE_0 = 0,
+	TYPE_1 = 1,
+	TYPE_2 = 2,
+	TYPE_3 = 3,
+	kBoxTypeFileDialog = 4,
+	kTextBoxNoctPlain = 1,
+	kTextBoxNoctCaption = 2,
+	kTextBoxNoctCenter = 4,
+};
 
 class BubbleBox : public Manager {
 private:
diff --git a/engines/access/martian/martian_room.cpp b/engines/access/martian/martian_room.cpp
index 357c7ed61b8..35397b43b56 100644
--- a/engines/access/martian/martian_room.cpp
+++ b/engines/access/martian/martian_room.cpp
@@ -109,7 +109,7 @@ void MartianRoom::roomMenu() {
 	_vm->_screen->restoreScreen();
 }
 
-void MartianRoom::mainAreaClick() {
+void MartianRoom::mainAreaLClick() {
 	Common::Point &mousePos = _vm->_events->_mousePos;
 	Common::Point pt = _vm->_events->calcRawMouse();
 	Screen &screen = *_vm->_screen;
diff --git a/engines/access/martian/martian_room.h b/engines/access/martian/martian_room.h
index ad890601886..c110b498787 100644
--- a/engines/access/martian/martian_room.h
+++ b/engines/access/martian/martian_room.h
@@ -44,7 +44,7 @@ protected:
 
 	void reloadRoom1() override;
 
-	void mainAreaClick() override;
+	void mainAreaLClick() override;
 public:
 	MartianRoom(AccessEngine *vm);
 
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 1d341843e44..6ce11912063 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -79,7 +79,7 @@ void NoctropolisEngine::initVariables() {
 	_player->_playerX = _player->_rawPlayer.x = _player->_moveTo.x = 280;
 	_player->_playerY = _player->_rawPlayer.y = _player->_moveTo.y = 390;
 	_room->_selectCommand = -1;
-	_events->setNormalCursor(CURSOR_CROSSHAIRS);
+	_events->setNormalCursor(CURSOR_ARROW);
 	_mouseMode = 0;
 	_animation->clearTimers();
 }
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 833d88d6511..b4114ac114b 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -28,6 +28,17 @@ namespace Access {
 
 namespace Noctropolis {
 
+const byte ICON_PALETTE[] = {
+	// List sorted from hard-coded instructions in SetIconPal
+	0x4f, 0x24, 0, 0xc1, 100, 2, 0xff, 0xc1, 0, 0,
+	0x46, 0xff, 0, 0x11, 0xc1, 0, 0, 0x82, 0, 0xba,
+	0, 0, 0x60, 0, 0xff, 0, 0, 0x8c, 0, 0,
+	0, 0, 0, 0x23, 0x23, 0x23, 0x3d, 0x3d, 0x3d, 0x57,
+	0x57, 0x57, 0x71, 0x71, 0x71, 0x8b, 0x8b, 0x8b, 0xa5, 0xa5,
+	0xa5, 0xbf, 0xbf, 0xbf, 0xd9, 0xd9, 0xd9, 0xfc, 0xfc, 0xfc,
+};
+
+
 // The original game has 4 files after a bunch of nullptrs.
 // We add them separately to make this file a little smaller.
 static const char *NOCT_FILES_1[] = {
@@ -1843,6 +1854,90 @@ const byte *NoctropolisResources::getCursor(int num) const {
 	}
 }
 
+static const char *const NOCT_GENERAL_MESSAGES_EN[] = {
+	"Looking there reveals nothing of interest.",
+	"That doesn't open.",
+	"That won't move.",
+	"You can't take that.",
+	"There seems to be no response.",
+	"That doesn't seem to work.",
+	"You can't go there.",
+	"That doesn't seem to work.",
+	"That doesn't seem to work.",
+	"That doesn't seem to work.",
+};
+
+static const char *const NOCT_GENERAL_MESSAGES_FR[] = {
+	"Vous ne d\x82""couvrez rien d'int\x82""ressant.",
+	"\x80""a ne s'ouvre pas.",
+	"\x80""a ne bouge pas.",
+	"Vous ne pouvez pas prendre \x87""a.",
+	"Vous n'obtenez aucune r\x82""ponse.",
+	"\x80""a ne marche pas.",
+	"Vous ne pouvez pas aller l\x85.",
+	"\x80""a ne marche pas.",
+	"\x80""a ne marche pas.",
+	"\x80""a ne marche pas.",
+};
+
+static const char *const NOCT_GENERAL_MESSAGES_ES[] = {
+	"No descubres nada de interes.",
+	"No se abre.",
+	"No se mueve.",
+	"No puedes coger eso.",
+	"No hay respuesta.",
+	"Eso no funciona.",
+	"No puedes ir ahi.",
+	"Eso no funciona.",
+	"Eso no funciona.",
+	"Eso no funciona.",
+};
+
+static const char *const NOCT_GENERAL_MESSAGES_DE[] = {
+	"Dieser Anblick zeigt nichts Interessantes.",
+	"Das l\x84\xe1t sich nicht \x94""ffnen.",
+	"Bewegt sich keinen Millimeter.",
+	"Das kannst Du nicht mitnehmen.",
+	"Offensichtlich erh\x84ltst Du keine Antwort.",
+	"Das scheint nicht zu funktionieren.",
+	"Dahin kannst Du nicht gehen.",
+	"Das scheint nicht zu funktionieren.",
+	"Das scheint nicht zu funktionieren.",
+	"Das scheint nicht zu funktionieren.",
+};
+
+const char *NoctropolisResources::getGeneralMessage(int command) const {
+	if (command < 0 || command >= ARRAYSIZE(NOCT_GENERAL_MESSAGES_EN))
+		error("No general message for command %d", command);
+	switch (_vm->getLanguage()) {
+	case Common::EN_ANY: return NOCT_GENERAL_MESSAGES_EN[command];
+	case Common::FR_FRA: return NOCT_GENERAL_MESSAGES_FR[command];
+	case Common::ES_ESP: return NOCT_GENERAL_MESSAGES_ES[command];
+	case Common::DE_DEU: return NOCT_GENERAL_MESSAGES_DE[command];
+	default: error("Unsupported language for general message");
+	}
+}
+
+const char *NoctropolisResources::getEndMessage() const {
+	switch (_vm->getLanguage()) {
+	case Common::EN_ANY: return "Don't look at me, you're the city's new champion.";
+	case Common::FR_FRA: return "Ne me regardez pas. C'est vous le nouveau\nchampion de la ville.";
+	case Common::ES_ESP: return "No me mires. Eres tu el nuevo campeon.";
+	case Common::DE_DEU: return "Schau mich nicht an, du bist der neue Held der Stadt.";
+	default: error("Unsupported language for end message");
+	}
+}
+
+const char *NoctropolisResources::getStilEndMessage() const {
+	switch (_vm->getLanguage()) {
+	case Common::EN_ANY: return "Don't worry about me, Peter. You know I'll\nsupport whatever you've got planned.";
+	case Common::FR_FRA: return "Ne vous inqui\x82tez pas pour moi, Peter. Vous\nsavez que je supporterai tous vos plans.";
+	case Common::ES_ESP: return "No te preocupes por mi, Peter. Te ayudare\nen cualquier cosa que intentes.";
+	case Common::DE_DEU: return "K\x81mmer' dich nicht um mich, Peter. Du wei\xe1t, ich\nunterst\x81tze dich bei allem, was du vorhast.";
+	default: error("Unsupported language for stil end message");
+	}
+}
+
 
 } // end namespace Noctropolis
 
diff --git a/engines/access/noctropolis/noctropolis_resources.h b/engines/access/noctropolis/noctropolis_resources.h
index c38c10ac059..888068e2152 100644
--- a/engines/access/noctropolis/noctropolis_resources.h
+++ b/engines/access/noctropolis/noctropolis_resources.h
@@ -32,6 +32,8 @@ namespace Noctropolis {
 
 class NoctropolisEngine;
 
+extern const byte ICON_PALETTE[];
+
 class NoctropolisResources : public Resources {
 public:
 	NoctropolisResources(AccessEngine *_vm);
@@ -47,6 +49,11 @@ public:
 	int getCursorWidth(int num) const override;
 	int getCursorHeight(int num) const override;
 
+	const char *getGeneralMessage(int command) const override;
+
+	const char *getEndMessage() const;
+	const char *getStilEndMessage() const;
+
 private:
 	Font *_fontChaleteu;
 	Font *_fontSystemeu;
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 0e1e4d351cf..7890184373e 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -19,6 +19,9 @@
  *
  */
 
+#include "common/scummsys.h"
+
+#include "access/noctropolis/noctropolis_game.h"
 #include "access/noctropolis/noctropolis_room.h"
 #include "access/noctropolis/noctropolis_player.h"
 #include "access/access.h"
@@ -32,7 +35,7 @@ NoctropolisRoom::NoctropolisRoom(AccessEngine *vm): Room(vm) {
 
 void NoctropolisRoom::reloadRoom() {
 	loadRoom(_vm->_player->_roomNumber);
-	
+
 	// This is LoadPlayer1
 	int subFileBase = 1;
 	int numSubFiles;
@@ -56,7 +59,7 @@ void NoctropolisRoom::reloadRoom() {
 		objBase = 115;
 		fileNum = 0xfc;
 	}
-	
+
 	_vm->_player->loadNoctPalette(fileNum, _palIntensity + 6);
 	((NoctropolisPlayer *)_vm->_player)->loadAnimation(fileNum, 0);
 
@@ -64,7 +67,7 @@ void NoctropolisRoom::reloadRoom() {
 		Resource *data = _vm->_files->loadFile(fileNum, i);
 		_vm->_objectsTable[objBase + i - subFileBase] = new SpriteResource(_vm, data);
 	}
-	
+
 	reloadRoom1();
 }
 
@@ -133,7 +136,7 @@ void NoctropolisRoom::buildColumnXScroll(int playX, int screenX) {
 		xo = -screenX;
 		screenX = 0;
 	}
-	
+
 	if (colWidth <= xo)
 		return;
 
@@ -152,15 +155,165 @@ void NoctropolisRoom::buildColumnXScroll(int playX, int screenX) {
 	}
 }
 
-void NoctropolisRoom::mainAreaClick() {
-	//Common::Point &mousePos = _vm->_events->_mousePos;
-	Common::Point pt = _vm->_events->calcRawMouse();
-	//Screen &screen = *_vm->_screen;
-	Player &player = *_vm->_player;
+void NoctropolisRoom::doCommands() {
+	// aka NoctDoCommandLoop::ticker
+
+	if (_vm->_events->_interfaceOff) {
+		_vm->_events->setCursor(CURSOR_DARK_ANKH);
+	} else {
+		if (_vm->_events->_rightButton) {
+			_vm->_events->debounceRight();
+			roomMenu();
+		}
+
+		// TODO: Check keyboard commands
+		Common::Point pt = _vm->_events->calcRawMouse();
+		int hotspotIndex = -1;
+
+		_vm->_exitBox = false;
+
+		if (_selectCommand != 1 && _selectCommand != 2 &&
+			_selectCommand != 3 && _selectCommand != 5 &&
+			_selectCommand != 6) {
+			hotspotIndex = checkPlayerBox(pt);
+			// Mouse is at the player or Stiletto, check what the script says
+			if (hotspotIndex >= 0 && !(validateBox(hotspotIndex) & 0x80))
+				hotspotIndex = -1;
+		}
+
+		if (hotspotIndex < 0) {
+			hotspotIndex = checkBoxes1(pt);
+			while (hotspotIndex >= 0 && !(validateBox(hotspotIndex) & 0x80))
+				hotspotIndex = checkBoxes2(pt, hotspotIndex + 1, 0);
+		}
+
+		if (hotspotIndex >= 0) {
+			if (_vm->_exitBox)
+				_vm->_events->setCursor(CURSOR_HELP);
+			else if (_selectCommand <= 6)
+				_vm->_events->setCursor((CursorType)(_selectCommand + 2));
+			else
+				_vm->_events->setCursor(CURSOR_ARROW);
+
+			if (_vm->_events->_leftButton) {
+				_vm->_events->debounceLeft();
+				// Double-clicking on something selects the goto command
+				uint32 endTicks = g_system->getMillis() + 100;
+				while (g_system->getMillis() < endTicks) {
+					_vm->_events->pollEvents();
+					if (_vm->_events->_leftButton) {
+						_selectCommand = 1;
+						break;
+					}
+				}
+				// Also the script can force a goto command
+				if (_vm->_exitBox)
+					_selectCommand = 3;
+				_vm->_events->debounceLeft();
+				if (_selectCommand >= 0) {
+					_conFlag = true;
+					while (_conFlag && !_vm->shouldQuitOrRestart()) {
+						_conFlag = false;
+						_vm->_scripts->executeScript();
+					}
+				}
+			}
+		} else {
+			_vm->_exitBox = false;
+			_vm->_events->setCursor(CURSOR_ARROW);
+		}
+
+	}
+}
+
+
+int NoctropolisRoom::checkPlayerBox(const Common::Point &pt) {
+	if (!_vm->_player->_playerOff) {
+		_vm->_player->calcManScale();
+		if (_vm->_player->_rawPlayer.x <= pt.x) {
+			byte bVar1 = _roomFlag >> 2 & 1;
+			long lVar3 = 200;
+			if (bVar1 != 0) {
+				lVar3 = 6;
+			}
+			long lVar2 = 0x3c;
+			if (bVar1 != 0) {
+				lVar2 = 6;
+			}
+			if (((pt.y <= _vm->_player->_rawPlayer.y) && ((_vm->_player->_rawPlayer.y - _vm->_screen->_scaleTable1[lVar3]) <= pt.y)) &&
+				(pt.x <= (_vm->_player->_rawPlayer.x + _vm->_screen->_scaleTable1[lVar2]))) {
+				_plotter._blockIn = 99;
+				return 0;
+			}
+		}
+	}
+
+	if (_vm->_flags[0xcd] == 1 || (_roomFlag & 2) == 0 || _vm->_flags[0xea] != 2)
+		return 1;
+
+	Player *stil = ((NoctropolisEngine *)_vm)->_stil;
+
+	if (stil->_playerOff != 0)
+		return 1;
+
+	_vm->_scale = _vm->_stilScale;
+	if (_vm->_stilScale == 0) {
+		_vm->_scale = (_vm->_scaleI *
+						(((_vm->_scaleH2 << 8) +
+						  _vm->_scaleT1 *
+						  (_vm->_scaleN1 + (stil->_rawPlayer.y - _vm->_scaleMaxY)) & 0xff00)
+						 / (uint)_vm->_scaleH1) >> 8);
+	}
+	_vm->_screen->setScaleTable(_vm->_scale);
+	_vm->_player->_playerOffset.y = _vm->_screen->_scaleTable1[180];
+	_vm->_player->_playerOffset.x = _vm->_screen->_scaleTable1[60];
+	if (pt.x < stil->_rawPlayer.x || stil->_rawPlayer.y < pt.y)
+		return 1;
+
+	if ((stil->_rawPlayer.y - _vm->_player->_playerOffset.y) <= pt.y && (pt.x <= (_vm->_player->_playerOffset.x + stil->_rawPlayer.x))) {
+		_plotter._blockIn = 98;
+		return 0;
+	}
+	return 1;
+}
+
+
+void NoctropolisRoom::mainAreaLClick() {
+	const Common::Point &mousePos = _vm->_events->_mousePos;
+	const Common::Point pt = _vm->_events->calcRawMouse();
+	const Screen &screen = *_vm->_screen;
 
 	// TODO: For now just add a move-to point for the player.
-	player._moveTo = pt;
-	player._playerMove = true;
+	//Player &player = *_vm->_player;
+	//player._moveTo = pt;
+	//player._playerMove = true;
+
+	//if (_selectCommand == -1) {
+	//	player._moveTo = pt;
+	//	player._playerMove = true;
+	/*} else {*/
+	if (mousePos.x >= screen._windowXAdd &&
+		mousePos.x <= (screen._windowXAdd + screen._vWindowBytesWide) &&
+		mousePos.y >= screen._windowYAdd &&
+		mousePos.y <= (screen._windowYAdd + screen._vWindowLinesTall)) {
+			if (checkBoxes1(pt) >= 0) {
+				checkBoxes3();
+			}
+	}
+}
+
+int NoctropolisRoom::validateBox(int boxId) {
+	int result = Room::validateBox(boxId);
+
+	if (_vm->_player->_roomNumber == 54) {
+		_vm->_scripts->_continuenceType = 1;
+	}
+	return result;
+}
+
+
+void NoctropolisRoom::roomMenu() {
+	warning("TODO: Implement NoctropolisRoom::RoomMenu (see gRoomMenuLoop?)");
 }
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_room.h b/engines/access/noctropolis/noctropolis_room.h
index 8b14a5d3bea..5e4239dc8d6 100644
--- a/engines/access/noctropolis/noctropolis_room.h
+++ b/engines/access/noctropolis/noctropolis_room.h
@@ -32,7 +32,7 @@ class NoctropolisRoom : public Room {
 public:
 	NoctropolisRoom(AccessEngine *vm);
 
-	void roomMenu() override {};
+	void roomMenu() override;
 
 	void init4Quads() override {};
 
@@ -43,15 +43,21 @@ public:
 
 protected:
 	void reloadRoom() override;
-	
+
 	void reloadRoom1() override;
 
-	void mainAreaClick() override;
+	void mainAreaLClick() override;
+
+	void doCommands() override;
+
+	int validateBox(int boxId) override;
 
 private:
 	// Like buildColumn but can handle negative playX.
 	// TODO: Can we just replace Room::buildColumn with this one?
 	void buildColumnXScroll(int playX, int screenX);
+
+	int checkPlayerBox(const Common::Point &pt);
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/resources.cpp b/engines/access/resources.cpp
index c7e9176aee3..4c7dbaa60c4 100644
--- a/engines/access/resources.cpp
+++ b/engines/access/resources.cpp
@@ -165,30 +165,7 @@ uint Resources::findEntry(byte gameId, byte discType, byte demoType, Common::Lan
 	error("Could not locate appropriate access.dat entry");
 }
 
-/*------------------------------------------------------------------------*/
-
-const byte INITIAL_PALETTE[18 * 3] = {
-	0x00, 0x00, 0x00,
-	0xff, 0xff, 0xff,
-	0xf0, 0xf0, 0xf0,
-	0xe0, 0xe0, 0xe0,
-	0xd0, 0xd0, 0xd0,
-	0xc0, 0xc0, 0xc0,
-	0xb0, 0xb0, 0xb0,
-	0xa0, 0xa0, 0xa0,
-	0x90, 0x90, 0x90,
-	0x80, 0x80, 0x80,
-	0x70, 0x70, 0x70,
-	0x60, 0x60, 0x60,
-	0x50, 0x50, 0x50,
-	0x40, 0x40, 0x40,
-	0x30, 0x30, 0x30,
-	0x20, 0x20, 0x20,
-	0x10, 0x10, 0x10,
-	0x00, 0x00, 0x00
-};
-
-const char *const GENERAL_MESSAGES[] = {
+static const char *const GENERAL_MESSAGES[] = {
 	"LOOKING THERE REVEALS NOTHING OF INTEREST.", // LOOK_MESSAGE
 	"THAT DOESN'T OPEN.",               // OPEN_MESSAGE
 	"THAT WON'T MOVE.",                 // MOVE_MESSAGE
@@ -201,7 +178,7 @@ const char *const GENERAL_MESSAGES[] = {
 	"THAT DOESN'T SEEM TO WORK."        // USE_MESSAGE
 };
 
-const char *const ESP_GENERAL_MESSAGES[] = {
+static const char *const ESP_GENERAL_MESSAGES[] = {
 	"MIRANDO AHI NO ENCONTRARAS NADA DE INTERES.", // LOOK_MESSAGE
 	"NO ESTA ABIERTO.",                 // OPEN_MESSAGE
 	"NO PUEDES MOVERLO.",               // MOVE_MESSAGE
@@ -214,6 +191,36 @@ const char *const ESP_GENERAL_MESSAGES[] = {
 	"NO PARECE QUE FUNCIONE."           // USE_MESSAGE
 };
 
+const char *Resources::getGeneralMessage(int command) const {
+	if (_vm->getLanguage() == Common::ES_ESP)
+		return ESP_GENERAL_MESSAGES[command];
+	else
+		return GENERAL_MESSAGES[command];
+}
+
+/*------------------------------------------------------------------------*/
+
+const byte INITIAL_PALETTE[18 * 3] = {
+	0x00, 0x00, 0x00,
+	0xff, 0xff, 0xff,
+	0xf0, 0xf0, 0xf0,
+	0xe0, 0xe0, 0xe0,
+	0xd0, 0xd0, 0xd0,
+	0xc0, 0xc0, 0xc0,
+	0xb0, 0xb0, 0xb0,
+	0xa0, 0xa0, 0xa0,
+	0x90, 0x90, 0x90,
+	0x80, 0x80, 0x80,
+	0x70, 0x70, 0x70,
+	0x60, 0x60, 0x60,
+	0x50, 0x50, 0x50,
+	0x40, 0x40, 0x40,
+	0x30, 0x30, 0x30,
+	0x20, 0x20, 0x20,
+	0x10, 0x10, 0x10,
+	0x00, 0x00, 0x00
+};
+
 const int INVCOORDS[][4] = {
 	{ 23, 68, 15, 49 },
 	{ 69, 114, 15, 49 },
diff --git a/engines/access/resources.h b/engines/access/resources.h
index 41377cad626..35d4390574b 100644
--- a/engines/access/resources.h
+++ b/engines/access/resources.h
@@ -34,9 +34,6 @@ namespace Access {
 
 extern const byte INITIAL_PALETTE[18 * 3];
 
-extern const char *const GENERAL_MESSAGES[];
-extern const char *const ESP_GENERAL_MESSAGES[];
-
 extern const int INVCOORDS[][4];
 
 class AccessEngine;
@@ -125,6 +122,13 @@ public:
 	 * or -1 if no button range matches.
 	 */
 	virtual int inButtonXRange(int x) const = 0;
+
+	/**
+	 * Get the generic failure message for a command,
+	 * eg "THAT DOESN'T OPEN.".  Messages will be localized
+	 * as appropriate.
+	 */
+	virtual const char *getGeneralMessage(int command) const;
 };
 
 } // End of namespace Access
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index eb2a76ae066..762e02f499e 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -276,7 +276,7 @@ void Room::doRoom() {
 
 void Room::roomInit() {
 	_vm->_animation->clearTimers();
-	_vm->_scripts->_continuenceFlag = false;
+	_conFlag = false;
 	_vm->_scripts->_continuenceType = 0;
 	_vm->_scripts->_sequence = INIT_ROOM_SCRIPT;
 	_vm->_scripts->searchForSequence();
@@ -380,7 +380,7 @@ void Room::loadRoomData(const byte *roomData) {
 
 void Room::roomLoop() {
 	_vm->_scripts->_continuenceType = 1;
-	_vm->_scripts->_continuenceFlag = false;
+	_conFlag = false;
 	_vm->_scripts->_sequence = ROOM_SCRIPT;
 	_vm->_scripts->searchForSequence();
 	_vm->_scripts->executeScript();
@@ -651,8 +651,10 @@ void Room::doCommands() {
 
 		} else {
 			// Mouse click in main game area
-			mainAreaClick();
+			mainAreaLClick();
 		}
+	} else if (_vm->_events->_rightButton) {
+		mainAreaRClick();
 	} else if (_vm->_events->getAction(action)) {
 		const AccessActionCode *actionCodes = _vm->getActionCodes();
 		for (int i = 0; actionCodes[i]._action != kActionNone; ++i) {
@@ -789,7 +791,8 @@ void Room::executeCommand(int commandId) {
 		}
 	} else {
 		assert(_vm->getGameID() == kGameNoctropolis);
-		warning("TODO: implement executeCommand for Noctropolis");
+		error("TODO: implement executeCommand for Noctropolis");
+		// See the code in NoctRoomEngine::afterDoCommandsTick
 	}
 	screen.saveScreen();
 	screen.setDisplayScan();
diff --git a/engines/access/room.h b/engines/access/room.h
index 4a84d86b00c..50d72736a4c 100644
--- a/engines/access/room.h
+++ b/engines/access/room.h
@@ -103,7 +103,7 @@ protected:
 	int checkBoxes2(const Common::Point &pt, int start, int count);
 	void checkBoxes3();
 
-	int validateBox(int boxId);
+	virtual int validateBox(int boxId);
 
 	/**
 	 * Inner handler for switching to a given command mode
@@ -122,7 +122,9 @@ protected:
 
 	virtual void doCommands();
 
-	virtual void mainAreaClick() = 0;
+	virtual void mainAreaLClick() = 0;
+
+	virtual void mainAreaRClick() {};
 
 	virtual void walkCursor();
 public:
@@ -137,7 +139,7 @@ public:
 	int _playFieldHeight;
 	byte *_tile;
 	int _selectCommand;
-	bool _conFlag;
+	bool _conFlag; // aka _continuenceFlag
 	int _rMouse[10][2];
 public:
 	Room(AccessEngine *vm);
diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp
index 869286efa10..1f1f3217ebd 100644
--- a/engines/access/screen.cpp
+++ b/engines/access/screen.cpp
@@ -30,6 +30,7 @@
 #include "access/screen.h"
 #include "access/resources.h"
 #include "access/martian/martian_resources.h"
+#include "access/noctropolis/noctropolis_resources.h"
 
 
 // for frame contents debugging
@@ -143,6 +144,10 @@ void Screen::setIconPalette() {
 		for (int i = 0; i < 0x1B; i++) {
 			_rawPalette[741 + i] = PALETTE_6BIT_TO_8BIT(Martian::ICON_PALETTE[i]);
 		}
+	} else if (_vm->getGameID() == kGameNoctropolis) {
+		for (int i = 0; i < 60; i++) {
+			_rawPalette[708 + i] = Noctropolis::ICON_PALETTE[i];
+		}
 	}
 }
 
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index e2ec005d46f..1038400bcfe 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -25,6 +25,7 @@
 #include "access/scripts.h"
 #include "access/martian/martian_resources.h"
 #include "access/noctropolis/noctropolis_game.h"
+#include "access/noctropolis/noctropolis_resources.h"
 
 namespace Access {
 
@@ -35,7 +36,6 @@ Scripts::Scripts(AccessEngine *vm) : Manager(vm) {
 	_sequence = 0;
 	_endFlag = false;
 	_continuenceType = 0;
-	_continuenceFlag = false;
 	_returnCode = 0;
 	_scriptCommand = 0;
 	_choice = 0;
@@ -140,6 +140,8 @@ void Scripts::setOpcodes_v2() {
 }
 
 void Scripts::setOpcodes_v3() {
+	// Modify command list for Noctropolis
+	COMMAND_LIST[1] = &Scripts::cmdEndObject_v3;
 	COMMAND_LIST[18] = &Scripts::cmdSetCoords;
 	COMMAND_LIST[34] = &Scripts::cmdSetVideo_v3;
 	COMMAND_LIST[50] = &Scripts::cmdCharSpeak_v3;
@@ -308,11 +310,7 @@ void Scripts::cmdObject() {
 }
 
 void Scripts::cmdEndObject() {
-	const char *msg;
-	if (_vm->getLanguage() == Common::ES_ESP)
-		msg = ESP_GENERAL_MESSAGES[_vm->_room->_selectCommand];
-	else
-		msg = GENERAL_MESSAGES[_vm->_room->_selectCommand];
+	const char *msg = _vm->_res->getGeneralMessage(_vm->_room->_selectCommand);
 	debugC(1, kDebugScripts, "cmdEndObject(msg=\"%s\")", msg);
 	if (_vm->getGameID() == kGameMartianMemorandum)
 		doCmdPrint_v1(msg);
@@ -320,6 +318,50 @@ void Scripts::cmdEndObject() {
 		printString(msg);
 }
 
+
+void Scripts::cmdEndObject_v3() {
+	if (_vm->_room->_selectCommand == 4 && _vm->_boxSelectY == 0x62) {
+		Noctropolis::NoctropolisResources *res = (Noctropolis::NoctropolisResources *)_vm->_res;
+		const char *vidfile = "DARK/VID/A4IN00.VID";
+		if (_vm->_flags[91] == 2) {
+			vidfile = "DARK/VID/A4IN26.VID";
+		}
+
+		if (_vm->_textFlag) {
+			const char *subtitle = res->getEndMessage();
+			if (_vm->_flags[91] == 2) {
+				subtitle = res->getStilEndMessage();
+			}
+			//NoctRoomEngine::setBoxInfo(&_gNoctRoomEngine,0x46,0xcd,"STILETTO",subtitle,3);
+		}
+		error("TODO: Finish the special case for cmdEndObject_v3");
+		/*
+		// duck the sound here.. SetRelVolume(0x32);
+		_vm->setRoomVideo(100,100,vidfile,true,false);
+		gNoctRoomVideo.videoEnd = 0;
+		gNoctRoomVideo.field27_0x2a = 0;
+		gNoctRoomVideo.playState = 1;
+		gNoctRoomVideo.field28_0x2b = 1;
+		gNoctRoomVideo.field25_0x28 = 1;
+		NoctRoomEngine::playRoomVideo(&_gNoctRoomEngine,(bool *)&gNoctRoomVideo.videoEnd);
+		gNoctRoomVideo.playState = 2;
+		NoctRoomSubEngine::acceptControl((NoctRoomSubEngine *)&gNoctRoomVideo);
+		*/
+	} else {
+		const char *msg = _vm->_res->getGeneralMessage(_vm->_room->_selectCommand);
+		debugC(1, kDebugScripts, "cmdEndObject_v3(msg=\"%s\")", msg);
+
+		_vm->_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctCenter);
+		if (_vm->_player->_roomNumber <= 4)
+          _vm->_bubbleBox->_type = (BoxType)(_vm->_bubbleBox->_type | kTextBoxNoctPlain);
+
+		printString(msg);
+	}
+	_vm->_room->_conFlag = true;
+	_endFlag = true;
+	_returnCode = 0;
+}
+
 void Scripts::cmdJumpLook() {
 	debugCN(1, kDebugScripts, "cmdJumpLook(selectCommand=%d)", _vm->_room->_selectCommand);
 	if (_vm->_room->_selectCommand == 0) {
@@ -428,12 +470,16 @@ void Scripts::cmdPrint_v1() {
 }
 
 void Scripts::printString(const Common::String &msg) {
-	if (_vm->getGameID() != kGameMartianMemorandum) {
-		_vm->_screen->_printOrg = Common::Point(20, 42);
-		_vm->_screen->_printStart = Common::Point(20, 42);
+	if (_vm->getGameID() == kGameNoctropolis) {
+		_vm->_screen->_printOrg = _vm->_screen->_printStart = Common::Point(320, 200);
 		_vm->_timers[PRINT_TIMER]._timer = 50;
 		_vm->_timers[PRINT_TIMER]._initTm = 50;
 		++_vm->_timers[PRINT_TIMER]._flag;
+	} else if (_vm->getGameID() != kGameMartianMemorandum) {
+		_vm->_screen->_printOrg = _vm->_screen->_printStart = Common::Point(20, 42);
+		_vm->_timers[PRINT_TIMER]._timer = 1;
+		_vm->_timers[PRINT_TIMER]._initTm = 1;
+		++_vm->_timers[PRINT_TIMER]._flag;
 	}
 
 	// Display the text in a bubble, and wait for a keypress or mouse click
@@ -1068,7 +1114,7 @@ void Scripts::cmdPlayerSpeak() {
 	_vm->_bubbleBox->_bubbleTitle = title;
 
 	_vm->_bubbleBox->placeBubble(str);
-	_continuenceFlag = 1;
+	_vm->_room->_conFlag = true;
 	findNull();
 	warning("TODO: Check rendering for cmdPlayerSpeak() box");
 }
@@ -1387,7 +1433,7 @@ void Scripts::cmdEndVideo() {
 
 void Scripts::cmdDigitalPlay() {
 	error("TODO: Implement Scripts::cmdDigitalPlay");
-	_continuenceFlag = true;
+	_vm->_room->_conFlag = true;
 }
 
 void Scripts::cmdFillSound() {
@@ -1401,12 +1447,12 @@ void Scripts::cmdFillSound() {
 			break;
 		}
 	}
-	_continuenceFlag = true;
+	_vm->_room->_conFlag = true;
 }
 
 void Scripts::cmdPlayVid1() {
 	error("TODO: Implement Scripts::cmdPlayVid1");
-	_continuenceFlag = true;
+	_vm->_room->_conFlag = true;
 }
 
 void Scripts::cmdCharWait() {
@@ -1534,10 +1580,9 @@ void Scripts::cmdStilOn() {
 
 void Scripts::cmdReturnExit() {
 	debugCN(1, kDebugScripts, "cmdReturnExit()");
-	//_vm->_exitBox = true; -- work out what to do with this.
+	_vm->_exitBox = true;
 	_endFlag = true;
 	_returnCode = 0;
-	error("TODO: Implement Scripts::cmdReturnExit");
 }
 
 void Scripts::cmdSetCoords() {
diff --git a/engines/access/scripts.h b/engines/access/scripts.h
index e82941357cc..8946443cd86 100644
--- a/engines/access/scripts.h
+++ b/engines/access/scripts.h
@@ -58,6 +58,7 @@ protected:
 
 	void cmdObject();
 	void cmdEndObject();
+	void cmdEndObject_v3();
 	void cmdJumpLook();
 	void cmdJumpOpen();
 	void cmdJumpHelp();
@@ -181,7 +182,6 @@ public:
 	int32 _choiceStart;
 	Common::Point _charsOrg, _texsOrg;
 
-	bool _continuenceFlag; // only used in Noctropolis
 	int _continuenceType;  // only used in Noctropolis
 
 public:


Commit: f3ef8730d96e535e666fa4f3237688f2750813d2
    https://github.com/scummvm/scummvm/commit/f3ef8730d96e535e666fa4f3237688f2750813d2
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Further progress on noctropolis

* Menu mostly works now
* Actions are working
* Dialog rendering fixed a bit more

Changed paths:
    engines/access/access.h
    engines/access/animation.cpp
    engines/access/asurface.cpp
    engines/access/bubble_box.cpp
    engines/access/events.cpp
    engines/access/events.h
    engines/access/font.cpp
    engines/access/font.h
    engines/access/noctropolis/noctropolis_comicviewer.h
    engines/access/noctropolis/noctropolis_game.h
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_resources.h
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/noctropolis/noctropolis_room.h
    engines/access/noctropolis/noctropolis_scripts.cpp
    engines/access/noctropolis/noctropolis_scripts.h
    engines/access/polygon.h
    engines/access/room.cpp
    engines/access/room.h
    engines/access/scripts.cpp
    engines/access/scripts.h


diff --git a/engines/access/access.h b/engines/access/access.h
index ca5bee46a9f..8f6ab8f99ba 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -95,6 +95,32 @@ enum ACCESSActions : Common::CustomEventType {
 	kActionOptions,
 };
 
+/* These are the commands for MM. Noctropolis uses different numbers */
+enum MartianCommands {
+	kMartianCmdLook = 0,
+	kMartianCmdOpen = 1,
+	kMartianCmdMove = 2,
+	kMartianCmdGetTake = 3,
+	kMartianCmdUse = 4,
+	kMartianCmdGoto = 5, // aka walk-to
+	kMartianCmdTalk = 6,
+};
+
+
+/* These are the commands for MM and Amazon. Noctropolis uses different numbers */
+enum AmazonCommands {
+	kAmazonCmdLook = 0,
+	kAmazonCmdOpen = 1,
+	kAmazonCmdMove = 2,
+	kAmazonCmdGetTake = 3,
+	kAmazonCmdUse = 4,
+	kAmazonCmdGoto = 5, // aka walk-to
+	kAmazonCmdTalk = 6,
+	kAmazonCmdWalkToCursor = 7,
+	kAmazonCmdHelp = 8,
+};
+
+
 struct AccessActionCode {
 	ACCESSActions _action;
 	int8 _code;
diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index f5847229765..6c0f7e49d1e 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -213,7 +213,7 @@ void Animation::anim7() {
 
 void Animation::anim8() {
 	// TODO: In here be careful with whether we are using playerX or raw.x
-	debug("TODO: Animation::anim8");
+	//debug("TODO: Animation::anim8");
 }
 
 void Animation::anim9() {
diff --git a/engines/access/asurface.cpp b/engines/access/asurface.cpp
index 15c439c78aa..08658f99c93 100644
--- a/engines/access/asurface.cpp
+++ b/engines/access/asurface.cpp
@@ -185,7 +185,7 @@ void BaseSurface::saveBlock(const Common::Rect &bounds) {
 	_savedBounds.clip(Common::Rect(0, 0, this->w, this->h));
 
 	_savedBlock.free();
-	_savedBlock.create(bounds.width(), bounds.height(),
+	_savedBlock.create(_savedBounds.width(), _savedBounds.height(),
 		Graphics::PixelFormat::createFormatCLUT8());
 	_savedBlock.copyRectToSurface(*this, 0, 0, _savedBounds);
 }
diff --git a/engines/access/bubble_box.cpp b/engines/access/bubble_box.cpp
index 8a52ec94be8..ab522e27283 100644
--- a/engines/access/bubble_box.cpp
+++ b/engines/access/bubble_box.cpp
@@ -70,14 +70,12 @@ void BubbleBox::clearBubbles() {
 }
 
 void BubbleBox::placeBubble(const Common::String &msg) {
-	/*if (_vm->getGameID() == kGameNoctropolis) {
-		calcBubble_v3(msg);
-		_vm->_screen->saveBlock(_bubbles[0]);
-		printBubble(msg);
-	} else {*/
-		_vm->_screen->_maxChars = (_vm->getGameID() == kGameMartianMemorandum) ? 30 : 27;
-		placeBubble1(msg);
-	//}
+	switch (_vm->getGameID()) {
+		case kGameMartianMemorandum: 	_vm->_screen->_maxChars = 30; break;
+		case kGameAmazon: 				_vm->_screen->_maxChars = 27; break;
+		case kGameNoctropolis: 			_vm->_screen->_maxChars = 200; break;
+	}
+	placeBubble1(msg);
 }
 
 void BubbleBox::placeBubble1(const Common::String &msg) {
@@ -89,9 +87,13 @@ void BubbleBox::placeBubble1(const Common::String &msg) {
 
 	calcBubble(msg);
 
-	Common::Rect r = _bubbles[0];
-	r.translate(-2, 0);
-	_vm->_screen->saveBlock(r);
+	if (_vm->getGameID() != kGameNoctropolis) {
+		// Noctropolis bounds are different and might have the extra box
+		// decoration, so we save them during the render step (in doBox_v3)
+		Common::Rect r = _bubbles[0];
+		r.translate(-2, 0);
+		_vm->_screen->saveBlock(r);
+	}
 	printBubble(msg);
 }
 
@@ -285,6 +287,7 @@ void BubbleBox::printBubble_v3(const Common::String &msg) {
 	Common::String line;
 	int width = 0;
 	bool lastLine;
+	int startx = _vm->_screen->_printOrg.x;
 	do {
 		// Get next line
 		const Font *font = _vm->_fonts.getFont(4);
@@ -294,8 +297,8 @@ void BubbleBox::printBubble_v3(const Common::String &msg) {
 		printString(line);
 
 		// Move print position
-		_vm->_screen->_printOrg.y += 6;
-		_vm->_screen->_printOrg.x = _vm->_screen->_printStart.x;
+		_vm->_screen->_printOrg.y += font->stringHeight(line);
+		_vm->_screen->_printOrg.x = startx;
 	} while (!lastLine);
 }
 
@@ -343,6 +346,8 @@ void BubbleBox::doBox_v3(int item, int box) {
 	else
 		_bounds = Common::Rect(Common::Point(boxX - 34, boxY - 43), boxWidth * 16 + 27 + 34, boxHeight * 16 + 20 + 43);
 
+	_vm->_screen->saveBlock(_bounds);
+
 	screen.fillRect(Common::Rect(boxX + 5, boxY + 5, boxX + 5 + boxWidth * 16 + 15, boxY + 5 + boxHeight * 16 + 8), 246);
 
 	if (_type & kTextBoxNoctCaption) {
diff --git a/engines/access/events.cpp b/engines/access/events.cpp
index 12a6bed95d1..1e6d08bfcca 100644
--- a/engines/access/events.cpp
+++ b/engines/access/events.cpp
@@ -221,6 +221,11 @@ void EventsManager::keyControl(Common::KeyCode keycode, bool isKeyDown) {
 	_keyCode = keycode;
 }
 
+uint32 EventsManager::getDoubleClickTime() const {
+    uint32 timeout = g_system->getDoubleClickTime();
+    return timeout > 0 ? timeout : 400;
+}
+
 void EventsManager::actionControl(Common::CustomEventType action, bool isKeyDown) {
 	Player &player = *_vm->_player;
 
diff --git a/engines/access/events.h b/engines/access/events.h
index 6a74ef754fa..8166afb8593 100644
--- a/engines/access/events.h
+++ b/engines/access/events.h
@@ -41,6 +41,7 @@ enum CursorType {
 	CURSOR_CLIMB = 7,
 	CURSOR_TALK = 8,
 	CURSOR_HELP = 9,
+	CURSOR_NOCT_EXIT = 9,
 	CURSOR_DARK_ANKH = 10,
 	CURSOR_INVENTORY = 99
 };
@@ -67,6 +68,7 @@ private:
 	void nextTimer();
 	void keyControl(Common::KeyCode keycode, bool isKeyDown);
 	void actionControl(Common::CustomEventType action, bool isKeyDown);
+
 public:
 	CursorType _cursorId;
 	CursorType _normalMouse;
@@ -170,6 +172,9 @@ public:
 
 	void centerMousePos();
 	void restrictMouse();
+
+	/* get ms delay before considering something a double-click */
+	uint32 getDoubleClickTime() const;
 };
 
 } // End of namespace Access
diff --git a/engines/access/font.cpp b/engines/access/font.cpp
index eec84ab7b58..44528ec2260 100644
--- a/engines/access/font.cpp
+++ b/engines/access/font.cpp
@@ -42,11 +42,19 @@ int Font::charWidth(char c) const {
 
 int Font::stringWidth(const Common::String &msg) const {
 	int total = 0;
+	int maxtotal = 0;
 
-	for (const char *c = msg.c_str(); *c != '\0'; ++c)
+	for (const char *c = msg.c_str(); *c != '\0'; ++c) {
+		if (*c == '\r' || *c == '\n') {
+			maxtotal = MAX(total, maxtotal);
+			total = 0;
+			continue;
+		}
 		total += charWidth(*c);
+	}
 
-	return total;
+	// Include the last line length too..
+	return MAX(total, maxtotal);
 }
 
 bool Font::getLine(Common::String &s, int maxWidth, Common::String &line, int &width,
@@ -127,6 +135,16 @@ int Font::drawChar(BaseSurface *s, char c, Common::Point &pt) const {
 	return ch.w;
 }
 
+int Font::stringHeight(const Common::String &msg) const {
+	int16 height = _height;
+	for (uint i = 0; i < msg.size(); i++) {
+		if (msg[i] == '\r' || msg[i] == '\n')
+			height += _height;
+	}
+	return height;
+}
+
+
 /*------------------------------------------------------------------------*/
 
 void AmazonFont::load(const int *fontIndex, const byte *fontData) {
diff --git a/engines/access/font.h b/engines/access/font.h
index 5dded08e260..11642aca48b 100644
--- a/engines/access/font.h
+++ b/engines/access/font.h
@@ -70,7 +70,7 @@ public:
 	/**
 	 * Get the height of a given string
 	 */
-	virtual int stringHeight(const Common::String &msg) const { return _height; };
+	virtual int stringHeight(const Common::String &msg) const;
 
 	/**
 	 * Type of line wrapping - Martian wraps based on chars, Amazon based on px.
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.h b/engines/access/noctropolis/noctropolis_comicviewer.h
index c2b5940581b..ed1a17c28d5 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.h
+++ b/engines/access/noctropolis/noctropolis_comicviewer.h
@@ -42,7 +42,6 @@ public:
     int findPolygonAt(int16 x, int16 y) const;
     void free();
 protected:
-    typedef Common::Array<Polygon> PolygonArray;
     PolygonArray _polygons;
     void internalLoad(Common::SeekableReadStream &source, uint32 size);
 };
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index a05ee7729f9..68ca640b8e5 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -28,6 +28,21 @@ namespace Access {
 
 namespace Noctropolis {
 
+/* _selectCommand enum values are different in Noctropolis */
+enum NoctropolisCommands {
+	kNoctCmdLook = 0, 		// same as MM/Amazon
+	kNoctCmdOpen = 1, 		// same as MM/Amazon
+	kNoctCmdMove = 2, 		// same as MM/Amazon
+	kNoctCmdGetTake = 3, 	// same as MM/Amazon
+	kNoctCmdTalk = 4, 		// *not* the same
+	kNoctCmdUse = 5, 		// *not* the same
+	kNoctCmdGoto = 6, 		// *not* the same
+	kNoctCmdInventory = 7,
+	kNoctCmdTravel = 8,
+	kNoctCmdOptions = 9,
+	kNoctCmdSaveLoad = 10,
+};
+
 class NoctropolisEngine : public AccessEngine {
 public:
 	NoctropolisEngine(OSystem *syst, const AccessGameDescription *gameDesc);
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index b4114ac114b..0a9fa93b995 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -23,6 +23,7 @@
 #include "access/noctropolis/noctropolis_game.h"
 #include "access/noctropolis/noctropolis_font.h"
 #include "access/font.h"
+#include "access/polygon.h"
 
 namespace Access {
 
@@ -38,6 +39,32 @@ const byte ICON_PALETTE[] = {
 	0xa5, 0xbf, 0xbf, 0xbf, 0xd9, 0xd9, 0xd9, 0xfc, 0xfc, 0xfc,
 };
 
+const int16 MENU_POLYS[] = {
+	 0x3,	0x54,    0x0,   0xA8,
+	 0x0,   0x7E,   0x33,    0x3,
+	 0x0,    0x0,   0x54,    0x0,
+	0x7E,   0x33,    0x3,   0xA8,
+	 0x0,   0xFE,    0x0,   0x7E,
+	0x33,    0x3,   0x3C,   0x1A,
+	0x7E,   0x33,   0x7F,   0x66,
+	 0x4,    0x0,    0x0,   0x3C,
+	0x1A,   0x4F,   0x32,   0x26,
+	0x32,    0x4,   0xAC,   0x33,
+	0xC0,   0x1A,   0xFE,    0x0,
+	0xD3,   0x32,    0x3,   0x7E,
+	0x33,   0xC0,   0x1A,   0x7F,
+	0x66,    0x4,   0x95,   0x4F,
+	0xAC,   0x33,   0xD3,   0x32,
+	0xA8,   0x66,    0x4,   0x26,
+	0x32,   0x4F,   0x32,   0x67,
+	0x4F,   0x54,   0x66,    0x4,
+	0x54,   0x66,   0x67,   0x4F,
+	0x7F,   0x66,   0x7E,   0x96,
+	 0x4,   0x7F,   0x66,   0x95,
+	0x4F,   0xA8,   0x66,   0x7E,
+	0x96,  	-1,
+};
+
 
 // The original game has 4 files after a bunch of nullptrs.
 // We add them separately to make this file a little smaller.
@@ -1822,8 +1849,29 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_97, ARRAYSIZE(ROOMDATA_97))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+
+	// Load the menu polys
+	int i = 0;
+	while (MENU_POLYS[i] != -1) {
+		Polygon polygon;
+		int pointsCount = MENU_POLYS[i++];
+		while (pointsCount--) {
+              Common::Point point;
+              point.x = MENU_POLYS[i++];
+              point.y = MENU_POLYS[i++];
+              polygon.points.push_back(point);
+		}
+		_menuPolygons.push_back(polygon);
+	}
 }
 
+int NoctropolisResources::menuPolygonAt(int16 x, int16 y) const {
+	for (int i = 0; i < (int)_menuPolygons.size(); i++) {
+		if (_menuPolygons[i].pointInside(x, y))
+			return i;
+	}
+	return -1;
+}
 
 int NoctropolisResources::getCursorWidth(int num) const {
 	if (num == 10)
diff --git a/engines/access/noctropolis/noctropolis_resources.h b/engines/access/noctropolis/noctropolis_resources.h
index 888068e2152..56a50518196 100644
--- a/engines/access/noctropolis/noctropolis_resources.h
+++ b/engines/access/noctropolis/noctropolis_resources.h
@@ -23,6 +23,7 @@
 #define ACCESS_NOCTROPOLIS_NOCTROPOLIS_RESOURCES_H
 
 #include "access/resources.h"
+#include "access/polygon.h"
 
 namespace Access {
 
@@ -34,6 +35,8 @@ class NoctropolisEngine;
 
 extern const byte ICON_PALETTE[];
 
+extern const int16 MENU_POLYS[];
+
 class NoctropolisResources : public Resources {
 public:
 	NoctropolisResources(AccessEngine *_vm);
@@ -54,6 +57,8 @@ public:
 	const char *getEndMessage() const;
 	const char *getStilEndMessage() const;
 
+	int menuPolygonAt(int16 x, int16 y) const;
+
 private:
 	Font *_fontChaleteu;
 	Font *_fontSystemeu;
@@ -62,6 +67,8 @@ private:
 	Font *_fontGothiceu;
 	Font *_fontChaletse;
 	Font *_fontComicseu;
+
+	PolygonArray _menuPolygons;
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 7890184373e..28ff77f1195 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -24,6 +24,7 @@
 #include "access/noctropolis/noctropolis_game.h"
 #include "access/noctropolis/noctropolis_room.h"
 #include "access/noctropolis/noctropolis_player.h"
+#include "access/noctropolis/noctropolis_resources.h"
 #include "access/access.h"
 
 namespace Access {
@@ -76,6 +77,7 @@ void NoctropolisRoom::reloadRoom1() {
 	_selectCommand = -1;
 	_vm->_boxSelect = false; //-1
 	_vm->_player->_playerOff = false;
+	_vm->_player->_playerMove = false;
 
 	_vm->_screen->forceFadeOut();
 	_vm->_events->hideCursor();
@@ -85,7 +87,6 @@ void NoctropolisRoom::reloadRoom1() {
 	_vm->_player->load();
 
 	_vm->_events->hideCursor();
-	roomMenu();
 	_vm->_screen->setBufferScan();
 	setupRoom();
 	setWallCodes();
@@ -100,6 +101,13 @@ void NoctropolisRoom::reloadRoom1() {
 	_vm->_events->clearEvents();
 }
 
+void NoctropolisRoom::roomInit() {
+	Room::roomInit();
+
+	for (int i = 0; i < 8; i++)
+		_vm->_flags[178 + i] = 0;
+}
+
 void NoctropolisRoom::buildScreenXScroll() {
 	int drawCol = _vm->_scrollCol;
 	int offset = -_vm->_scrollX;
@@ -159,7 +167,7 @@ void NoctropolisRoom::doCommands() {
 	// aka NoctDoCommandLoop::ticker
 
 	if (_vm->_events->_interfaceOff) {
-		_vm->_events->setCursor(CURSOR_DARK_ANKH);
+		_vm->_events->setNormalCursor(CURSOR_DARK_ANKH);
 	} else {
 		if (_vm->_events->_rightButton) {
 			_vm->_events->debounceRight();
@@ -172,55 +180,60 @@ void NoctropolisRoom::doCommands() {
 
 		_vm->_exitBox = false;
 
-		if (_selectCommand != 1 && _selectCommand != 2 &&
-			_selectCommand != 3 && _selectCommand != 5 &&
-			_selectCommand != 6) {
-			hotspotIndex = checkPlayerBox(pt);
-			// Mouse is at the player or Stiletto, check what the script says
-			if (hotspotIndex >= 0 && !(validateBox(hotspotIndex) & 0x80))
-				hotspotIndex = -1;
+		if (_selectCommand != kNoctCmdOpen && _selectCommand != kNoctCmdMove &&
+			_selectCommand != kNoctCmdGetTake && _selectCommand != kNoctCmdUse &&
+			_selectCommand != kNoctCmdGoto) {
+			if (!checkPlayerBox(pt)) {
+				hotspotIndex = _plotter._blockIn;
+				// Mouse is at the player or Stiletto, check what the script says
+				if (hotspotIndex >= 0 && (validateBox(hotspotIndex) & 0x80))
+					hotspotIndex = -1;
+			}
+		}
+
+		if (_vm->_player->_roomNumber == 59 && _selectCommand == kNoctCmdGetTake && hotspotIndex == 3) {
+			_conFlag = true;
+			_vm->_scripts->_continuenceType = 3;
+			error("TODO: Implement room 59 hack from original?");
 		}
 
 		if (hotspotIndex < 0) {
 			hotspotIndex = checkBoxes1(pt);
-			while (hotspotIndex >= 0 && !(validateBox(hotspotIndex) & 0x80))
+			while (hotspotIndex >= 0 && (validateBox(hotspotIndex) & 0x80))
 				hotspotIndex = checkBoxes2(pt, hotspotIndex + 1, 0);
 		}
 
 		if (hotspotIndex >= 0) {
 			if (_vm->_exitBox)
-				_vm->_events->setCursor(CURSOR_HELP);
+				_vm->_events->setNormalCursor(CURSOR_NOCT_EXIT);
 			else if (_selectCommand <= 6)
-				_vm->_events->setCursor((CursorType)(_selectCommand + 2));
+				_vm->_events->setNormalCursor((CursorType)(_selectCommand + 2));
 			else
-				_vm->_events->setCursor(CURSOR_ARROW);
+				_vm->_events->setNormalCursor(CURSOR_ARROW);
 
 			if (_vm->_events->_leftButton) {
 				_vm->_events->debounceLeft();
 				// Double-clicking on something selects the goto command
-				uint32 endTicks = g_system->getMillis() + 100;
+				uint32 endTicks = g_system->getMillis() + _vm->_events->getDoubleClickTime();
 				while (g_system->getMillis() < endTicks) {
-					_vm->_events->pollEvents();
+					_vm->_events->pollEventsAndWait();
 					if (_vm->_events->_leftButton) {
-						_selectCommand = 1;
+						_selectCommand = kNoctCmdGoto;
 						break;
 					}
 				}
 				// Also the script can force a goto command
 				if (_vm->_exitBox)
-					_selectCommand = 3;
+					_selectCommand = kNoctCmdGoto;
 				_vm->_events->debounceLeft();
-				if (_selectCommand >= 0) {
+				if (_selectCommand != -1) {
 					_conFlag = true;
-					while (_conFlag && !_vm->shouldQuitOrRestart()) {
-						_conFlag = false;
-						_vm->_scripts->executeScript();
-					}
+					_vm->_scripts->executeScript();
 				}
 			}
 		} else {
 			_vm->_exitBox = false;
-			_vm->_events->setCursor(CURSOR_ARROW);
+			_vm->_events->setNormalCursor(CURSOR_ARROW);
 		}
 
 	}
@@ -305,6 +318,8 @@ void NoctropolisRoom::mainAreaLClick() {
 int NoctropolisRoom::validateBox(int boxId) {
 	int result = Room::validateBox(boxId);
 
+	//debug("NoctRoom::validateBox(%d) -> %d", boxId, result);
+
 	if (_vm->_player->_roomNumber == 54) {
 		_vm->_scripts->_continuenceType = 1;
 	}
@@ -313,7 +328,64 @@ int NoctropolisRoom::validateBox(int boxId) {
 
 
 void NoctropolisRoom::roomMenu() {
-	warning("TODO: Implement NoctropolisRoom::RoomMenu (see gRoomMenuLoop?)");
+	// Move the mouse to the centre of the menu
+	// see NoctRoomMenu::setPositionFromMouse.
+	Common::Point mousePt = _vm->_events->getMousePos();
+	int baseX = mousePt.x - 127;
+	int baseY = mousePt.y - 75;
+
+	if (baseX < 0) {
+		baseX = 0;
+		mousePt.x = 127;
+	} else if (baseX >= 640 - 255) {
+		baseX = 640 - 255;
+		mousePt.x = 640 - 127;
+	}
+
+	if (baseY < 0) {
+		baseY = 0;
+		mousePt.y = 75;
+	} else if (baseY >= 400 - 151) {
+		baseY = 400 - 151;
+		mousePt.y = 400 - 75;
+	}
+
+	g_system->warpMouse(mousePt.x, mousePt.y);
+
+	const SpriteResource *icons = _vm->getIcons();
+
+	int16 width = icons->getFrame(8)->w + icons->getFrame(9)->w;
+	int16 height = MAX(icons->getFrame(8)->h, icons->getFrame(9)->h);
+
+	_vm->_screen->saveScreen();
+	_vm->_screen->setDisplayScan();
+
+	_vm->_screen->saveBlock(Common::Rect(Common::Point(baseX, baseY), width, height));
+
+	_vm->_destIn = _vm->_screen;	// TODO: Redundant?
+	_vm->_screen->plotImage(icons, 8, Common::Point(baseX, baseY));
+	_vm->_screen->plotImage(icons, 9, Common::Point(baseX + 127, baseY));
+
+	int cmdIndex = -1;
+	while (cmdIndex == -1 && !_vm->shouldQuitOrRestart()) {
+		if (_vm->_events->_rightButton) {
+			cmdIndex = -2;
+			_vm->_events->debounceRight();
+		} else if (_vm->_events->_leftButton) {
+			mousePt = _vm->_events->getMousePos();
+			cmdIndex = ((NoctropolisResources *)_vm->_res)->menuPolygonAt(mousePt.x - baseX, mousePt.y - baseY);
+			_vm->_events->debounceLeft();
+		}
+		_vm->_events->pollEventsAndWait();
+	}
+
+	// Restore screen background
+	_vm->_screen->restoreBlock();
+	_vm->_screen->restoreScreen();
+	debug("menu cmdIndex = %d", cmdIndex);
+
+	if (cmdIndex >= 0)
+		handleCommand(cmdIndex);
 }
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_room.h b/engines/access/noctropolis/noctropolis_room.h
index 5e4239dc8d6..8c979763626 100644
--- a/engines/access/noctropolis/noctropolis_room.h
+++ b/engines/access/noctropolis/noctropolis_room.h
@@ -52,6 +52,7 @@ protected:
 
 	int validateBox(int boxId) override;
 
+	void roomInit() override;
 private:
 	// Like buildColumn but can handle negative playX.
 	// TODO: Can we just replace Room::buildColumn with this one?
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index 41e3b383471..9244a6118a7 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -30,6 +30,71 @@ NoctropolisScripts::NoctropolisScripts(NoctropolisEngine *vm) : Scripts(vm) {
 	setOpcodes_v3();
 }
 
+static int COMMAND_ARG_SIZES[] = {
+	-1, 0, 2, 2, 2, 2, 2, 2, 2, -1,
+	0, 1, 2, 6, 2, 1, 2, 6, 4, 1,
+	2, 6, 4, 1, 0, 0, 10, 1, 0, 2,
+	4, 6, 2, 2, 8, 0, 8, 0, 0, 4,
+	0, 2, 8, 0, 0, 0, 6, 6, 6, 0,
+	-2, -2, -3, 2, 8, 4, 4, 0, 0, 2,
+	0, 10, 0, -1, 0, 2, 6, 8, 0, 0,
+	1, 1, 0, 0, -2, 0, 1, 6, 2, 2,
+	0, 4, 2, 8, 0, 6, 2, 0, 0, 0,
+	4, 1, 1, 2, 0, 0,
+};
+
+void NoctropolisScripts::skipCommand(byte cmd) {
+	assert(cmd < ARRAYSIZE(COMMAND_ARG_SIZES));
+	int argsize = COMMAND_ARG_SIZES[cmd];
+	switch (argsize) {
+	case -1:
+		_data->readString();
+		break;
+	case -2:
+		_data->readUint16LE();
+		_data->readUint16LE();
+		_data->readString();
+		break;
+	case -3:
+		_data->readUint16LE();
+		_data->readUint16LE();
+		_data->readString();
+		_data->readString();
+		_data->readString();
+		_data->readString();
+		_data->readString();
+		_data->readString();
+		break;
+	default:
+		_data->seek(argsize, SEEK_CUR);
+	}
+}
+
+// Unlike the previous games which just stop at any 0xE0 (SCRIPT_START_BYTE),
+// Noctropolis skips to the next command using argument size.  This avoids
+// mistakes from the 0xE0 appearing accidentally in arguments.
+void NoctropolisScripts::searchForSequence() {
+	assert(_data);
+
+	_data->seek(0);
+	int sequenceId;
+	while (_data->pos() < _data->size()) {
+		byte command = _data->readByte();
+		if (command == 0xe0) {
+			sequenceId = _data->readUint16LE();
+			if (sequenceId == _sequence)
+				break;
+		} else {
+			skipCommand(command ^ 0x80);
+		}
+	}
+	if (_data->pos() == _data->size()) {
+		warning("Hit EOS when searching for sequence %d", _sequence);
+		_endFlag = true;
+	}
+}
+
+
 void NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2) {
 	switch (commandIndex) {
 		case 1:
diff --git a/engines/access/noctropolis/noctropolis_scripts.h b/engines/access/noctropolis/noctropolis_scripts.h
index 31355482f24..5959b272a1f 100644
--- a/engines/access/noctropolis/noctropolis_scripts.h
+++ b/engines/access/noctropolis/noctropolis_scripts.h
@@ -35,6 +35,11 @@ public:
 	NoctropolisScripts(NoctropolisEngine *vm);
 
 	void executeSpecial(int commandIndex, int param1, int param2) override;
+
+	void searchForSequence() override;
+
+private:
+	void skipCommand(byte cmd);
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/polygon.h b/engines/access/polygon.h
index ad302b07e27..2825559fbc6 100644
--- a/engines/access/polygon.h
+++ b/engines/access/polygon.h
@@ -33,6 +33,7 @@ struct Polygon {
     bool pointInside(int16 x, int16 y) const;
 };
 
+typedef Common::Array<Polygon> PolygonArray;
 
 } // end namespace Access
 
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 762e02f499e..1ec2d7707f6 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -26,6 +26,7 @@
 #include "access/room.h"
 #include "access/amazon/amazon_resources.h"
 #include "access/martian/martian_resources.h"
+#include "access/noctropolis/noctropolis_game.h"
 
 namespace Access {
 
@@ -682,10 +683,15 @@ void Room::cycleCommand(int incr) {
 
 void Room::handleCommand(int commandId) {
 	if (commandId == -2) {
-		// Save-load button event from keymapper.  Only open if allowed at the moment.
+		// Save-load button event from keymapper or Noctropolis menu.
+		// Only open if allowed at the moment.
 		if (_vm->_canSaveLoad)
 			_vm->openMainMenuDialog();
-	} else if (commandId == 9) {
+	} else if ((commandId == 9) || (_vm->getGameID() == kGameNoctropolis && commandId == 10)) {
+		// Open Options menu (in all games)
+		// NOTE: In Noctropolis we map both "Options" and "Disk" to this.
+		// If we implement original dialogs we can split these cases.
+		//
 		_vm->_events->debounceLeft();
 		_vm->_canSaveLoad = true;
 		_vm->openMainMenuDialog();
@@ -791,24 +797,67 @@ void Room::executeCommand(int commandId) {
 		}
 	} else {
 		assert(_vm->getGameID() == kGameNoctropolis);
-		error("TODO: implement executeCommand for Noctropolis");
 		// See the code in NoctRoomEngine::afterDoCommandsTick
+		if (commandId == Noctropolis::kNoctCmdInventory) {
+			/*
+			while (!_vm->shouldQuitOrRestart()) {
+				runInventory();
+				//debug("getVariable(99) = %d", getVariable(99));
+				if (getVariable(99) == 62) {
+					runComicSpecialIssue();
+				} else if (getVariable(99) != 255) {
+					_inventoryScript->runLabel(getVariable(99));
+				} else
+					break;
+			}*/
+			warning("TODO: Implement Noctropolis inventory");
+		} else {
+			if (_vm->_exitBox)
+				_vm->_events->setCursor(CURSOR_NOCT_EXIT);
+			else if (_selectCommand >= 0 && _selectCommand <= 6)
+				_vm->_events->setCursor((CursorType)(_selectCommand + 2));
+			else
+				_vm->_events->setCursor(CURSOR_ARROW);
+
+			if (_selectCommand == Noctropolis::kNoctCmdTravel) {
+				_selectCommand = Noctropolis::kNoctCmdLook;
+				_vm->_scripts->_sequence = 5000;
+				_vm->_scripts->searchForSequence();
+
+				_conFlag = true;
+				while (_conFlag && !_vm->shouldQuitOrRestart()) {
+					_conFlag = false;
+					_vm->_scripts->executeScript();
+				}
+			} else if (_selectCommand == Noctropolis::kNoctCmdUse) {
+				_selectCommand = Noctropolis::kNoctCmdLook;
+				_vm->_scripts->_sequence = 10000;
+				_vm->_scripts->searchForSequence();
+
+				_conFlag = true;
+				while (_conFlag && !_vm->shouldQuitOrRestart()) {
+					_conFlag = false;
+					_vm->_scripts->executeScript();
+				}
+			}
+		}
 	}
 	screen.saveScreen();
 	screen.setDisplayScan();
 
 	const SpriteResource *icons = _vm->getIcons();
 
-	// Draw the button as selected
+	// Draw the button as selected (except in Noctropolis)
 	if (_vm->getGameID() == kGameMartianMemorandum) {
 		screen.plotImage(icons, 0, Common::Point(5, 184));
 		screen.plotImage(icons, 1, Common::Point(155, 184));
-	} else if (_vm->getGameID() == kGameNoctropolis) {
+	} else if (_vm->getGameID() == kGameAmazon) {
 		screen.plotImage(icons, 0, Common::Point(0, 177));
 		screen.plotImage(icons, 1, Common::Point(143, 177));
 	}
-	screen.plotImage(icons, _selectCommand + 2,
-		Common::Point(_rMouse[_selectCommand][0], (_vm->getGameID() == kGameMartianMemorandum) ? 184 : 176));
+	if (_vm->getGameID() != kGameNoctropolis)
+		screen.plotImage(icons, _selectCommand + 2,
+			Common::Point(_rMouse[_selectCommand][0], (_vm->getGameID() == kGameMartianMemorandum) ? 184 : 176));
 
 	_vm->_screen->restoreScreen();
 	_vm->_boxSelect = true;
@@ -835,7 +884,8 @@ void Room::walkCursor() {
 void Room::commandOff() {
 	_selectCommand = -1;
 	_vm->_events->forceSetCursor(CURSOR_CROSSHAIRS);
-	roomMenu();
+	if (_vm->getGameID() != kGameNoctropolis)
+		roomMenu();
 }
 
 int Room::checkBoxes() {
diff --git a/engines/access/room.h b/engines/access/room.h
index 50d72736a4c..924e28872a1 100644
--- a/engines/access/room.h
+++ b/engines/access/room.h
@@ -67,6 +67,7 @@ enum RoomFlag {
 	kRoomFlagNoPlayer = 0x80,
 };
 
+
 class Room : public Manager {
 private:
 	void roomLoop();
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 1038400bcfe..99a8355b398 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -142,7 +142,11 @@ void Scripts::setOpcodes_v2() {
 void Scripts::setOpcodes_v3() {
 	// Modify command list for Noctropolis
 	COMMAND_LIST[1] = &Scripts::cmdEndObject_v3;
+	COMMAND_LIST[6] = &Scripts::cmdJumpUse_v3;
+	COMMAND_LIST[7] = &Scripts::cmdJumpTalk_v3;
+	COMMAND_LIST[9] = &Scripts::cmdPrint_v2;
 	COMMAND_LIST[18] = &Scripts::cmdSetCoords;
+	COMMAND_LIST[33] = &Scripts::cmdJumpGoto_v3;
 	COMMAND_LIST[34] = &Scripts::cmdSetVideo_v3;
 	COMMAND_LIST[50] = &Scripts::cmdCharSpeak_v3;
 	COMMAND_LIST[51] = &Scripts::cmdPlayerSpeak;
@@ -196,7 +200,7 @@ void Scripts::searchForSequence() {
 	_data->seek(0);
 	int sequenceId;
 	do {
-		while (_data->readByte() != SCRIPT_START_BYTE) {}
+		while (_data->readByte() != SCRIPT_START_BYTE && !_data->eos()) {}
 		sequenceId = _data->readUint16LE();
 	} while (sequenceId != _sequence);
 }
@@ -320,7 +324,7 @@ void Scripts::cmdEndObject() {
 
 
 void Scripts::cmdEndObject_v3() {
-	if (_vm->_room->_selectCommand == 4 && _vm->_boxSelectY == 0x62) {
+	if (_vm->_room->_selectCommand == Noctropolis::kNoctCmdTalk && _vm->_boxSelectY == 0x62) {
 		Noctropolis::NoctropolisResources *res = (Noctropolis::NoctropolisResources *)_vm->_res;
 		const char *vidfile = "DARK/VID/A4IN00.VID";
 		if (_vm->_flags[91] == 2) {
@@ -428,6 +432,17 @@ void Scripts::cmdJumpUse() {
 	}
 }
 
+void Scripts::cmdJumpUse_v3() {
+	debugCN(1, kDebugScripts, "cmdJumpUse_v3(selectCommand=%d)", _vm->_room->_selectCommand);
+	if (_vm->_room->_selectCommand == Noctropolis::kNoctCmdUse) {
+		debugC(1, kDebugScripts, " -> True");
+		cmdGoto();
+	} else {
+		debugC(1, kDebugScripts, " -> False");
+		_data->skip(2);
+	}
+}
+
 void Scripts::cmdJumpTalk() {
 	debugCN(1, kDebugScripts, "cmdJumpTalk(selectCommand=%d)", _vm->_room->_selectCommand);
 	if (_vm->_room->_selectCommand == 6) {
@@ -439,6 +454,17 @@ void Scripts::cmdJumpTalk() {
 	}
 }
 
+void Scripts::cmdJumpTalk_v3() {
+	debugCN(1, kDebugScripts, "cmdJumpTalk_v3(selectCommand=%d)", _vm->_room->_selectCommand);
+	if (_vm->_room->_selectCommand == Noctropolis::kNoctCmdTalk) {
+		debugC(1, kDebugScripts, " -> True");
+		cmdGoto();
+	} else {
+		debugC(1, kDebugScripts, " -> False");
+		_data->skip(2);
+	}
+}
+
 void Scripts::cmdNull() {
 	debugC(1, kDebugScripts, "cmdNull()");
 }
@@ -475,6 +501,11 @@ void Scripts::printString(const Common::String &msg) {
 		_vm->_timers[PRINT_TIMER]._timer = 50;
 		_vm->_timers[PRINT_TIMER]._initTm = 50;
 		++_vm->_timers[PRINT_TIMER]._flag;
+
+		_vm->_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctCenter);
+		if (_vm->_player->_roomNumber <= 4)
+		  _vm->_bubbleBox->_type = (BoxType)(_vm->_bubbleBox->_type | kTextBoxNoctPlain);
+
 	} else if (_vm->getGameID() != kGameMartianMemorandum) {
 		_vm->_screen->_printOrg = _vm->_screen->_printStart = Common::Point(20, 42);
 		_vm->_timers[PRINT_TIMER]._timer = 1;
@@ -803,6 +834,17 @@ void Scripts::cmdJumpGoto() {
 	}
 }
 
+void Scripts::cmdJumpGoto_v3() {
+	debugCN(1, kDebugScripts, "cmdJumpGoto_v3(selectCommand=%d)", _vm->_room->_selectCommand);
+	if (_vm->_room->_selectCommand == Noctropolis::kNoctCmdGoto) {
+		debugC(1, kDebugScripts, " -> True");
+		cmdGoto();
+	} else {
+		debugC(1, kDebugScripts, " -> False");
+		_data->skip(2);
+	}
+}
+
 void Scripts::cmdSetVideo_v1() {
 	Common::Point pt;
 	pt.x = _data->readSint16LE();
@@ -1499,6 +1541,7 @@ void Scripts::cmdWalkTo() {
 void Scripts::cmdWalkCheck() {
 	debugCN(1, kDebugScripts, "cmdWalkCheck()");
 	if (!_vm->_player->_playerMove) {
+		// Walk is done
 		debugC(1, kDebugScripts, " -> True");
 		cmdGoto();
 	} else {
diff --git a/engines/access/scripts.h b/engines/access/scripts.h
index 8946443cd86..13f4d751344 100644
--- a/engines/access/scripts.h
+++ b/engines/access/scripts.h
@@ -65,7 +65,9 @@ protected:
 	void cmdJumpGet();
 	void cmdJumpMove();
 	void cmdJumpUse();
+	void cmdJumpUse_v3();
 	void cmdJumpTalk();
+	void cmdJumpTalk_v3();
 	void cmdNull();
 	void cmdPrint_v1();
 	void cmdPrint_v2();
@@ -97,6 +99,7 @@ protected:
 	void cmdSetTimer();
 	void cmdCheckTimer();
 	void cmdJumpGoto();
+	void cmdJumpGoto_v3();
 	void cmdSetTravel();
 	void cmdSetVideo_v1();
 	void cmdSetVideo_v3();
@@ -197,7 +200,7 @@ public:
 
 	void freeScriptData();
 
-	void searchForSequence();
+	virtual void searchForSequence();
 
 	int executeScript();
 


Commit: b41400e8c065b1f43167b40bd50fdb7132520864
    https://github.com/scummvm/scummvm/commit/b41400e8c065b1f43167b40bd50fdb7132520864
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Skip intro sequence fully if skip_intro is set

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 6ce11912063..cce8dd6850c 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -66,7 +66,8 @@ void NoctropolisEngine::setupGame() {
 
 void NoctropolisEngine::initVariables() {
 	// Set player room and position
-	_player->_roomNumber = 3;
+	// Room 2 for intro sequence, 3 for first interactive room.
+	_player->_roomNumber = ConfMan.getBool("skip_intro") ? 3 : 2;
 
 	_invScript->setScript(_files->loadRawFile("INVTEXT.AP"));
 


Commit: ade5ba42d4b8844c4c66efd5942343c82ee50ecb
    https://github.com/scummvm/scummvm/commit/ade5ba42d4b8844c4c66efd5942343c82ee50ecb
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Implement anim8 for Noctropolis

Changed paths:
    engines/access/animation.cpp


diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index 6c0f7e49d1e..cc79a9d32e4 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -212,8 +212,29 @@ void Animation::anim7() {
 }
 
 void Animation::anim8() {
-	// TODO: In here be careful with whether we are using playerX or raw.x
-	//debug("TODO: Animation::anim8");
+	const AnimationFrame *frame = calcFrame();
+	if (!_vm->_player->_playerOff) {
+		assert(frame->_parts.size() > 0);
+		const AnimationFramePart &part0 = frame->_parts[0];
+		const SpriteFrame *spriteFrame0 = _vm->_objectsTable[part0._spritesIndex]->_frames[part0._frameIndex];
+		_vm->_animation->_base.x = frame->_baseX;
+		_vm->_animation->_base.y = frame->_baseY;
+		int playerX = _vm->_player->_playerX;
+		int playerY = _vm->_player->_playerY;
+		int frameX = _vm->_animation->_base.x + part0._position.x;
+		int frameY = _vm->_animation->_base.y + part0._position.y;
+		int playerOffX = _vm->_player->_playerOffset.x;
+		int playerOffY = _vm->_player->_playerOffset.y;
+
+		if (playerX <= frameX + spriteFrame0->w &&
+			playerY - playerOffY <= frameY + spriteFrame0->h &&
+			playerY <= part0._offsetY && frameY <= playerY && frameX < playerOffX + playerX) {
+			// Reset frame here?
+			_frameNumber = 0;
+			frame = calcFrame();
+		}
+	}
+	setFrame(frame);
 }
 
 void Animation::anim9() {
@@ -259,7 +280,7 @@ void Animation::anim12() {
 		else
 			_vm->_player->_playerY += yadd;
 		_countdownTicks += frame->_frameDelay;
-		debug("anim12: player pos %d, %d (change %d %d -> %d %d) scale %d", _vm->_player->_playerX, _vm->_player->_playerY, deltaX, deltaY, xadd, yadd, _vm->_scale);
+		debugC(kDebugGraphics, "anim12: player pos %d, %d (change %d %d -> %d %d) scale %d", _vm->_player->_playerX, _vm->_player->_playerY, deltaX, deltaY, xadd, yadd, _vm->_scale);
 	}
 	_scaling = _vm->_scale;
 	setFrame1(frame, _vm->_player->_playerX, _vm->_player->_playerY - _vm->_player->_playerOffset.y);


Commit: ca6f3c8806fd91ac22bbc6b16a0557bace201561
    https://github.com/scummvm/scummvm/commit/ca6f3c8806fd91ac22bbc6b16a0557bace201561
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix which player model to load

Changed paths:
    engines/access/noctropolis/noctropolis_room.cpp


diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 28ff77f1195..cf3bb2c33e2 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -39,20 +39,23 @@ void NoctropolisRoom::reloadRoom() {
 
 	// This is LoadPlayer1
 	int subFileBase = 1;
-	int numSubFiles;
-	int objBase;
-	int fileNum;
+	int numSubFiles = -1;
+	int objBase = -1;
+	int fileNum = -1;
 	if (!(_roomFlag & kRoomFlagTopView)) {
-		if (_roomFlag) {
-			// Peter
-			numSubFiles = 5;
-			objBase = 100;
-			fileNum = 0xfe;
+		if ((int8)_roomFlag > -1) {
+			if ((_vm->_flags[1] & 1) == 0) {
+				// Peter
+				numSubFiles = 5;
+				objBase = 100;
+				fileNum = 0xfe;
+			} else {
+				// Dark
+				numSubFiles = 5;
+				objBase = 105;
+				fileNum = 0xff;
+			}
 		} else {
-			// Dark
-			numSubFiles = 5;
-			objBase = 105;
-			fileNum = 0xff;
 		}
 	} else {
 		// Top
@@ -61,12 +64,14 @@ void NoctropolisRoom::reloadRoom() {
 		fileNum = 0xfc;
 	}
 
-	_vm->_player->loadNoctPalette(fileNum, _palIntensity + 6);
-	((NoctropolisPlayer *)_vm->_player)->loadAnimation(fileNum, 0);
+	if (fileNum > 0) {
+		_vm->_player->loadNoctPalette(fileNum, _palIntensity + 6);
+		((NoctropolisPlayer *)_vm->_player)->loadAnimation(fileNum, 0);
 
-	for (int i = subFileBase; i <= numSubFiles; i++) {
-		Resource *data = _vm->_files->loadFile(fileNum, i);
-		_vm->_objectsTable[objBase + i - subFileBase] = new SpriteResource(_vm, data);
+		for (int i = subFileBase; i <= numSubFiles; i++) {
+			Resource *data = _vm->_files->loadFile(fileNum, i);
+			_vm->_objectsTable[objBase + i - subFileBase] = new SpriteResource(_vm, data);
+		}
 	}
 
 	reloadRoom1();


Commit: 208cedd4f4984cd2c40bc364966d3680b924463b
    https://github.com/scummvm/scummvm/commit/208cedd4f4984cd2c40bc364966d3680b924463b
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Actually play music in Noctropolis intro.

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index cce8dd6850c..a3f4d2fbe24 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -221,6 +221,7 @@ void NoctropolisEngine::doIntro() {
 	_screen->forceFadeOut();
 
 	_midi->loadMusic(98, 1);
+	_midi->midiPlay();
 	_room->loadPlayField(1, 0);
 	_buffer2.copyFrom(*_screen);
 	_buffer1.copyFrom(*_screen);


Commit: 5a9174a8441016060934690bd0892d435303a678
    https://github.com/scummvm/scummvm/commit/5a9174a8441016060934690bd0892d435303a678
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add comments

Changed paths:
    engines/access/access.h
    engines/access/files.cpp


diff --git a/engines/access/access.h b/engines/access/access.h
index 8f6ab8f99ba..81b3c30eaad 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -267,9 +267,9 @@ public:
 	uint32 _newDate;
 	int _flags[256];
 
-	// Fields used by MM
+	// Fields used by MM and sometimes Noctropolis
 	// TODO: Refactor
-	byte _travel[60];
+	byte _travel[60]; // only first ~15 used in MM
 	byte _ask[40];
 	int _startTravelItem;
 	int _startTravelBox;
diff --git a/engines/access/files.cpp b/engines/access/files.cpp
index 1489864ccda..852490872c4 100644
--- a/engines/access/files.cpp
+++ b/engines/access/files.cpp
@@ -99,10 +99,11 @@ Resource *FileManager::loadFile(int fileNum, int subfile) {
 	Common::File file;
 
 	// Noctropolis remastered has music in OGG or MID format broken
-	// out into the individual files
+	// out into the individual files.
 	if (_vm->getGameID() == kGameNoctropolis && fileNum == 98 && !file.exists(filepath)) {
 		Common::Path path = Common::Path(Common::String::format("MUSIC/M%02d.mid", subfile));
-		// TODO: Also check for OGG file here
+		// TODO: Also check for OGG file here.  Make it a configuration
+		// variable - originally hidef_music, default true.
 		if (file.exists(path))
 			res = loadRawFile(path);
 	} else {


Commit: 3226de821ca8c9c1e9ff208401e0b6100b1dbb68
    https://github.com/scummvm/scummvm/commit/3226de821ca8c9c1e9ff208401e0b6100b1dbb68
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add startMusicFade for Noctropolis

Changed paths:
    engines/access/sound.cpp
    engines/access/sound.h


diff --git a/engines/access/sound.cpp b/engines/access/sound.cpp
index a310a593d36..195c0088332 100644
--- a/engines/access/sound.cpp
+++ b/engines/access/sound.cpp
@@ -203,7 +203,12 @@ void SoundManager::loadSounds(const Common::Array<RoomInfo::SoundIdent> &sounds)
 		if (sound._soundFilename.empty()) {
 			soundRes = loadSound(sound._fileNum, sound._subfile);
 		} else {
-			// TODO: should be running from DARK parent directory
+			//
+			// In Noctropolis, sounds are defined by filenames, eg,
+			// DARK/AUD/FLUX01A.WAV
+			// TODO: Should probably be loading from DARK parent directory?
+			// Remove DARK/
+			//
 			Common::Path origpath = Common::Path(sound._soundFilename);
 			Common::StringArray components = origpath.splitComponents();
 			assert(components.size() == 3);
@@ -426,7 +431,8 @@ void MusicManager::newMusic(int musicId, int mode) {
 		_isLooping = (mode == 2);
 		_tempMusic = _music;
 		stopSong();
-		loadMusic(97, musicId);
+		int musicFile = (_vm->getGameID() == kGameAmazon ? 97 : 98);
+		loadMusic(musicFile, musicId);
 	}
 
 	if (_music)
@@ -440,6 +446,15 @@ void MusicManager::freeMusic() {
 	_music = nullptr;
 }
 
+void MusicManager::startMusicFade() {
+	debugC(3, kDebugSound, "fadeMusic");
+	if (!isPlaying())
+		return;
+
+	int startVol = getVolume();
+	warning("TODO: Implement MusicManager::fadeMusic - fade over 700ms from startVol %d", startVol);
+}
+
 void MusicManager::setLoop(bool loop) {
 	debugC(3, kDebugSound, "setLoop");
 
diff --git a/engines/access/sound.h b/engines/access/sound.h
index 190fef28afb..5e5a8b900ac 100644
--- a/engines/access/sound.h
+++ b/engines/access/sound.h
@@ -112,6 +112,8 @@ public:
 
 	void freeMusic();
 
+	void startMusicFade();
+
 	void loadMusic(int fileNum, int subfile);
 	void loadMusic(FileIdent file);
 


Commit: a0269ea274cc0ee0b0c8b33dedb638c8ca1c1d31
    https://github.com/scummvm/scummvm/commit/a0269ea274cc0ee0b0c8b33dedb638c8ca1c1d31
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add palette functions for Noctropolis

Changed paths:
    engines/access/screen.cpp
    engines/access/screen.h


diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp
index 1f1f3217ebd..0abae446ae6 100644
--- a/engines/access/screen.cpp
+++ b/engines/access/screen.cpp
@@ -138,6 +138,13 @@ void Screen::setManPalette() {
 	}
 }
 
+void Screen::setStilPalette() {
+	assert(_vm->getGameID() == kGameNoctropolis);
+	for (int i = 0; i < 99; i++) {
+		_rawPalette[0x1e0 + i] = PALETTE_6BIT_TO_8BIT(_stilPal[i]);
+	}
+}
+
 void Screen::setIconPalette() {
 	// Icon palette is colors 247~255
 	if (_vm->getGameID() == kGameMartianMemorandum) {
@@ -151,6 +158,18 @@ void Screen::setIconPalette() {
 	}
 }
 
+void Screen::setDarkPalette(int16 mulValue, uint firstIndex, uint count) {
+	uint lastIndex = firstIndex + count;
+	for (uint i = firstIndex; i <= lastIndex; i++) {
+		_rawPalette[i * 3 + 0] = (_rawPalette[i * 3 + 0] * mulValue) >> 16;
+		_rawPalette[i * 3 + 1] = (_rawPalette[i * 3 + 1] * mulValue) >> 16;
+		_rawPalette[i * 3 + 2] = (_rawPalette[i * 3 + 2] * mulValue) >> 16;
+	}
+
+	setPalette();
+}
+
+
 void Screen::loadPalette(int fileNum, int subfile, int srcOffset) {
 	Resource *res = _vm->_files->loadFile(fileNum, subfile);
 	const byte *palette = res->data() + srcOffset;
diff --git a/engines/access/screen.h b/engines/access/screen.h
index dfcb6e77a04..2277a385b00 100644
--- a/engines/access/screen.h
+++ b/engines/access/screen.h
@@ -71,6 +71,7 @@ public:
 	int _windowXAdd, _windowYAdd;
 	int _screenYOff;
 	byte _manPal[0x84];
+	byte _stilPal[99]; // only used in Noctropolis
 	byte _scaleTable1[256];
 	byte _scaleTable2[256];
 	int _vWindowWidth;
@@ -129,10 +130,20 @@ public:
 	void setIconPalette();
 
 	/**
-	 * Set Tex palette (Martian Memorandum)
+	 * Set player palette (Martian Memorandum and Noctropolis)
 	 */
 	void setManPalette();
 
+	/**
+	 * Set Stiletto palette (Noctropolis)
+	 */
+	void setStilPalette();
+
+	/**
+	 * Dim the palette a bit
+     */
+	void setDarkPalette(int16 mulValue, uint firstIndex, uint count);
+
 	void loadPalette(int fileNum, int subfile, int srcOffset = 0);
 
 	void setPalette();


Commit: aaa66ef174f3fd8e2e586adb50960d90ea9ca3ba
    https://github.com/scummvm/scummvm/commit/aaa66ef174f3fd8e2e586adb50960d90ea9ca3ba
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: const correctness for comic viewer

Changed paths:
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_comicviewer.h


diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index 9e8940736ef..e75384075ea 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -52,19 +52,17 @@ void PolygonResource::free() {
 	_polygons.clear();
 }
 
+////////////////
 
-ComicViewer::ComicViewer(NoctropolisEngine *vm)
-	: _vm(vm)
+ComicViewer::ComicViewer(NoctropolisEngine *vm) : _vm(vm)
 {
 }
 
 ComicViewer::~ComicViewer() {
 }
 
-void ComicViewer::run(ComicResource *comic) {
-
+void ComicViewer::run(const ComicResource *comic) {
 	PageResult result = kPageResultNone;
-
 	_currPage = 0;
 	
 	debug("ComicViewer::run() getCount() = %d", comic->getCount());
@@ -80,7 +78,7 @@ void ComicViewer::run(ComicResource *comic) {
 
 }
 
-PageResult ComicViewer::runPage(ComicPage *page) {
+PageResult ComicViewer::runPage(const ComicPage *page) {
 	PageResult result = kPageResultNone;
 
 	_vm->_files->loadScreen(Common::Path(page->filename.baseName()));
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.h b/engines/access/noctropolis/noctropolis_comicviewer.h
index ed1a17c28d5..65e5e14acf1 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.h
+++ b/engines/access/noctropolis/noctropolis_comicviewer.h
@@ -61,10 +61,10 @@ struct ComicPage {
 class ComicResource : public Resource {
 public:
     uint16 getCount() const { return _pages.size(); }
-    ComicPage *getPage(int index) const { return _pages[index]; }
+    const ComicPage *getPage(int index) const { return _pages[index]; }
     void free();
 protected:
-    Common::Array<ComicPage*> _pages;
+    Common::Array<ComicPage *> _pages;
     ComicPageHotspot loadHotspot(Common::SeekableReadStream &source);
     void internalLoad(Common::SeekableReadStream &source, uint32 size);
 };
@@ -82,14 +82,14 @@ public:
 	ComicViewer(NoctropolisEngine *vm);
 	~ComicViewer();
 	
-	void run(ComicResource *comic);
+	void run(const ComicResource *comic);
 	
 protected:
 	NoctropolisEngine *_vm;
 	ComicResource *_comic;
 	SpriteResource *_bubbleSprites;
 	int _currPage;
-	PageResult runPage(ComicPage *page);
+	PageResult runPage(const ComicPage *page);
 	void drawBubble(const ComicPageBubble &bubble);
 };
 


Commit: e3335f312c5c99528d199dc8e4df6bc7ac72e414
    https://github.com/scummvm/scummvm/commit/e3335f312c5c99528d199dc8e4df6bc7ac72e414
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add a bunch more resources for Noctropolis

Changed paths:
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_resources.h


diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 0a9fa93b995..3d5252910b2 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -22,6 +22,7 @@
 #include "access/noctropolis/noctropolis_resources.h"
 #include "access/noctropolis/noctropolis_game.h"
 #include "access/noctropolis/noctropolis_font.h"
+#include "access/noctropolis/noctropolis_comicviewer.h"
 #include "access/font.h"
 #include "access/polygon.h"
 
@@ -65,6 +66,38 @@ const int16 MENU_POLYS[] = {
 	0x96,  	-1,
 };
 
+// Travel rooms
+const short TRAV_ROOMS[] = {
+	0xC,  0x1C, 0xB,  0x29,
+	0x11, 0x33, 0x2B, 0xF,
+	0x1B, 0x55, 0x20, 0x25,
+	0x1A, 0x21, 0x0
+};
+
+// X and Y travel destinations
+const short TRAV_MAN_POS[] = {
+	0x118, 0x186, 0x174, 0x152, 0x19E, 0xC9, 0xFD, 0x183, 0x48, 0x173,
+	0x1D7, 0x154, 0x46, 0x17C, 0x0, 0x0, 0x55, 0x17A, 0xC2, 0x15B,
+	0x49, 0x172, 0x143, 0x182, 0x2B, 0x16A,
+};
+
+// X, Y, and image num for travel map icons
+const short TRAV_ICONS[] = {
+	0x103, 0x62, 0x0,
+	0x1E7, 0x129, 0x1,
+	0x110, 0x1EB, 0x2,
+	0x143, 0x292, 0x3,
+	0x1D2, 0x73, 0x4,
+	0x14D, 0x96, 0x5,
+	0x2A, 0x6A, 0x6,
+	0x1C, 0x1C1, 0x7,
+	0x31, 0x2D7, 0x8,
+	0x186, 0x17C, 0x9,
+	0x98, 0x11A, 0xA,
+	0xB3, 0x19, 0xB,
+	0x72, 0xC1, 0xC,
+	0xC9, 0xF2, 0xD,
+};
 
 // The original game has 4 files after a bunch of nullptrs.
 // We add them separately to make this file a little smaller.
@@ -101,6 +134,65 @@ static const char *NOCT_FILES_2[] = {
 	"DARK/PLAYER.AP", "DARK/DARKSHR.AP",
 };
 
+static const char *NOCT_PLACE_NAMES[] = {
+	"       Cathedral",
+	"    Sunspire Tower",
+	"      Main Street",
+	"      Opera House",
+	"       Mausoleum",
+	"      Butcher Shop",
+	"      Observatory",
+	"  Stiletto's Apartment",
+	"    Bornick Mansion",
+	"  Cygnus Construction",
+	" Incarnate Technologies",
+	"Central Park Greenhouse",
+	"      Shadowlair",
+	"      Neon Noose",
+	"      Cathedrale",
+	"    Tour Sunspire",
+	"    Rue Principale",
+	"        Opera",
+	"       Mausolee",
+	"      Boucherie",
+	"     Observatoire",
+	"Appartement de Stiletto",
+	"    Manoir de Bornick",
+	"  Constructions du Cygne",
+	" Incarnate Technologies",
+	"  Serre de Central Park",
+	"     Antre d'Ombre",
+	"      Neon Noose",
+	"       Catedral",
+	"      Torre Solar",
+	"      Calle Mayor",
+	"        Opera",
+	"       Mausoleo",
+	"      Carniceria",
+	"      Observatorio",
+	"    Casa de Stiletto",
+	"     Mansion Bornick",
+	"  Construcciones Cygnus",
+	" Tecnologias Encarnadas",
+	" Invernadero del Parque",
+	"     Guarida Sombria",
+	"      Lazo de Neon",
+	"          Dom",
+	"      Sonnennadel",
+	"     Hauptstrasse",
+	"       Opernhaus",
+	"       Mausoleum",
+	"       Metzgerei",
+	"     Observatorium",
+	"   Stilettos Wohnung",
+	"Das Anwesen der Bornicks",
+	" Cygnus Hoch- & Tiefbau",
+	"Incarnate Technologies",
+	"Central Park Gewaechshaus",
+	"     Schattenhort",
+	"      Neon Noose",
+};
+
 static const byte ROOMDATA_02[] = {
 	0x81, 0x02, 0x62, 0x00, 0x02, 0x00, 0x30, 0x22, 0x30, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00,
 	0x02, 0x00, 0x03, 0x02, 0x00, 0x03, 0x00, 0x04, 0x02, 0x00, 0x04, 0x00, 0xff, 0x02, 0x00, 0x01,
@@ -1976,6 +2068,36 @@ const char *NoctropolisResources::getEndMessage() const {
 	}
 }
 
+const char *NoctropolisResources::getMeanwhileMessage() const {
+	switch (_vm->getLanguage()) {
+	case Common::EN_ANY: return "MEANWHILE...";
+	case Common::FR_FRA: return "PENDANT CE TEMPS...";
+	case Common::ES_ESP: return "MIENTRAS...";
+	case Common::DE_DEU: return "INZWISCHEN...";
+	default: error("Unsupported language for meanwhile message");
+	}
+}
+
+const char *NoctropolisResources::getShotoTitle() const {
+	switch (_vm->getLanguage()) {
+	case Common::EN_ANY: return "MS. SHOTO";
+	case Common::FR_FRA: return "Mme SHOTO";
+	case Common::ES_ESP: return "SRA. SHOTO";
+	case Common::DE_DEU: return "MS. SHOTO";
+	default: error("Unsupported language for ms shoto title");
+	}
+}
+
+const char *NoctropolisResources::getShotoText() const {
+	switch (_vm->getLanguage()) {
+	case Common::EN_ANY: return "He was just here....\nHe's better than we thought.";
+	case Common::FR_FRA: return "Il sort d'ici ... l'instant...\nIl est meilleur que nous pensions.";
+	case Common::ES_ESP: return "Ha estado aqui...\nEsta mejor de lo que pensabamos.";
+	case Common::DE_DEU: return "Er war gerade hier...\nEr ist besser, als wir dachten.";
+	default: error("Unsupported language for ms shoto text");
+	}
+}
+
 const char *NoctropolisResources::getStilEndMessage() const {
 	switch (_vm->getLanguage()) {
 	case Common::EN_ANY: return "Don't worry about me, Peter. You know I'll\nsupport whatever you've got planned.";
@@ -1986,6 +2108,25 @@ const char *NoctropolisResources::getStilEndMessage() const {
 	}
 }
 
+const char *NoctropolisResources::getResponseTitle() const {
+	switch (_vm->getLanguage()) {
+	case Common::EN_ANY: return "RESPONSE %d";
+	case Common::FR_FRA: return "REPONSE %d";
+	case Common::ES_ESP: return "RESPUESA %d";
+	case Common::DE_DEU: return "ANTWORT %d";
+	default: error("Unsupported language for response title");
+	}
+}
+
+const ComicResource *NoctropolisResources::getLastComicResource() const {
+	warning("TODO: Get comic resource for LastPages");
+	return nullptr;
+}
+
+const ComicResource *NoctropolisResources::getSpecialComicResource() const {
+	warning("TODO: Get comic resource for LastPages");
+	return nullptr;
+}
 
 } // end namespace Noctropolis
 
diff --git a/engines/access/noctropolis/noctropolis_resources.h b/engines/access/noctropolis/noctropolis_resources.h
index 56a50518196..2d256cec103 100644
--- a/engines/access/noctropolis/noctropolis_resources.h
+++ b/engines/access/noctropolis/noctropolis_resources.h
@@ -28,15 +28,21 @@
 namespace Access {
 
 class Font;
-
 namespace Noctropolis {
 
 class NoctropolisEngine;
+class ComicResource;
 
 extern const byte ICON_PALETTE[];
 
 extern const int16 MENU_POLYS[];
 
+extern const int16 TRAV_ROOMS[];
+
+extern const int16 TRAV_MAN_POS[];
+
+extern const int16 TRAV_ICONS[];
+
 class NoctropolisResources : public Resources {
 public:
 	NoctropolisResources(AccessEngine *_vm);
@@ -55,7 +61,14 @@ public:
 	const char *getGeneralMessage(int command) const override;
 
 	const char *getEndMessage() const;
+	const char *getMeanwhileMessage() const;
+	const char *getShotoTitle() const;
+	const char *getShotoText() const;
 	const char *getStilEndMessage() const;
+	const char *getResponseTitle() const;
+
+	const ComicResource *getLastComicResource() const;
+	const ComicResource *getSpecialComicResource() const;
 
 	int menuPolygonAt(int16 x, int16 y) const;
 


Commit: 86d9963d345dbe692f8a9604eb2d5225235167eb
    https://github.com/scummvm/scummvm/commit/86d9963d345dbe692f8a9604eb2d5225235167eb
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Implement more pieces of Noctropolis

Changed paths:
    engines/access/noctropolis/noctropolis_comicviewer.h
    engines/access/noctropolis/noctropolis_font.h
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/noctropolis/noctropolis_player.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/noctropolis/noctropolis_scripts.cpp
    engines/access/player.cpp
    engines/access/room.cpp
    engines/access/room.h
    engines/access/scripts.cpp
    engines/access/scripts.h


diff --git a/engines/access/noctropolis/noctropolis_comicviewer.h b/engines/access/noctropolis/noctropolis_comicviewer.h
index 65e5e14acf1..8fc08011315 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.h
+++ b/engines/access/noctropolis/noctropolis_comicviewer.h
@@ -31,42 +31,42 @@ namespace Access {
 namespace Noctropolis {
 
 struct ComicPageBubble {
-    byte style;
-    byte textColor;
-    int16 x, y;
-    Common::String text;
+	byte style;
+	byte textColor;
+	int16 x, y;
+	Common::String text;
 };
 
 class PolygonResource : public Resource {
 public:
-    int findPolygonAt(int16 x, int16 y) const;
-    void free();
+	int findPolygonAt(int16 x, int16 y) const;
+	void free();
 protected:
-    PolygonArray _polygons;
-    void internalLoad(Common::SeekableReadStream &source, uint32 size);
+	PolygonArray _polygons;
+	void internalLoad(Common::SeekableReadStream &source, uint32 size);
 };
 
 struct ComicPageHotspot {
-    PolygonResource polygons;
-    int32 soundFileIndex, soundResIndex;
-    Common::Array<ComicPageBubble> bubbles;
+	PolygonResource polygons;
+	int32 soundFileIndex, soundResIndex;
+	Common::Array<ComicPageBubble> bubbles;
 };
 
 struct ComicPage {
-    Common::Path filename;
-    int32 musicFileIndex, musicResIndex;
-    Common::Array<ComicPageHotspot> hotspots;
+	Common::Path filename;
+	int32 musicFileIndex, musicResIndex;
+	Common::Array<ComicPageHotspot> hotspots;
 };
 
 class ComicResource : public Resource {
 public:
-    uint16 getCount() const { return _pages.size(); }
-    const ComicPage *getPage(int index) const { return _pages[index]; }
-    void free();
+	uint16 getCount() const { return _pages.size(); }
+	const ComicPage *getPage(int index) const { return _pages[index]; }
+	void free();
 protected:
-    Common::Array<ComicPage *> _pages;
-    ComicPageHotspot loadHotspot(Common::SeekableReadStream &source);
-    void internalLoad(Common::SeekableReadStream &source, uint32 size);
+	Common::Array<ComicPage *> _pages;
+	ComicPageHotspot loadHotspot(Common::SeekableReadStream &source);
+	void internalLoad(Common::SeekableReadStream &source, uint32 size);
 };
 
 
@@ -81,9 +81,9 @@ class ComicViewer {
 public:
 	ComicViewer(NoctropolisEngine *vm);
 	~ComicViewer();
-	
+
 	void run(const ComicResource *comic);
-	
+
 protected:
 	NoctropolisEngine *_vm;
 	ComicResource *_comic;
diff --git a/engines/access/noctropolis/noctropolis_font.h b/engines/access/noctropolis/noctropolis_font.h
index e003e4502ed..9b28b851cf3 100644
--- a/engines/access/noctropolis/noctropolis_font.h
+++ b/engines/access/noctropolis/noctropolis_font.h
@@ -48,7 +48,7 @@ public:
 	NoctropolisFont(uint16 bytes, int16 height, byte firstchar, byte lastchar, const uint16 *offsets, const byte *data);
 
 private:
-    void load(const uint16 *offsets, const byte *data);
+	void load(const uint16 *offsets, const byte *data);
 	const byte *getCharDataPtr(byte ch, const uint16 *offsets, const byte *data) const;
 	uint getCharBitOffset(byte ch, const uint16 *offsets) const;
 	uint getCharWidth(byte ch, const uint16 *offsets) const;
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index a3f4d2fbe24..9118e97d3eb 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -22,6 +22,8 @@
 #include "access/noctropolis/noctropolis_game.h"
 #include "access/noctropolis/noctropolis_room.h"
 #include "access/noctropolis/noctropolis_scripts.h"
+#include "access/noctropolis/noctropolis_resources.h"
+#include "access/noctropolis/noctropolis_comicviewer.h"
 #include "image/png.h"
 #include "graphics/color_quantizer.h"
 #include "common/config-manager.h"
@@ -32,7 +34,8 @@ namespace Noctropolis {
 
 
 NoctropolisEngine::NoctropolisEngine(OSystem *syst, const AccessGameDescription *gameDesc) :
-AccessEngine(syst, gameDesc), _invScript(nullptr), _stil(nullptr)
+AccessEngine(syst, gameDesc), _invScript(nullptr), _stil(nullptr), _loadFlag(false),
+_travScrollX(0), _travScrollY(0), _travScrollCol(0), _travScrollRow(0)
 {
 }
 
@@ -83,6 +86,12 @@ void NoctropolisEngine::initVariables() {
 	_events->setNormalCursor(CURSOR_ARROW);
 	_mouseMode = 0;
 	_animation->clearTimers();
+
+	// This is Noct_InitTravel in the original
+	_travScrollRow = 15;
+	_travScrollCol = 0;
+	_travScrollX = 0;
+	_travScrollY = 0;
 }
 
 void NoctropolisEngine::playGame() {
@@ -96,7 +105,7 @@ void NoctropolisEngine::playGame() {
 
 		_events->getAction(action);
 		keepGoing &= (action != kActionSkip);
-		
+
 		if (keepGoing)
 			doPublisherLogo();
 		if (shouldQuit())
@@ -104,7 +113,7 @@ void NoctropolisEngine::playGame() {
 
 		_events->getAction(action);
 		keepGoing &= (action != kActionSkip);
-		
+
 		if (keepGoing)
 			doIntro();
 		if (shouldQuit())
@@ -130,9 +139,15 @@ void NoctropolisEngine::playGame() {
 		// Execute the room
 		_room->doRoom();
 	} while (_restartFl);
-	
 }
 
+
+Common::Error NoctropolisEngine::loadGameState(int slot) {
+	_loadFlag = true;
+	return AccessEngine::Engine::loadGameState(slot);
+}
+
+
 void NoctropolisEngine::doFlashLogo() {
 	_events->hideCursor();
 
@@ -278,7 +293,7 @@ void NoctropolisEngine::doIntro() {
 				}
 
 			}
-			
+
 			if (skylineSpriteOfsX1 > -100) {
 				_buffer2.plotImage(sprites, 0, Common::Point(skylineSpriteOfsX1, 60));
 				skylineSpriteOfsX1 -= 5;
@@ -312,6 +327,397 @@ void NoctropolisEngine::doIntro() {
 	delete sprites;
 }
 
+void NoctropolisEngine::doTravel() {
+	_events->setCursor(CURSOR_ARROW);
+	_player->_playerOff = true;
+	_stil->_playerOff = true;
+
+	// Original starts music and video fade at the same time.  our fadeOut is
+	// synchronous so start the music fade first.
+	_midi->startMusicFade();
+	_screen->fadeOut();
+
+	// This section is "state 0" in NoctTravelEngine::ticker
+	_room->clearRoom();
+	_midi->loadMusic(98, 0x1b);
+	_midi->midiRepeat();
+	_midi->midiPlay();
+
+	//loadPlayField(0, 0); //??
+	_screen->setIconPalette();
+	_scrollRow = _travScrollRow;
+	_scrollCol = _travScrollCol;
+	_scrollX = _travScrollX;
+	_scrollY = _travScrollY;
+	Resource *spriteData = _files->loadFile(0, 1);
+	_objectsTable[0] = new SpriteResource(this, spriteData);
+	delete spriteData;
+
+	// This section is "state 1" in NoctTravelEngine::ticker
+	_screen->setPaletteCycle(0xb5, 0xbe, 5);
+	_screen->fadeIn();
+
+	Common::Point rawMouse;
+	int locFlag = -1;
+	// Show the map and wait for clicks
+	while (!shouldQuitOrRestart()) {
+		_midi->midiRepeat();
+
+		// TODO: check me.. is buildScreen equivalent??
+		//NoctPF_RenderPlayfield();
+		_room->buildScreen();
+
+		_player->calcPlayer();
+
+		for (int i = 0; i < 15; i++) {
+			if (_travel[i]) {
+				int imgNum = TRAV_ICONS[i * 3];
+				int x = TRAV_ICONS[i * 3 + 1];
+				int y = TRAV_ICONS[i * 3 + 2];
+				Common::Point pt(x - _screen->_bufferStart.x, y - _screen->_bufferStart.y);
+				_buffer2.plotImage(_objectsTable[0], imgNum, pt);
+			}
+		}
+		copyBF2Vid();
+
+		_screen->cyclePaletteForward();
+		locFlag = -1;
+		rawMouse = _events->calcRawMouse();
+		int boxResult = _room->checkBoxes1(rawMouse);
+		if (boxResult != -1 && _travel[boxResult])
+			locFlag = boxResult;
+
+		if (!_events->_leftButton || locFlag == -1) {
+			int scrolly = _scrollY;
+
+			// TODO: Clean up these if()s a bit
+			if (rawMouse.y < 33) {
+				if (_scrollRow != 0 && (scrolly = _scrollY + -8, (_scrollY + -8) < 0)) {
+					int row = _scrollRow + -1;
+					scrolly = _scrollY + 8;
+					_scrollRow = 0;
+					if (-1 < row)
+						_scrollRow = row;
+				}
+			} else if (367 < rawMouse.y &&
+						(_screen->_vWindowHeight + _scrollRow != _room->_playFieldHeight) &&
+					   (scrolly = _scrollY + 8, 0xf < (_scrollY + 8))) {
+				scrolly = _scrollY + -8;
+				_scrollRow = _scrollRow + 1;
+			}
+		}
+
+		_events->pollEventsAndWait();
+	}
+
+	// This is NoctTravelEngine::done
+	_screen->fadeOut();
+	_travScrollRow = _scrollRow;
+	_travScrollCol = _scrollCol;
+	_travScrollX = _scrollX;
+	_travScrollY = _scrollY;
+	assert(locFlag < 15);
+	_player->_roomNumber = TRAV_ROOMS[locFlag];
+	_player->_rawPlayer.x = TRAV_MAN_POS[locFlag * 2];
+	_player->_rawPlayer.y = TRAV_MAN_POS[locFlag * 2 + 1];
+	_player->_moveTo = _player->_rawPlayer;
+	setStilettoPos();
+	_room->clearRoom();
+}
+
+static const short StilYDirOff[] = {
+	10, 10, 10, 10, 5, 5, 10, 10, 10,
+};
+
+void NoctropolisEngine::setStilettoPos() {
+	_stil->_playerDirection = _player->_playerDirection;
+	int dir = _player->_playerDirection;
+	_stil->_moveTo = _player->_rawPlayer;
+	// The original has a table for X index into the scale table here, but it
+	// in practice evaluates to 30.  There is also some weird double-negation.
+	if (dir < 5) {
+		_stil->_moveTo.x -= _screen->_scaleTable1[30];
+		_stil->_moveTo.y -= _screen->_scaleTable1[StilYDirOff[dir]];
+	} else if (dir == 5) {
+		_stil->_moveTo.x += _screen->_scaleTable1[30];
+		_stil->_moveTo.y -= _screen->_scaleTable1[StilYDirOff[dir]];
+	} else {
+		_stil->_moveTo.x += _screen->_scaleTable1[30];
+		_stil->_moveTo.y += _screen->_scaleTable1[StilYDirOff[dir]];
+	}
+
+	_stil->_rawPlayer = _stil->_moveTo;
+}
+
+
+void NoctropolisEngine::dead(int deathType) {
+	// aka DeadMeat1
+	/*
+	static const struct { int16 x, y; } deathVideoPos[] = {
+		{167, 21},
+		{161, 22},
+		{186, 29},
+		{180, 29},
+		{194, 37},
+		{215, 93},
+		{215, 93},
+		{227, 0}
+	};
+
+	int16 deathTextX = deathType == 8 ? 80 : 130;
+	int16 deathTextY = deathType == 8 ? 310 : 220;
+	const char *deathScreenBackground =
+		(deathType == 6 || deathType == 12 || deathType == 7 || deathType == 8)
+		? "death1.scn" : "death.scn";
+	const char *deathTextCaption =
+		(deathType == 6 || deathType == 12 || deathType == 7)
+		? "IMPRISONED" : "DEAD";
+	int videoIndex;
+
+	NoctropolisDeathResource *deathTable = new NoctropolisDeathResource();
+	StringResource *deathVideoFilenames = new StringResource();
+
+	_res->load(deathTable, GID_NOCTROPOLIS, kResDeathTable, 0);
+	_res->load(deathVideoFilenames, GID_NOCTROPOLIS, kResStringTable, 5);
+
+	videoIndex = deathTable->getVideoIndex(deathType);
+
+	// TODO: Stop current music and play death music
+	_screen->fadeOut();
+
+	_vgaScreen->lock();
+	showScreen(deathScreenBackground);
+	drawTextBox(deathTextX, deathTextY, kTextBoxPlain | kTextBoxCaption,
+		deathTable->getText(deathType), deathTextCaption);
+	_vgaScreen->unlock();
+
+	copySystemPalette();
+	fadeToPalette();
+
+	playVideo((const char*)deathVideoFilenames->getString(videoIndex),
+		deathVideoPos[videoIndex].x, deathVideoPos[videoIndex].y, false, false);
+
+	waitUntilAnyButtonIsClicked();
+	restoreTextBoxRect();
+
+	delete deathTable;
+	delete deathVideoFilenames;
+	*/
+	// TODO: Restart game or something
+	error("TODO: Finish implementing NoctropolisEngine::dead(%d)", deathType);
+}
+
+void NoctropolisEngine::initMinigame() {
+	static const byte minigameInitialConfig[9] = {2, 8, 9, 5, 6, 4, 1, 7, 3};
+	memcpy(_minigameCurrentConfig, minigameInitialConfig, 9);
+	_flags[91] = 0;
+}
+
+void NoctropolisEngine::displayPegsTick() {
+	static const byte redSol[3] = {9, 6, 3};
+	static const byte greenSol[3] = {2, 5, 8};
+	static const byte blueSol[3] = {1, 4, 7};
+	static const struct { int16 x, y; } pegPos[10] = {
+		{255, 201}, {143, 211},
+		{27, 57}, {249, 56},
+		{141, 174}, {67, 75},
+		{210, 75}, {140, 137},
+		{107, 94}, {170, 94}
+	};
+
+	// Check if the game is solved
+	if (_flags[91])
+		return;
+
+	if (minigameIsSolved(0, redSol) &&
+		minigameIsSolved(3, greenSol) &&
+		minigameIsSolved(6, blueSol)) {
+		debug("Minigame solved!");
+		_flags[91] = 1;
+		return;
+	}
+
+	for (uint i = 0; i < 9; i++) {
+		ImageEntry ie;
+		ie._spritesPtr = _objectsTable[65];
+		ie._frameNumber = i / 3;
+		ie._position.x = pegPos[_minigameCurrentConfig[i]].x + 181 - 4;
+		ie._position.y = pegPos[_minigameCurrentConfig[i]].y + 116 - 3;
+		ie._offsetY = 7;
+		//spriteDrawItem.flags = 8; // Why? Scaling is 0! CHECKME
+		//spriteDrawItem.scaling;
+		_images.addToList(ie);
+	}
+}
+
+void NoctropolisEngine::movePeg(int16 slot) {
+	static const struct { int16 a, b; } pegPath[] = {
+		{0, 1}, {1, 2}, {1, 5}, {1, 3}, {2, 3},
+		{2, 6}, {3, 4}, {4, 5}, {4, 8}, {4, 6},
+		{5, 6}, {5, 9}, {6, 7}, {7, 8}, {8, 9},
+		{9, 7}, {0xFF, 0xFF}
+	};
+
+	for (uint i = 0; i < 9; i++) {
+		if (_minigameCurrentConfig[i] == slot) {
+			for (uint mapIndex = 0; pegPath[mapIndex].a != 0xFF; mapIndex++) {
+				if (pegPath[mapIndex].a == slot || pegPath[mapIndex].b == slot) {
+					int16 a = (pegPath[mapIndex].a == slot) ? pegPath[mapIndex].b : pegPath[mapIndex].a;
+					uint index = 9;
+					bool done = false;
+					for (uint j = 0; !done && _minigameCurrentConfig[j] != a; j++) {
+						if (--index == 0) {
+							_minigameCurrentConfig[i] = a;
+							_sound->playSound(1);
+							done = true;
+						}
+					}
+				}
+			}
+			break;
+		}
+	}
+
+#if 0
+	debug("%d %d %d", _minigameCurrentConfig[0], _minigameCurrentConfig[1], _minigameCurrentConfig[2]);
+	debug("%d %d %d", _minigameCurrentConfig[3], _minigameCurrentConfig[4], _minigameCurrentConfig[5]);
+	debug("%d %d %d", _minigameCurrentConfig[6], _minigameCurrentConfig[7], _minigameCurrentConfig[8]);
+	debug("-------------------");
+#endif
+
+}
+
+bool NoctropolisEngine::minigameIsSolved(uint rowIndex, const byte *finalRow) {
+	// Test if the colors in this 'row' match
+	return
+			(_minigameCurrentConfig[rowIndex] == finalRow[0] ||
+			_minigameCurrentConfig[rowIndex + 1] == finalRow[0] ||
+			_minigameCurrentConfig[rowIndex + 2] == finalRow[0]) &&
+			(_minigameCurrentConfig[rowIndex] == finalRow[1] ||
+			_minigameCurrentConfig[rowIndex + 1] == finalRow[1] ||
+			_minigameCurrentConfig[rowIndex + 2] == finalRow[1]) &&
+			(_minigameCurrentConfig[rowIndex] == finalRow[2] ||
+			_minigameCurrentConfig[rowIndex + 1] == finalRow[2] ||
+			_minigameCurrentConfig[rowIndex + 2] == finalRow[2]);
+}
+
+void NoctropolisEngine::playStilMorph() {
+	_midi->stopSong();
+	_system->showMouse(false);
+	_midi->loadMusic(98, 4);
+	_midi->midiPlay();
+	_screen->fadeOut();
+	_screen->clearScreen();
+	warning("TODO: Implement Noctropolis type video player");
+	//playVideo("VID1\\DRLM00.VID", 118, 118, true, true, true);
+}
+
+void NoctropolisEngine::flashPaletteEffect() {
+	_screen->flashPalette(255);
+	_screen->flashPalette(64);
+	_screen->flashPalette(16);
+}
+
+void NoctropolisEngine::shotoMeanwhile() {
+	_midi->stopSong();
+	_system->showMouse(false);
+	_midi->loadMusic(98, 2);
+	_midi->midiPlay();
+	_screen->fadeOut();
+	_screen->clearScreen();
+	// TODO: Check these colors
+	Font::_fontColors[0] = 0;
+	Font::_fontColors[3] = 244;
+	const char *meanwhileTxt = ((NoctropolisResources *)_res)->getMeanwhileMessage();
+	_fonts._fonts[3]->drawString(_screen, meanwhileTxt, Common::Point(100, 200));
+	_screen->fadeIn();
+	_system->updateScreen();
+	_system->delayMillis(180 * 17);
+	_screen->fadeOut();
+	_screen->clearScreen();
+	_screen->_printOrg = _screen->_printStart = Common::Point(300, 300);
+	_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctPlain);
+	_bubbleBox->_bubbleTitle = ((NoctropolisResources *)_res)->getShotoTitle();
+	_bubbleBox->placeBubble(((NoctropolisResources *)_res)->getShotoText());
+	_events->waitKeyActionMouse();
+	warning("TODO: Implement Noctropolis type video player");
+	//playVideo("VID1\\B126MEAN.VID", 120, 30, false, true, true);
+	_midi->stopSong();
+	_screen->fadeOut();
+	_system->showMouse(true);
+}
+
+void NoctropolisEngine::makeVidPaletteCurrent() {
+	warning("TODO: Implement Noctropolis type video player");
+	//copyPaletteRange(_video->getPalette(), 0, 256);
+	_screen->setPalette();
+}
+
+void NoctropolisEngine::showComicCover() {
+	_midi->stopSong();
+	_midi->loadMusic(98, 1);
+	_midi->midiPlay();
+	_files->loadScreen(Common::Path("comic93.scn"));
+	_screen->setPalette();
+	_system->updateScreen();
+	_system->delayMillis(300 * 17);
+	_midi->stopSong();
+	_screen->fadeOut();
+	_screen->clearScreen();
+}
+
+void NoctropolisEngine::playSuccubusSplit() {
+	_midi->stopSong();
+	_midi->loadMusic(98, 25);
+	_midi->midiPlay();
+	_screen->clearScreen();
+	warning("TODO: Implement Noctropolis type video player");
+	//playVideo("VID1\\SUCSPLT1.VID", 116, 2, false, true);
+	_midi->stopSong();
+	_screen->fadeOut();
+}
+
+void NoctropolisEngine::playSuccubusAttack() {
+	_midi->stopSong();
+	_midi->loadMusic(98, 4);
+	_midi->midiPlay();
+	_screen->fadeOut();
+	_files->loadScreen(Common::Path("scene06.scn")); // "\\DARK\\SCENE06.SCN"
+	_screen->fadeIn();
+	_system->updateScreen();
+	_system->delayMillis(60 * 17);
+	warning("TODO: Implement Noctropolis type video player");
+	//playVideo("VID1\\SUCATT1.VID", 118, 118, false, false);
+	_screen->clearScreen();
+	warning("TODO: Implement Noctropolis type video player");
+	//playVideo("VID1\\SUCATT2.VID", 196, 96, false, false);
+	_sound->playSound(1);
+	_midi->stopSong();
+	_screen->fadeOut();
+}
+
+void NoctropolisEngine::doLastComic() {
+	_midi->stopSong();
+	ComicViewer *viewer = new ComicViewer(this);
+	const ComicResource *comic = ((NoctropolisResources *)_res)->getLastComicResource();
+	viewer->run(comic);
+	delete viewer;
+	delete comic;
+	_screen->fadeOut();
+}
+
+void NoctropolisEngine::doSpecialComic() {
+	_midi->stopSong();
+	ComicViewer *viewer = new ComicViewer(this);
+	const ComicResource *comic = ((NoctropolisResources *)_res)->getSpecialComicResource();
+	viewer->run(comic);
+	delete viewer;
+	delete comic;
+	_screen->fadeOut();
+}
+
+
+
 } // end namespace Noctropolis
 
 } // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index 68ca640b8e5..a7f7a466580 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -50,13 +50,39 @@ public:
 	~NoctropolisEngine();
 
 	void playGame() override;
-	void dead(int deathId) override {};
+	void dead(int deathId) override;
 	void establish(int esatabIndex, int sub) override {};
+	Common::Error loadGameState(int slot) override;
 
 	virtual int16 getScreenWidth() const override { return 640; }
 	virtual int16 getScreenHeight() const override { return 400; }
 
 	Player *_stil;
+	int _travScrollRow;
+	int _travScrollCol;
+	int _travScrollX;
+	int _travScrollY;
+	bool _loadFlag;
+	byte _minigameCurrentConfig[9];
+
+	void doTravel();
+	void setStilettoPos();
+
+	void initMinigame();
+	void displayPegsTick();
+	void movePeg(int16 slot);
+	bool minigameIsSolved(uint rowIndex, const byte *finalRow);
+
+	// Various functions for cmdSpecial
+	void playStilMorph();
+	void flashPaletteEffect();
+	void shotoMeanwhile();
+	void makeVidPaletteCurrent();
+	void showComicCover();
+	void playSuccubusSplit();
+	void playSuccubusAttack();
+	void doLastComic();
+	void doSpecialComic();
 
 protected:
 	void setupGame() override;
@@ -67,7 +93,7 @@ private:
 	void doFlashLogo();
 	void doPublisherLogo();
 	void initVariables();
-	
+
 	Scripts *_invScript;
 };
 
diff --git a/engines/access/noctropolis/noctropolis_player.cpp b/engines/access/noctropolis/noctropolis_player.cpp
index 71fadf10fd5..febc1a2f881 100644
--- a/engines/access/noctropolis/noctropolis_player.cpp
+++ b/engines/access/noctropolis/noctropolis_player.cpp
@@ -74,15 +74,15 @@ void NoctropolisPlayer::loadAnimation(int fileNum, int subFile) {
  */
 static int _animNumForDir(Direction dir) {
 	switch (dir) {
-    case UP:		return 0;
-    case UPRIGHT: 	return 1;
+	case UP:		return 0;
+	case UPRIGHT: 	return 1;
 	case RIGHT: 	return 2;
 	case DOWNRIGHT: return 3;
-    case DOWN: 		return 4;
+	case DOWN: 		return 4;
 	case DOWNLEFT: 	return 5;
 	case LEFT: 		return 6;
-    case UPLEFT:    return 7;
-    default:	    return -1;
+	case UPLEFT:	return 7;
+	default:		return -1;
 	}
 }
 
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 3d5252910b2..c9857ee5ad2 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -1835,7 +1835,7 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	_vm->_fonts.addFont(_fontGothiceu);
 	_vm->_fonts.addFont(_fontChaletse);
 	_vm->_fonts.addFont(_fontComicseu);
-	
+
 	// Set some default fonts
 	_vm->_fonts._font1 = _fontChaleteu;
 	_vm->_fonts._font2 = _fontSystemeu;
@@ -1948,10 +1948,10 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 		Polygon polygon;
 		int pointsCount = MENU_POLYS[i++];
 		while (pointsCount--) {
-              Common::Point point;
-              point.x = MENU_POLYS[i++];
-              point.y = MENU_POLYS[i++];
-              polygon.points.push_back(point);
+			Common::Point point;
+			point.x = MENU_POLYS[i++];
+			point.y = MENU_POLYS[i++];
+			polygon.points.push_back(point);
 		}
 		_menuPolygons.push_back(polygon);
 	}
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index cf3bb2c33e2..5a189d3efb5 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -78,28 +78,38 @@ void NoctropolisRoom::reloadRoom() {
 }
 
 void NoctropolisRoom::reloadRoom1() {
-	// TODO: Check this. Currently just copied from MartianRoom.
+	// Is this also in the FN_RELOAD part of afterDoCommandsTick
+	NoctropolisEngine *vm = (NoctropolisEngine *)_vm;
+	vm->_events->_interfaceOff = false;
+	vm->_player->_playerMove = false;
+	vm->_player->_playerDirection = Direction::NONE;
+	vm->_stil->_playerDirection = Direction::NONE;
+	vm->_flags[0] = 0;
 	_selectCommand = -1;
-	_vm->_boxSelect = false; //-1
-	_vm->_player->_playerOff = false;
-	_vm->_player->_playerMove = false;
+	vm->_boxSelect = false; //-1
+	vm->_player->_playerOff = false;
+	vm->_stil->_playerOff = false;
 
+	if (!vm->_loadFlag)
+		vm->setStilettoPos();
+
+	vm->_loadFlag = false;
 	_vm->_screen->forceFadeOut();
-	_vm->_events->hideCursor();
 	_vm->_screen->clearScreen();
-	_vm->_events->showCursor();
 	roomInit();
 	_vm->_player->load();
 
-	_vm->_events->hideCursor();
 	_vm->_screen->setBufferScan();
 	setupRoom();
 	setWallCodes();
 	buildScreen();
 	_vm->copyBF2Vid();
 
-	_vm->_screen->setManPalette();
-	_vm->_events->showCursor();
+	if (_roomFlag) {
+		if (_roomFlag & kRoomFlagStiletto)
+			_vm->_screen->setStilPalette();
+		_vm->_screen->setManPalette();
+	}
 	_vm->_player->_frame = 0;
 	_vm->_oldRects.clear();
 	_vm->_newRects.clear();
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index 9244a6118a7..d9219f7cb20 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -70,9 +70,11 @@ void NoctropolisScripts::skipCommand(byte cmd) {
 	}
 }
 
+//
 // Unlike the previous games which just stop at any 0xE0 (SCRIPT_START_BYTE),
 // Noctropolis skips to the next command using argument size.  This avoids
 // mistakes from the 0xE0 appearing accidentally in arguments.
+//
 void NoctropolisScripts::searchForSequence() {
 	assert(_data);
 
@@ -96,50 +98,68 @@ void NoctropolisScripts::searchForSequence() {
 
 
 void NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2) {
+	NoctropolisEngine *vm = ((NoctropolisEngine *)_vm);
 	switch (commandIndex) {
-		case 1:
-			_vm->_screen->fadeOut();
-			break;
-		case 3:
-			error("TODO: Special 3: Call DisplayPegs_Tick");
-		case 4:
-			error("TODO: Special 4: Call MovePeg(%d)", param2);
-		case 5:
-			error("TODO: Special 5: Call SucAttack()");
-		case 6:
-			error("TODO: Special 6: Load DARKSHEER player!");
-		case 7:
-			_vm->_midi->loadMusic(98, param2);
-			break;
-		case 8:
-			error("TODO: Special 8: Dim palette");
-		case 9:
-			error("TODO: Special 9: DimPalette1(0x32,0xc0,0x2b);");
-		case 10:
-			error("TODO: Special 10: StilMorph");
-		case 11:
-			error("TODO: Special 11: Ending");
-		case 12:
-			error("TODO: Special 12: Split");
-		case 13:
-			error("TODO: Special 13: ShotoMean");
-		case 14:
-			error("TODO: Special 14: StingerSeq(0x62, param_2);");
-		case 15:
-			if (!_vm->_midi->isPlaying())
-				_vm->_midi->resume();
-			break;
-		case 17:
-			error("TODO: Special 17: EndGame");
-		case 19:
-			warning("TODO: work our correct step on Special 19 (flashpalette)");
-			_vm->_screen->flashPalette(20);
-		case 20:
-			error("TODO: Special 20: DoLastComic");
-		case 21:
-			error("TODO: Special 20: DoSpecialComic");
-		default:
-			error("TODO: Unknown special %d in NoctropolisScripts::executeSpecial", commandIndex);
+	case 1:
+		vm->_screen->fadeOut();
+		break;
+	case 3:
+		vm->displayPegsTick();
+		break;
+	case 4:
+		vm->movePeg(param1); // todo: should it be param2?
+		break;
+	case 5:
+		vm->playSuccubusAttack();
+		break;
+	case 6:
+		error("TODO: Special 6: Load DARKSHEER player!");
+	case 7:
+		vm->_midi->loadMusic(98, param1);
+		break;
+	case 8:
+		vm->_screen->setDarkPalette(param1 | (param1 << 8), 0, 238);
+		break;
+	case 9:
+		vm->_screen->setDarkPalette(0x3200, 192, 43);
+		break;
+	case 10:
+		vm->playStilMorph();
+		break;
+	case 11:
+		vm->showComicCover();
+		break;
+	case 12:
+		vm->playSuccubusSplit();
+		break;
+	case 13:
+		vm->shotoMeanwhile();
+		break;
+	case 14:
+		// Load some temp music
+		_vm->_midi->newMusic(param1, 0);
+		break;
+	case 15:
+		// Resume previous music
+		if (!_vm->_midi->isPlaying())
+			_vm->_midi->newMusic(0, 1);
+		break;
+	case 17:
+		warning("TODO: Add Nightdive credits here if playing that edition?");
+		// see NoctEndGame::drawer.
+		_vm->quitGame();
+		break;
+	case 19:
+		warning("TODO: work our correct step on Special 19 (flashpalette)");
+		_vm->_screen->flashPalette(20);
+	case 20:
+		vm->doLastComic();
+		break;
+	case 21:
+		vm->doSpecialComic();
+		break;
+	default:
+		error("TODO: Unknown special %d in NoctropolisScripts::executeSpecial", commandIndex);
 	}
 }
 
diff --git a/engines/access/player.cpp b/engines/access/player.cpp
index bf764c42743..dac8fdbd481 100644
--- a/engines/access/player.cpp
+++ b/engines/access/player.cpp
@@ -138,8 +138,7 @@ void Player::load() {
 	if (_manPal1) {
 		if (_vm->getGameID() == kGameNoctropolis) {
 			if (_vm->_room->_roomFlag & kRoomFlagStiletto) {
-				error("TODO: Copy _stilPal in to palette");
-				//Common::copy(_stilPal + 0x1e0, _stilPal + 0x1e0 + 99, _vm->_screen->_manPal);
+				Common::copy(_manPal1 + 0x1e0, _manPal1 + 0x1e0 + 99, _vm->_screen->_stilPal);
 			}
 			Common::copy(_manPal1 + 0x240, _manPal1 + 0x240 + 0x84, _vm->_screen->_manPal);
 		} else {
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 1ec2d7707f6..6eb513fb4dc 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -208,18 +208,31 @@ void Room::doRoom() {
 			if (_vm->shouldQuitOrRestart())
 				return;
 
-			// DOROOMFLASHBACK jump point
+			// DOROOMFLASHBACK jump point in Amazon
+			// afterDoCommandsTick in Noctropolis
+			if (_vm->getGameID() == kGameNoctropolis) {
+				// TODO: Need to check the
+				if (_vm->_flags[200] && !_vm->_timers[0x12]._flag) {
+					warning("TODO: Work out when to call DeadMeat1");
+				}
+			}
+
 			if (_function == FN_CLEAR1) {
+				if (_vm->getGameID() == kGameNoctropolis)
+					_vm->_screen->fadeOut();
 				clearRoom();
 				break;
 			} else if (_function == FN_CLEAR2) {
 				clearRoom();
+				if (_vm->getGameID() == kGameNoctropolis)
+					((Noctropolis::NoctropolisEngine *)_vm)->doTravel();
 				return;
 			} else if (_function == FN_RELOAD) {
 				reloadRoom1();
-				// WORKAROUND: This doesn't seem to restore the palette correctly?
-				// This is only ever used in the abduction scene (special 0)
-				_vm->_screen->setPalette();
+				// WORKAROUND: This doesn't seem to restore the palette
+				// correctly in MM abduction scene (special 0)
+				if (_vm->getGameID() == kGameMartianMemorandum)
+					_vm->_screen->setPalette();
 				reloadFlag = true;
 				break;
 			} else if (_function == FN_BREAK) {
@@ -303,13 +316,19 @@ void Room::clearRoom() {
 }
 
 void Room::loadRoomData(const byte *roomData) {
+	// LoadRoom() in original games
 	RoomInfo roomInfo(roomData, _vm->getGameID(), _vm->isCD(), _vm->isDemo());
 
 	_roomFlag = roomInfo._roomFlag;
 	_palIntensity = roomInfo._palIntensity;
 
-	// TODO: If roomFlag & 2 and noctropolis, load pal files.
-	// (see LoadRoom in noctropolis.)
+	if (_vm->getGameID() == kGameNoctropolis && _roomFlag & kRoomFlagStiletto) {
+		// Load _vm->_screen->_stilPal
+		Resource *stilPal = _vm->_files->loadFile(0xfd, _palIntensity + 6);
+		assert(stilPal->_size <= 99);
+		memcpy(stilPal->data(), _vm->_screen->_stilPal, stilPal->_size);
+		error("TODO: Finish load of Stiletto data - see Noctropolis LoadRoom()");
+	}
 
 	_vm->_establishFlag = false;
 	if (roomInfo._estIndex != -1) {
@@ -320,6 +339,8 @@ void Room::loadRoomData(const byte *roomData) {
 		}
 	}
 
+	// Original games call LoadPlayer1 here
+
 	_vm->_midi->freeMusic();
 	if (roomInfo._musicFile._fileNum != -1) {
 		_vm->_midi->loadMusic(roomInfo._musicFile);
diff --git a/engines/access/room.h b/engines/access/room.h
index 924e28872a1..db001948278 100644
--- a/engines/access/room.h
+++ b/engines/access/room.h
@@ -58,7 +58,7 @@ public:
 	}
 };
 
-enum Function { FN_NONE = 0, FN_CLEAR1 = 1, FN_CLEAR2 = 2, FN_RELOAD = 3, FN_BREAK = 4 };
+enum Function { FN_NONE = 0, FN_CLEAR1 = 1, FN_CLEAR2 = 2, FN_RELOAD = 3, FN_BREAK = 4, FN_5 = 5 };
 
 // room flags for Noctropolis
 enum RoomFlag {
@@ -86,6 +86,7 @@ private:
 	void cycleCommand(int incr);
 
 	bool checkCode(int v1, int v2);
+
 protected:
 	void loadRoomData(const byte *roomData);
 
@@ -100,7 +101,6 @@ protected:
 	void freeTileData();
 
 	int checkBoxes();
-	int checkBoxes1(const Common::Point &pt);
 	int checkBoxes2(const Common::Point &pt, int start, int count);
 	void checkBoxes3();
 
@@ -185,6 +185,8 @@ public:
 	void handleCommand(int commandId);
 
 	void loadPlayField(int fileNum, int subfile);
+
+	int checkBoxes1(const Common::Point &pt);
 };
 
 class RoomInfo {
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 99a8355b398..9bec49343f4 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -338,10 +338,11 @@ void Scripts::cmdEndObject_v3() {
 			}
 			//NoctRoomEngine::setBoxInfo(&_gNoctRoomEngine,0x46,0xcd,"STILETTO",subtitle,3);
 		}
+
 		error("TODO: Finish the special case for cmdEndObject_v3");
 		/*
 		// duck the sound here.. SetRelVolume(0x32);
-		_vm->setRoomVideo(100,100,vidfile,true,false);
+		_vm->playVideo(100,1 00,vidfile,true,false);
 		gNoctRoomVideo.videoEnd = 0;
 		gNoctRoomVideo.field27_0x2a = 0;
 		gNoctRoomVideo.playState = 1;
@@ -495,9 +496,11 @@ void Scripts::cmdPrint_v1() {
 	doCmdPrint_v1(msg);
 }
 
-void Scripts::printString(const Common::String &msg) {
+void Scripts::printString(const Common::String &msg, Common::Point pt) {
 	if (_vm->getGameID() == kGameNoctropolis) {
-		_vm->_screen->_printOrg = _vm->_screen->_printStart = Common::Point(320, 200);
+		if (pt.x == -1)
+			pt = Common::Point(320, 200);
+		_vm->_screen->_printOrg = _vm->_screen->_printStart = pt;
 		_vm->_timers[PRINT_TIMER]._timer = 50;
 		_vm->_timers[PRINT_TIMER]._initTm = 50;
 		++_vm->_timers[PRINT_TIMER]._flag;
@@ -507,7 +510,9 @@ void Scripts::printString(const Common::String &msg) {
 		  _vm->_bubbleBox->_type = (BoxType)(_vm->_bubbleBox->_type | kTextBoxNoctPlain);
 
 	} else if (_vm->getGameID() != kGameMartianMemorandum) {
-		_vm->_screen->_printOrg = _vm->_screen->_printStart = Common::Point(20, 42);
+		if (pt.x == -1)
+			pt = Common::Point(20, 42);
+		_vm->_screen->_printOrg = _vm->_screen->_printStart = pt;
 		_vm->_timers[PRINT_TIMER]._timer = 1;
 		_vm->_timers[PRINT_TIMER]._initTm = 1;
 		++_vm->_timers[PRINT_TIMER]._flag;
@@ -642,8 +647,10 @@ void Scripts::cmdNewRoom() {
 
 	_vm->_room->_function = FN_CLEAR1;
 	_vm->freeChar();
-	if (_vm->getGameID() == kGameNoctropolis)
+	if (_vm->getGameID() == kGameNoctropolis) {
+		_vm->_room->_selectCommand = 0;
 		_vm->_events->setCursor(CURSOR_ARROW);
+	}
 	_vm->_converseMode = 0;
 	cmdRetPos();
 }
@@ -1023,11 +1030,8 @@ void Scripts::cmdDoTravel() {
 }
 
 void Scripts::cmdDoTravel_Noct() {
-	_vm->_events->setCursor(CURSOR_ARROW);
-	_vm->_player->_playerOff = true;
-	((Noctropolis::NoctropolisEngine *)_vm)->_stil->_playerOff = true;
+	((Noctropolis::NoctropolisEngine *)_vm)->doTravel();
 	cmdRetPos();
-	error("TODO: Finish Noct style cmdTravel");
 }
 
 void Scripts::cmdHelp_v1() {
@@ -1137,14 +1141,15 @@ void Scripts::cmdCharSpeak_v3() {
 
 	Common::String str = _data->readString();
 	debugC(1, kDebugScripts, "cmdCharSpeak(%d, %d, str=\"%s\")", x, y, str.c_str());
-	_vm->_bubbleBox->placeBubble(str);
+	if (_vm->_textFlag)
+		_vm->_bubbleBox->placeBubble(str);
 	findNull();
 }
 
 void Scripts::cmdPlayerSpeak() {
 	int16 x = _data->readUint16LE();
 	int16 y = _data->readUint16LE();
-	
+
 	const char *title = _vm->_res->getEgoName();
 	Common::String str = _data->readString();
 	debugC(1, kDebugScripts, "cmdPlayerSpeak(%d, %d, \"%s\", \"%s\")", x, y, title, str.c_str());
@@ -1163,7 +1168,60 @@ void Scripts::cmdPlayerSpeak() {
 
 
 void Scripts::cmdPlayerChoice() {
-	error("TODO: cmdPlayerChoice()");
+	// This is similar to cmdTexChoice but used in Noctropolis
+	assert(_vm->getGameID() == kGameNoctropolis);
+
+	int16 x = _data->readUint16LE();
+	int16 startY = _data->readUint16LE();
+
+	Common::Array<Common::String> choiceStrs;
+	for (int i = 0; i < 6; i++) {
+		Common::String tmpStr;
+		tmpStr = _data->readString();
+		if (!tmpStr.empty())
+			choiceStrs.push_back(tmpStr);
+	}
+
+	debugC(1, kDebugScripts, "cmdPlayerChoice(%d, %d, ..(%d choices)..)", x, startY, choiceStrs.size());
+
+	_vm->_events->setCursor(CURSOR_ARROW);
+	const char *respTitle = ((Noctropolis::NoctropolisResources *)_resource)->getResponseTitle();
+	Common::Array<Common::Rect> responseCoords;
+
+	for (uint i = 0; i < choiceStrs.size(); i++) {
+		_vm->_bubbleBox->_bubbleDisplStr = Common::String::format(respTitle, i + 1);
+		_vm->_bubbleBox->calcBubble(choiceStrs[i]);
+		_vm->_bubbleBox->printBubble(choiceStrs[i]);
+		responseCoords.push_back(_vm->_bubbleBox->_bounds);
+		_vm->_screen->_printOrg.y = _vm->_bubbleBox->_bounds.bottom + startY;
+		startY = _vm->_bubbleBox->_bounds.bottom + 10;
+	}
+
+	int choice = -1;
+	do {
+		_vm->_events->pollEvents();
+		if (_vm->shouldQuit())
+			return;
+
+		charLoop();
+
+		_vm->_bubbleBox->_bubbleDisplStr = _vm->_bubbleBox->_bubbleTitle;
+		if (_vm->_events->_leftButton) {
+			if (_vm->_events->_mouseRow >= ((_vm->getGameID() == kGameMartianMemorandum) ? 23 : 22)) {
+				_vm->_events->debounceLeft();
+				int x = _vm->_events->_mousePos.x;
+				choice = _vm->_res->inButtonXRange(x);
+			} else {
+				_vm->_events->debounceLeft();
+				choice = _vm->_events->checkMouseBox1(responseCoords);
+			}
+		}
+	} while (choice == -1);
+
+	_choice = choice + 1;
+	_vm->_bubbleBox->clearBubbles();
+
+	_vm->_room->_conFlag = true;
 }
 
 void Scripts::cmdTexSpeak() {
@@ -1474,7 +1532,16 @@ void Scripts::cmdEndVideo() {
 }
 
 void Scripts::cmdDigitalPlay() {
-	error("TODO: Implement Scripts::cmdDigitalPlay");
+	// Wait until the current sound has finished playing, then
+	// if subtitles are enabled wait for input
+	debugCN(1, kDebugScripts, "cmdDigitalPlay()");
+	while (_vm->_sound->isSFXPlaying() && !_vm->shouldQuit()) {
+		_vm->_events->pollEventsAndWait();
+	}
+
+	if (!_vm->_sound->isSFXPlaying() && !_vm->shouldQuit() && _vm->_textFlag)
+		_vm->_events->waitKeyActionMouse();
+
 	_vm->_room->_conFlag = true;
 }
 
@@ -1498,6 +1565,13 @@ void Scripts::cmdPlayVid1() {
 }
 
 void Scripts::cmdCharWait() {
+	int x = _data->readSint16LE();
+	int y = _data->readUint16LE();
+	Common::String msg = _data->readString();
+	debugCN(1, kDebugScripts, "cmdCharWait(%d, %d, '%s')", x, y, msg.c_str());
+
+	printString(msg);
+	_vm->_room->_conFlag = true;
 	error("TODO: Implement Scripts::cmdCharWait");
 }
 
@@ -1506,7 +1580,8 @@ void Scripts::cmdUndoText() {
 
 	// TODO: Restore music volume to 100%
 
-	_vm->_bubbleBox->clearBubbles();
+	if (_vm->_textFlag)
+		_vm->_bubbleBox->clearBubbles();
 }
 
 void Scripts::cmdResetAnim() {
@@ -1632,11 +1707,11 @@ void Scripts::cmdSetCoords() {
 	const int x = _data->readSint16LE();
 	const int y = _data->readSint16LE();
 	debugC(1, kDebugScripts, "cmdSetCoords(x=%d, y=%d)", x, y);
-	_vm->_player->_playerX = x;
+	_vm->_player->_rawPlayer.x = x;
 	_vm->_player->_moveTo.x = x;
 	_vm->_player->checkScroll();
 	bool hscroll = _vm->_player->_scrollFlag;
-	_vm->_player->_playerY = y;
+	_vm->_player->_rawPlayer.y = y;
 	_vm->_player->_moveTo.y = y;
 	_vm->_player->checkScroll();
 	_vm->_player->_scrollFlag |= hscroll;
diff --git a/engines/access/scripts.h b/engines/access/scripts.h
index 13f4d751344..2d85c65438f 100644
--- a/engines/access/scripts.h
+++ b/engines/access/scripts.h
@@ -142,7 +142,7 @@ protected:
 	void cmdFadeOut();
 	void cmdEndVideo();
 	void cmdHelp_v1();
-	void cmdHelp_v2();
+	//void cmdHelp_v2(); // only in AmazonScripts
 	void cmdCycleBack();
 	void cmdSetHelp();
 	void cmdDoTravel_Noct();
@@ -207,10 +207,11 @@ public:
 	void findNull();
 	void doCmdPrint_v1(const Common::String &msg);
 
+
 	/**
 	 * Print a given message to the screen in a bubble box
 	 */
-	void printString(const Common::String &msg);
+	void printString(const Common::String &msg, Common::Point pt = Common::Point(-1, -1));
 
 	// Script commands that need to be public
 	void cmdFreeSound();


Commit: 41da7e27b3d68873128e3811fcf90b0c9f2d059e
    https://github.com/scummvm/scummvm/commit/41da7e27b3d68873128e3811fcf90b0c9f2d059e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix some variable shadowing

Changed paths:
    engines/access/noctropolis/noctropolis_font.cpp
    engines/access/scripts.cpp


diff --git a/engines/access/noctropolis/noctropolis_font.cpp b/engines/access/noctropolis/noctropolis_font.cpp
index c2cb71728d4..19bc7cb4ded 100644
--- a/engines/access/noctropolis/noctropolis_font.cpp
+++ b/engines/access/noctropolis/noctropolis_font.cpp
@@ -54,7 +54,7 @@ uint NoctropolisFont::getCharBitOffset(byte ch, const uint16 *offsets) const {
 	return offsets[ch - _firstCharIndex];
 }
 
-void NoctropolisFont::makeCharSurface(Graphics::Surface &surface, byte ch, const uint16 *offsets, const byte *data) const {
+void NoctropolisFont::makeCharSurface(Graphics::Surface &surface, byte ch, const uint16 *offsets, const byte *fontData) const {
 	uint width = getCharWidth(ch, offsets);
 
 	surface.create(width, _height, Graphics::PixelFormat::createFormatCLUT8());
@@ -63,7 +63,7 @@ void NoctropolisFont::makeCharSurface(Graphics::Surface &surface, byte ch, const
 	if (width == 0)
 		return;
 
-	const byte *charData = getCharDataPtr(ch, offsets, data);
+	const byte *charData = getCharDataPtr(ch, offsets, fontData);
 	uint height = _height;
 	uint bitOfs = getCharBitOffset(ch, offsets);
 	byte *pixels = (byte*)surface.getPixels();
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 9bec49343f4..ddad15167c7 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -1209,8 +1209,8 @@ void Scripts::cmdPlayerChoice() {
 		if (_vm->_events->_leftButton) {
 			if (_vm->_events->_mouseRow >= ((_vm->getGameID() == kGameMartianMemorandum) ? 23 : 22)) {
 				_vm->_events->debounceLeft();
-				int x = _vm->_events->_mousePos.x;
-				choice = _vm->_res->inButtonXRange(x);
+				int mouseX = _vm->_events->_mousePos.x;
+				choice = _vm->_res->inButtonXRange(mouseX);
 			} else {
 				_vm->_events->debounceLeft();
 				choice = _vm->_events->checkMouseBox1(responseCoords);


Commit: e7afe42ee384849dc18ce8f2880aa939ceb96450
    https://github.com/scummvm/scummvm/commit/e7afe42ee384849dc18ce8f2880aa939ceb96450
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add comic data for Noctropolis

Changed paths:
  A engines/access/noctropolis/noctropolis_last_comic.cpp
  A engines/access/noctropolis/noctropolis_last_comic.h
  A engines/access/noctropolis/noctropolis_special_comic.cpp
  A engines/access/noctropolis/noctropolis_special_comic.h
    engines/access/module.mk
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_comicviewer.h
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_resources.h
    engines/access/noctropolis/noctropolis_room.cpp


diff --git a/engines/access/module.mk b/engines/access/module.mk
index 87bf9fe1430..7ca7924f999 100644
--- a/engines/access/module.mk
+++ b/engines/access/module.mk
@@ -38,9 +38,11 @@ MODULE_OBJS := \
 	noctropolis/noctropolis_font.o \
 	noctropolis/noctropolis_game.o \
 	noctropolis/noctropolis_player.o \
+	noctropolis/noctropolis_last_comic.o \
 	noctropolis/noctropolis_resources.o \
 	noctropolis/noctropolis_room.o \
 	noctropolis/noctropolis_scripts.o \
+	noctropolis/noctropolis_special_comic.o \
 	martian/midiparser_bemd.o \
 	video/movie_decoder.o
 
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index e75384075ea..c642a10e206 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -32,7 +32,7 @@ int PolygonResource::findPolygonAt(int16 x, int16 y) const {
 	}
 	return -1;
 }
-      
+
 void PolygonResource::internalLoad(Common::SeekableReadStream &source, uint32 size) {
 	int polygonCount = source.readUint32LE();
 	while (polygonCount--) {
@@ -47,15 +47,21 @@ void PolygonResource::internalLoad(Common::SeekableReadStream &source, uint32 si
 		_polygons.push_back(polygon);
 	}
 }
-  
+
 void PolygonResource::free() {
 	_polygons.clear();
 }
 
 ////////////////
 
-ComicViewer::ComicViewer(NoctropolisEngine *vm) : _vm(vm)
-{
+ComicResource::ComicResource(const ComicPage *pages[], int npages) {
+	for (int i = 0; i < npages; i++)
+		_pages.push_back(pages[i]);
+}
+
+////////////////
+
+ComicViewer::ComicViewer(NoctropolisEngine *vm) : _vm(vm) {
 }
 
 ComicViewer::~ComicViewer() {
@@ -64,7 +70,7 @@ ComicViewer::~ComicViewer() {
 void ComicViewer::run(const ComicResource *comic) {
 	PageResult result = kPageResultNone;
 	_currPage = 0;
-	
+
 	debug("ComicViewer::run() getCount() = %d", comic->getCount());
 
 	while (result != kPageResultExit) {
@@ -96,7 +102,7 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 	//vgaScreen->drawScreen(pagePicture, 640, 400);
 
 	while (result == kPageResultNone) {
-	
+
 		_vm->_events->pollEvents();
 		_vm->_events->delayUntilNextFrame();
 
@@ -118,9 +124,9 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 		}
 
 		int hotspotIndex = -1;
-		for (uint i = 0; i < page->hotspots.size(); i++) {
-			const ComicPageHotspot &hotspot = page->hotspots[i];
-			if (hotspot.polygons.findPolygonAt(_vm->_events->_mousePos.x, _vm->_events->_mousePos.y) != -1) {
+		for (int i = 0; i < page->numBlocks; i++) {
+			const ComicBlock &hotspot = page->blocks[i];
+			if (hotspot.polygon->pointInside(_vm->_events->_mousePos.x, _vm->_events->_mousePos.y)) {
 				hotspotIndex = i;
 				break;
 			}
@@ -130,10 +136,10 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 			_vm->_events->setCursor(CURSOR_CROSSHAIRS);
 			if (_vm->_events->_leftButton) {
 				_vm->_events->debounceLeft();
-				const ComicPageHotspot &hotspot = page->hotspots[hotspotIndex];
+				const ComicBlock &hotspot = page->blocks[hotspotIndex];
 				// TODO: Play hotspot sound
-				for (uint bubbleIndex = 0; bubbleIndex < hotspot.bubbles.size(); bubbleIndex++) {
-					const ComicPageBubble &bubble = hotspot.bubbles[bubbleIndex];
+				for (int bubbleIndex = 0; bubbleIndex < hotspot.numBoxes; bubbleIndex++) {
+					const ComicBox &bubble = hotspot.boxes[bubbleIndex];
 					drawBubble(bubble);
 					_vm->_events->waitKeyActionMouse();
 					//_vm->drawScreen(pagePicture, 640, 400);
@@ -142,14 +148,13 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 		} else {
 			_vm->_events->setCursor(CURSOR_ARROW);
 		}
-		
+
 		if (_vm->_events->_rightButton) {
 			result = kPageResultExit;
 			_vm->_events->debounceLeft();
 		}
 
 		_vm->_events->delay();
-
 	}
 
 	delete _bubbleSprites;
@@ -158,7 +163,7 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 
 }
 
-void ComicViewer::drawBubble(const ComicPageBubble &bubble) {
+void ComicViewer::drawBubble(const ComicBox &bubble) {
 
 	static const struct {
 		struct { int16 px, py; } positions[4];
@@ -181,15 +186,24 @@ void ComicViewer::drawBubble(const ComicPageBubble &bubble) {
 		font = _vm->_fonts.getFont(6);
 	}
 
-	textWidth = font->stringWidth(bubble.text);
-	textHeight = font->stringHeight(bubble.text);
+	const char *text;
+	switch (_vm->getLanguage()) {
+	case Common::EN_ANY: text = bubble.msgEn; break;
+	case Common::FR_FRA: text = bubble.msgFr; break;
+	case Common::ES_ESP: text = bubble.msgEs; break;
+	case Common::DE_DEU: text = bubble.msgDe; break;
+	default: error("Unsupported language in drawBubble");
+	}
+
+	textWidth = font->stringWidth(text);
+	textHeight = font->stringHeight(text);
 
 	if (bubble.style == 0) {
 		_vm->_screen->fillRect(Common::Rect(bubble.x - 4, bubble.y - 4, bubble.x + 4 + textWidth, bubble.y + 4 + textHeight), 243);
 		_vm->_screen->frameRect(Common::Rect(bubble.x - 4, bubble.y - 4, bubble.x + 4 + textWidth, bubble.y + 4 + textHeight), 244);
 		// TODO: is this color the one to set?
 		Font::_fontColors[0] = bubble.textColor;
-		font->drawString(_vm->_screen, bubble.text, Common::Point(bubble.x, bubble.y));
+		font->drawString(_vm->_screen, text, Common::Point(bubble.x, bubble.y));
 	} else {
 
 		int spriteIndex1, spriteIndex2, style, defIndex;
@@ -210,7 +224,7 @@ void ComicViewer::drawBubble(const ComicPageBubble &bubble) {
 			defIndex = 1;
 		else
 			defIndex = 2;
-		
+
 		bubbleX += kBubbleDef[defIndex].positions[style].px;
 		bubbleY += kBubbleDef[defIndex].positions[style].py;
 
@@ -227,11 +241,11 @@ void ComicViewer::drawBubble(const ComicPageBubble &bubble) {
 			spriteIndex2 = kBubbleDef[defIndex].sprites[2];
 			spriteIndex1 += 9;
 		}
-		
+
 		_vm->_screen->plotImage(_bubbleSprites, spriteIndex2, Common::Point(bubble.x, bubble.y));
 		_vm->_screen->plotImage(_bubbleSprites, spriteIndex1, Common::Point(bubbleX, bubbleY));
 		Font::_fontColors[0] = textColor;
-		font->drawString(_vm->_screen, bubble.text, Common::Point(bubble.x + 7, bubble.y + 10));
+		font->drawString(_vm->_screen, text, Common::Point(bubble.x + 7, bubble.y + 10));
 
 	}
 
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.h b/engines/access/noctropolis/noctropolis_comicviewer.h
index 8fc08011315..15f0835ed7a 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.h
+++ b/engines/access/noctropolis/noctropolis_comicviewer.h
@@ -22,6 +22,7 @@
 #ifndef ACCESS_NOCTROPOLIS_NOCTROPOLIS_COMICVIEWER_H
 #define ACCESS_NOCTROPOLIS_NOCTROPOLIS_COMICVIEWER_H
 
+#include "common/rect.h"
 #include "access/noctropolis/noctropolis_game.h"
 #include "access/resources.h"
 #include "access/polygon.h"
@@ -30,11 +31,14 @@ namespace Access {
 
 namespace Noctropolis {
 
-struct ComicPageBubble {
+struct ComicBox {
 	byte style;
 	byte textColor;
 	int16 x, y;
-	Common::String text;
+	const char *msgEn;
+	const char *msgFr;
+	const char *msgEs;
+	const char *msgDe;
 };
 
 class PolygonResource : public Resource {
@@ -46,27 +50,35 @@ protected:
 	void internalLoad(Common::SeekableReadStream &source, uint32 size);
 };
 
-struct ComicPageHotspot {
-	PolygonResource polygons;
+struct Comic {
+	short numPoints;
+	Common::Point points[];
+};
+
+struct ComicBlock {
+	struct Polygon *polygon;
 	int32 soundFileIndex, soundResIndex;
-	Common::Array<ComicPageBubble> bubbles;
+	const struct ComicBox *boxes;
+	int32 numBoxes;
 };
 
 struct ComicPage {
 	Common::Path filename;
 	int32 musicFileIndex, musicResIndex;
-	Common::Array<ComicPageHotspot> hotspots;
+	bool musicRepeat;
+	int unk;
+	const struct ComicBlock *blocks;
+	int32 numBlocks;
 };
 
 class ComicResource : public Resource {
 public:
+	ComicResource(const ComicPage *pages[], int npages);
 	uint16 getCount() const { return _pages.size(); }
 	const ComicPage *getPage(int index) const { return _pages[index]; }
-	void free();
+
 protected:
-	Common::Array<ComicPage *> _pages;
-	ComicPageHotspot loadHotspot(Common::SeekableReadStream &source);
-	void internalLoad(Common::SeekableReadStream &source, uint32 size);
+	Common::Array<const ComicPage *> _pages;
 };
 
 
@@ -90,7 +102,7 @@ protected:
 	SpriteResource *_bubbleSprites;
 	int _currPage;
 	PageResult runPage(const ComicPage *page);
-	void drawBubble(const ComicPageBubble &bubble);
+	void drawBubble(const ComicBox &bubble);
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 9118e97d3eb..73419e39ff0 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -48,6 +48,9 @@ void NoctropolisEngine::initObjects() {
 	_scripts = new NoctropolisScripts(this);
 	_invScript = new NoctropolisScripts(this);
 	_stil = new Player(this);
+
+	const Common::FSNode gameDataDir(ConfMan.getPath("path"));
+	SearchMan.addSubDirectoryMatching(gameDataDir, "comdata");
 }
 
 void NoctropolisEngine::setupGame() {
diff --git a/engines/access/noctropolis/noctropolis_last_comic.cpp b/engines/access/noctropolis/noctropolis_last_comic.cpp
new file mode 100644
index 00000000000..245080278b7
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_last_comic.cpp
@@ -0,0 +1,2095 @@
+
+/* Comic Data from Noctropolis Macos, offset 0x999a0 */
+
+#include "noctropolis_comicviewer.h"
+#include "noctropolis_last_comic.h"
+
+
+namespace Access {
+
+namespace Noctropolis {
+
+static struct Polygon poly_p1_b0 = { {
+    { 105, 247 },
+    { 580, 247 },
+    { 580, 321 },
+    { 105, 321 },
+} };
+
+static struct ComicBox block_p1_b0_boxes[] = {
+    { 0, 246, 105, 318, "IN THE OUTSKIRTS OF NOCTROPOLIS CITY, THREE SILHOUETTES\nDETACH THEMSELVES FROM THE NIGHTSCAPE AND STRUGGLE TO FIND\nFORM BENEATH THE WAN LIGHTING OF THE CITY AMUSEMENT PARK.\nSTARTLED TO ENCOUNTER EACH OTHER, THE PREDATORS PAUSE JUST\nLONG ENOUGH TO DEMAND ANSWERS....", "DANS LA BANLIEUE DE NOCTROPOLIS CITY, TROIS SILHOUETTES\nSE DETACHENT DANS LA NUIT ET LUTTENT POUR PRENDRE FORME\nDANS LA LUMIERE BLAFARDE DU PARC D'ATTRACTIONS DE LA VILLE.\nFASCINES PAR CETTE RENCONTRE, LES PREDATEURS S'ARRETENT A\nPEINE LE TEMPS DE DEMANDER QUELQUES REPONSES...", "EN LA OSCURIDAD DE NOCTROPOLIS, TRES SILUETAS\nINTENTAN ORIENTARSE EN MEDIO DEL PARQUE DE ATRACCIONES.\nABSORTOS EN BUSCARSE ENTRE SI, LOS MERODEADORES NO\nATIENDEN A NADA MAS...", "IN EINEM RANDBEZIRK VON NOCTROPOLIS L\x99""SEN SICH DREI\nSILHOUETTEN AUS DER NACHT UND GEWINNEN M\x9a""HSAM KLARE UMRISSE IN\nDER SCHWACHEN BELEUCHTUNG DES ST\x8e""DTISCHEN VERGN\x9a""GUNGSPARKS. IN\nIHRER \x9a""BERRASCHUNG, SICH HIER ZU TREFFEN, UNTERBRECHEN DIESE\nRAUBTIERE IHREN BEUTEZUG GERADE LANGE GENUG,\nUM EIN PAAR ANTWORTEN ZU VERLANGEN..." },
+};
+
+static struct ComicBlock block_p1_0 = { &poly_p1_b0, -1, -1, block_p1_b0_boxes, 1 };
+
+static struct Polygon poly_p1_b1 = { {
+    { 58, 0 },
+    { 580, 0 },
+    { 580, 399 },
+    { 58, 399 },
+} };
+
+static struct ComicBox block_p1_b1_boxes[] = {
+    { 0, 246, 10, 50, "A SADISTIC MAGICIAN...\n\nA RUTHLESS GUNSLINGER...\n\nA WANTON CANNIBAL...\n\nEACH SUMMONED FROM DARKNESS BY THE STROKE OF MIDNIGHT.", "UNE MAGICIENNE SADIQUE...\n\nUN MALFRAT CRUEL...\n\nUN CANNIBALE PERVERS...\n\nTOUS ONT  ETE  INVOQUES PAR LES TENEBRES \nLORSQUE MINUIT A SONNE", "UNA MAGA SADICA...\n\nUN ASESINO DESPIADADO...\n\nUNA CANIBAL OBSESA...\n\nLOS TRES PARECEN INVOCADOS POR LAS TINIEBLAS.", "EINE SADISTISCHE MAGIERIN...\n\nEIN GNADENLOSER REVOLVERHELD...\n\nEINE B\x99""SARTIGE KANNIBALIN...\n\nSCHLAG MITTERNACHT WERDEN SIE ALLE AUS DEM DUNKEL GERUFEN..." },
+};
+
+static struct ComicBlock block_p1_1 = { &poly_p1_b1, 99, 123, block_p1_b1_boxes, 1 };
+
+static struct ComicBlock page_1_blocks[] = {
+    block_p1_0,
+    block_p1_1,
+};
+
+static struct ComicPage page_1 = { "DARK/COMDATA/LEPG1_2.SCN", 98, 41, 1, 0, page_1_blocks, 2 };
+
+static struct Polygon poly_p2_b0 = { {
+    { 106, 0 },
+    { 146, 0 },
+    { 146, 186 },
+    { 106, 186 },
+} };
+
+static struct ComicBox block_p2_b0_boxes[] = {
+    { 0, 246, 114, 178, "TOPHAT... A DANGEROUS MIX OF MISCHIEF AND MAGIC.", "TOPHAT... UN DANGEREUX MELANGE DE MECHANCETE ET DE MAGIE.", "LA DIVA... PELIGROSA MEZCLA DE MAGIA Y CRUELDAD.", "MISS ZYLINDERCHEN...EINE GEF\x8e""HRLICHE MISCHUNG AUS\nBOSHEIT UND ZAUBEREI." },
+};
+
+static struct ComicBlock block_p2_0 = { &poly_p2_b0, -1, -1, block_p2_b0_boxes, 1 };
+
+static struct Polygon poly_p2_b1 = { {
+    { 165, 0 },
+    { 207, 0 },
+    { 207, 186 },
+    { 165, 186 },
+} };
+
+static struct ComicBox block_p2_b1_boxes[] = {
+    { 0, 246, 176, 178, "DESPERADO... A HARDENED GUNMAN WITH A QUICK TEMPER\nAND LIGHTNING DRAW.", "DESPERADO... UN TIREUR ENTRAINE, QUI SE FACHE VITE ET\nDEGAINE ENCORE PLUS VITE.", "DESESPERADO... ASESINO SIEMPRE DISPUESTO A SACAR\nSU ARMA.", "SHOWDOWN... EIN ERFAHRENER PISTOLENSCH\x9a""TZE, DER\nBLITZSCHNELL ZIEHT." },
+};
+
+static struct ComicBlock block_p2_1 = { &poly_p2_b1, -1, -1, block_p2_b1_boxes, 1 };
+
+static struct Polygon poly_p2_b2 = { {
+    { 224, 0 },
+    { 265, 0 },
+    { 256, 186 },
+    { 224, 186 },
+} };
+
+static struct ComicBox block_p2_b2_boxes[] = {
+    { 0, 246, 235, 178, "WIDOWMARK... A NYMPHOMANIAC THAT DEVOURS HER MATES.", "WIDOWMARK... UNE NYMPHOMANE QUI DEVORE SES AMANTS.", "VIUDA NEGRA... NINFOMANIACA Y CANIBAL.", "DIE SCHWARZE WITWE...EINE NYMPHOMANIN, DIE IHRE\nGELIEBTEN AUFREISST." },
+};
+
+static struct ComicBlock block_p2_2 = { &poly_p2_b2, -1, -1, block_p2_b2_boxes, 1 };
+
+static struct Polygon poly_p2_b3 = { {
+    { 126, 356 },
+    { 253, 356 },
+    { 227, 399 },
+    { 152, 399 },
+} };
+
+static struct ComicBox block_p2_b3_boxes[] = {
+    { 0, 246, 150, 350, "DARKSHEER... VIGILANTE. SENTINEL. EYES OF THE NIGHT.", "DARKSHEER... LE VIGILE. LA SENTINELLE. LES YEUX DE LA NUIT.", "TENEBROSO... VIGILANTE, CENTINELA.", "DARKSHEER...DER W\x8e""CHTER. DER BESCH\x9a""TZER. DIE AUGEN\nDER NACHT." },
+};
+
+static struct ComicBlock block_p2_3 = { &poly_p2_b3, -1, -1, block_p2_b3_boxes, 1 };
+
+static struct Polygon poly_p2_b4 = { {
+    { 60, 0 },
+    { 317, 0 },
+    { 317, 399 },
+    { 60, 399 },
+} };
+
+static struct ComicBox block_p2_b4_boxes[] = {
+    { 3, 244, 250, 218, "     TOPHAT? WIDOWMARK! WHAT\nTHE HELL ARE YOU TWO DOIN'\n             HERE?", "      TOPHAT? WIDOWMARK!\n QU'EST-CE QUE VOUS FAITES ICI\n        TOUTES LES DEUX?", "     DIVA? VIUDA NEGRA! QUE\nDEMONIOS HACEIS \n             AQUI?", "           ZYLINDERCHEN?\n SCHWARZE WITWE? WAS ZUR H\x99""LLE\n       MACHT IHR BEIDE HIER?" },
+};
+
+static struct ComicBlock block_p2_4 = { &poly_p2_b4, -1, -1, block_p2_b4_boxes, 1 };
+
+static struct Polygon poly_p2_b5 = { {
+    { 319, 0 },
+    { 377, 0 },
+    { 409, 105 },
+    { 318, 147 },
+} };
+
+static struct ComicBox block_p2_b5_boxes[] = {
+    { 4, 244, 129, 18, "      YOU LADIES BETTER TALK\n  FAST, 'CAUSE I GOT OTHER\nBUSINESS HERE, AND MY FINGER'S\n  JUST ITCHIN' FOR THE TRIGGER!", "      VOUS FERIEZ MIEUX DE\n  VOUS EXPLIQUER , ET VITE, J'AI\nAUTRE CHOSE A FAIRE, ET MON DOIGT\n   ME DEMANGE SUR LA GACHETTE!", "     MEJOR HABLAD RAPIDO\n  PORQUE TENGO UN ASUNTO\nQUE LIQUIDAR Y MIS DEDOS ESTAN\n ANSIOSOS POR DISPARAR!", "          ALSO, LADIES, IHR\n     REDET BESSER SCHNELL, DENN\nICH HABE HEIR ETWAS ZU ERLEDIGEN,\n       UND MEIN ABZUGSFINGER\n       JUCKT SCHON GEWALTIG!" },
+};
+
+static struct ComicBlock block_p2_5 = { &poly_p2_b5, -1, -1, block_p2_b5_boxes, 1 };
+
+static struct Polygon poly_p2_b6 = { {
+    { 377, 0 },
+    { 530, 0 },
+    { 453, 244 },
+} };
+
+static struct ComicBox block_p2_b6_boxes[] = {
+    { 2, 244, 240, 132, "     STAY OUT OF MY WAY\nGUNSLINGER! I WAS INVITED!", "     HORS DE MON CHEMIN!\n      JE SUIS INVITEE!", "   APARTATE DE MI\nCAMINO! ESTOY INVITADA!", "       HALT DICH BLO\xe1"" AUS\n  MEINEN ANGELEGENHEITEN RAUS!\n      ICH WURDE EINGELADEN!" },
+};
+
+static struct ComicBlock block_p2_6 = { &poly_p2_b6, -1, -1, block_p2_b6_boxes, 1 };
+
+static struct Polygon poly_p2_b7 = { {
+    { 530, 0 },
+    { 580, 0 },
+    { 580, 145 },
+    { 496, 105 },
+} };
+
+static struct ComicBox block_p2_b7_boxes[] = {
+    { 2, 244, 320, 108, "     INDEED, MY DEAR. IT WOULD\nSEEM THAT OUR MEETING IS NOT SO\n     CIRCUMSTANTIAL, AFTER ALL.", "      VRAIMENT, TRES CHERE...\n   IL ME SEMBLE QUE NOTRE\n  RENCONTRE N'EST PAS TOUT A FAIT\n       FORTUITE, FINALEMENT...", "  CARAMBA, QUERIDA. PARECE\nQUE NUESTRO ENCUENTRO NO HA\n   SIDO TAN CASUAL.", "           WIRKLICH, MEINE\n     LIEBE? ES SCHEINT, ALS SEI\n    UNSER ZUSAMMENTREFFEN HIER\n         NICHT GANZ ZUF\x8e""LLIG." },
+};
+
+static struct ComicBlock block_p2_7 = { &poly_p2_b7, -1, -1, block_p2_b7_boxes, 1 };
+
+static struct Polygon poly_p2_b8 = { {
+    { 349, 232 },
+    { 445, 233 },
+    { 445, 334 },
+    { 339, 334 },
+} };
+
+static struct ComicBox block_p2_b8_boxes[] = {
+    { 3, 244, 459, 168, "        THAT'S VERY POSSIBLE,\n   DESPERADO. LATELY, DARKSHEER'S\n BEEN QUITE INTENT UPON ELIMINATING\nHIS ENEMIES, AND I DARE SAY WE THREE\nARE THE LAST LEFT. BUT CONSIDER THE\n GORGEOUS POSSIBILITIES IF THE\n    THREE OF US ELECTED TO JOIN\n           AGAINST HIM!", "         C'EST TRES POSSIBLE,\n   DESPERADO. DERNIEREMENT,\n  DARKSHEER A MIS TOUTE SON\n ENERGIE DANS LA DESTRUCTION DE SES\n   ENNEMIS, ET J'OSE DIRE QUE NOUS\n         SOMMES LES DERNIERS.", "             ES MUY PROBABLE,\n  DESESPERADO. TENEBROSO QUIERE\n INTENTAR ELIMINAR A SUS ENEMIGOS\nY ME PARECE QUE SOLO QUEDAMOS \nNOSOTROS TRES. PERO TE IMAGINAS QUE\n PASARIA SI UNIERAMOS NUESTRAS\n    FUERZAS PARA ACABAR CON\n           EL?", "               DAS IST GUT\n        M\x99""GLICH, SHOWDOWN. IN\n     LETZTER ZEIT LEGT DARKSHEER\n   ES DARAUF AN, ALLE SEINE FEINDE\n  AUSZUSCHALTEN. UND ICH WAGE MAL\n    ZU BEHAUPTEN, WIR DREI SIND DIE\n         LETZTEN \x9a""BERLEBENDEN." },
+    { 3, 244, 459, 168, "NULL", "          MAIS PENSEZ AUX\n   POSSIBILITES FASCINANTES QUI\n   S'OFFRENT A NOUS SI NOUS NOUS\n        UNISSONS CONTRE LUI!", "NULL", "       ABER MALT EUCH BLO\xe1""\n   MAL DIE M\x99""GLICHKEITEN AUS,\n    WENN WIR DREI UNS GEGEN IHN\n          VERB\x9a""NDETEN!" },
+    { 4, 244, 137, 260, "     THREE AGAINST ONE... LADY,\nI LIKE THEM ODDS.", "      TROIS CONTRE UN...\n  JE PREFERE L'EQUILIBRE.", "     TRES CONTRA UNO... ME\n GUSTA COMO SUENA.", "       DREI GEGEN EINEN...\nLADY, DAS VERH\x8e""LTNIS GEF\x8e""LLT MIR." },
+};
+
+static struct ComicBlock block_p2_8 = { &poly_p2_b8, -1, -1, block_p2_b8_boxes, 3 };
+
+static struct Polygon poly_p2_b9 = { {
+    { 318, 147 },
+    { 409, 105 },
+    { 439, 203 },
+    { 349, 232 },
+    { 317, 238 },
+} };
+
+static struct ComicBox block_p2_b9_boxes[] = {
+    { 1, 244, 451, 160, "     I RECEIVED ONE OF\nDARKSHEER'S PRETTY INVITATIONS\n          AS WELL.", "     J'AI MOI AUSSI RE\x80""U\nUNE DES INVITATIONS DE DARKSHEER.", "   RECIBI UNA DE LAS\nPRECIOSAS INVITACIONES DE\n       TENEBROSO.", "         ICH HABE AUCH EINE\n    VON DARKSHEERS H\x9a""BSCHEN\n      EINLADUNGEN BEKOMMEN." },
+};
+
+static struct ComicBlock block_p2_9 = { &poly_p2_b9, -1, -1, block_p2_b9_boxes, 1 };
+
+static struct Polygon poly_p2_b10 = { {
+    { 472, 221 },
+    { 566, 222 },
+    { 566, 292 },
+    { 472, 292 },
+} };
+
+static struct ComicBox block_p2_b10_boxes[] = {
+    { 4, 244, 319, 196, "     ALL RIGHT, WE FIGHT\n  TOGETHER. BUT NO MATTER WHO\n  BRINGS HIM DOWN, I GET\n      DARKSHEER'S BODY.", "      D'ACCORD, NOUS NOUS\n  BATTRONS ENSEMBLE. MAIS JE\n  VEUX LE CORPS DE DARKSHEER,\n    MEME SI CE N'EST PAS\n       MOI QUI LE TUE.", "   ESTA BIEN, PELEAREMOS\n  JUNTOS. PERO NO IMPORTA QUIEN\n  LO MATE. YO QUIERO SU\n    CADAVER PARA MI.", "             IN ORDNUNG,\n    TUN WIR UNS ZUSAMMEN. ABER\n   EGAL, WER IHN FERTIGMACHT, ICH\n         BEKOMME DARKSHEERS\n                K\x99""RPER!" },
+};
+
+static struct ComicBlock block_p2_10 = { &poly_p2_b10, -1, -1, block_p2_b10_boxes, 1 };
+
+static struct Polygon poly_p2_b11 = { {
+    { 496, 105 },
+    { 580, 145 },
+    { 580, 233 },
+    { 466, 200 },
+} };
+
+static struct ComicBox block_p2_b11_boxes[] = {
+    { 2, 244, 312, 188, "     THAT STINKIN' WEASEL SENT\nME ONE TOO... THIS WHOLE DAMN\n    THING STINKS LIKE A SET-UP!", "     CE RAT PUANT M'EN A AUSSI\nENVOYE UNE...TOUTE CETTE HISTOIRE\n        SENT LE COUP MONTE!", "   ESE CERDO ME ENVIO UNA\nTAMBIEN...  ESTE ASUNTO\n   HUELE A ENCERRONA!", "         DIESES STINKENDE\n     WIESEL HAT MIR AUCH EINE\n   GESCHICKT...DAS GANZE RIECHT\n         NACH EINER FALLE." },
+};
+
+static struct ComicBlock block_p2_11 = { &poly_p2_b11, -1, -1, block_p2_b11_boxes, 1 };
+
+static struct Polygon poly_p2_b12 = { {
+    { 459, 320 },
+    { 583, 320 },
+    { 581, 375 },
+    { 458, 375 },
+} };
+
+static struct ComicBox block_p2_b12_boxes[] = {
+    { 4, 244, 302, 262, "        OH, WIDOWMARK, HOW\n   DELICIOUSLY MORBID! OF COURSE\n YOU MAY CLAIM YOUR TROPHY. TELL\nME, DON'T YOU BOTH JUST ADORE THE\n   INVITATIONS? I SIMPLY LOVE\n    DARKSHEER'S FLAIR FOR THE\n            DRAMATIC!", "        OH, WIDOWMARK, QUELLE\n   CHARMANTE ATTENTION MORBIDE!\n BIEN SUR, VOUS POURREZ RECLAMER\n  VOTRE TROPHEE. DITES-MOI, VOUS\n   N'ADOREZ PAS LES INVITATIONS?\n    J'ADORE LE FLAIR DE DARKSHEER\n       POUR LES HISTOIRES\n              DRAMATIQUES!", "        QUE DELICIOSAMENTE\n  MORBOSA ERES, VIUDA NEGRA! POR\n SUPUESTO QUE TE DAREMOS EL TROFEO.\n NO OS ENCANTA LA AFICION QUE\n SIENTE TENEBROSO POR LO\n            DRAMATICO?", "         OH, SCHWARZE WITWE,\n    WIE HERRLICH MORBID! NAT\x9a""RLICH\n   SOLLST DU DEINE TROPH\x8e""E HABEN!\nSAGT MAL, GEFALLEN EUCH DARKSHEERS\n    EINLADUNGEN AUCH SO GUT? ICH\n        BEWUNDERE SEIN FLAIR\n          F\x9a""R DAS DRAMATISCHE." },
+    { 2, 244, 270, 342, "     YEAH, WHATEVER, TOPHAT.\nDARK BOY MUST BE WAITIN' INSIDE\n             FOR US....", "     OUI, PEUT-ETRE, TOPHAT.\n     IL DOIT NOUS ATTENDRE A\n         L'INTERIEUR...", "     LO QUE TU DIGAS, DIVA.\nADELANTE. EL CHICO OSCURO DEBE\n    ESTAR ESPERANDO...", "       JAJA, WAS AUCH IMMER,\n    ZYLINDERCHEN. DER FINSTERE\n  BUBE MU\xe1"" WOHL DRINNEN AUF UNS\n              WARTEN..." },
+    { 4, 244, 340, 275, "     THEN LET'S GET GOING...\n       I WANT TO FEED!", "     ALLONS-Y... JE DOIS\n       ME NOURRIR!", "   ENTONCES VANOS...\n       TENGO HAMBRE!", "      DANN LA\xe1""T UNS GEHEN...\n   ICH WILL HEUTE ZEITIG ESSEN!" },
+};
+
+static struct ComicBlock block_p2_12 = { &poly_p2_b12, -1, -1, block_p2_b12_boxes, 3 };
+
+static struct ComicBlock page_2_blocks[] = {
+    block_p2_0,
+    block_p2_1,
+    block_p2_2,
+    block_p2_3,
+    block_p2_4,
+    block_p2_5,
+    block_p2_6,
+    block_p2_7,
+    block_p2_8,
+    block_p2_9,
+    block_p2_10,
+    block_p2_11,
+    block_p2_12,
+};
+
+static struct ComicPage page_2 = { "DARK/COMDATA/LEPG3_4.SCN", 98, 42, 1, 0, page_2_blocks, 13 };
+
+static struct Polygon poly_p3_b0 = { {
+    { 59, 265 },
+    { 110, 265 },
+    { 79, 232 },
+    { 191, 211 },
+    { 302, 234 },
+    { 273, 266 },
+    { 324, 266 },
+    { 324, 399 },
+    { 59, 399 },
+} };
+
+static struct ComicBox block_p3_b0_boxes[] = {
+    { 7, 246, 265, 225, "      ONE LITTLE, TWO LITTLE,\nTHREE LITTLE INDIANS...WELCOME TO\n          THRILLSVILLE.", "       UN PETIT INDIEN, DEUX\n   PETITS INDIENS, TROIS PETITS\n    INDIENS... BIENVENUE DANS LA\n         VILLE DES FRISSONS!", "   UN INDIECITO, DOS\nINDIECITOS, TRES INDIECITOS EN\n      EL PARQUECITO.", "          EINS, ZWEI, DREI\n  KLEINE NEGERLEIN...WILLKOMMEN\n          IN RISIKOHAUSEN." },
+    { 3, 244, 234, 318, "       WHERE IS HE?", "\n           OU EST-IL?", "       DONDE ESTA?", "\n             WO IST ER?" },
+    { 3, 244, 254, 319, "      HE'S WATCHING US FROM\nTHE SHADOWS, OF COURSE... HONEY,\n           WE'RE HOME!", "      IL NOUS REGARDE DANS\nL'OMBRE, EVIDEMMENT. CHERIE, NOUS\n         SOMMES CHEZ NOUS!", "    MIRANDONOS DESDE LAS\nSOMBRAS, POR SUPUESTO. AQUI\n    ESTAMOS, QUERIDO!", "        ER BEOBACHTET UNS\n    NAT\x9a""RLICH AUS DEM SCHATTEN.\n     SCHATZ, WIR SIND ZU HAUSE!" },
+    { 3, 244, 272, 325, "      THAT BASTARD'S MORE\n     YELLA THAN I THOUGHT!", "     CE BATARD CRIE PLUS\n   FORT QUE JE NE CROYAIS!", "   ESE BASTARDO ES PEOR\n QUE UNA PATADA EN EL TRASERO!", "        DER BASTARD IST NOCH\n      FEIGER, ALS ICH DACHTE!" },
+};
+
+static struct ComicBlock block_p3_0 = { &poly_p3_b0, -1, -1, block_p3_b0_boxes, 4 };
+
+static struct Polygon poly_p3_b1 = { {
+    { 325, 0 },
+    { 479, 0 },
+    { 479, 133 },
+    { 325, 133 },
+} };
+
+static struct ComicBox block_p3_b1_boxes[] = {
+    { 1, 244, 475, 70, "      YOU-HOO, DARKSHEER!\nCOME OUT, COME OUT WHEREVER\n           YOU ARE!", "      YOU-HOU, DARKSHEER!\n     VENEZ! ALLEZ, SORTEZ\n           DE LA...!", "      HOLA, TENEBROSO!\nDONDEQUIERA QUE ESTES, DEJATE\n           VER!", "       JUHUUH, DARKSHEER!\n   KOMM RAUS, KOMM RAUS, WO\n          IMMER DU BIST!" },
+    { 2, 244, 130, 84, "    SHUDDUP TOPHAT! NO REASON\nTHE WHOLE DAMN WORLD'S GOTTA\n          KNOW WE'RE COMIN'!", "    LA FERME,TOPHAT! LE MONDE\nENTIER N'A PAS BESOIN DE SAVOIR\n        QUE NOUS ARRIVONS!", "    CALLATE, DIVA! NO HAY\nRAZON PARA REVELARLE NUESTRA\n          POSICION!", "             SCHNAUZE, \n     ZYLINDERCHEN! ES MU\xe1"" JA\n NICHT GLEICH DIE GANZE VERDAMMTE\n        WELT H\x99""REN, DA\xe1"" WIR\n              KOMMEN!" },
+};
+
+static struct ComicBlock block_p3_1 = { &poly_p3_b1, -1, -1, block_p3_b1_boxes, 2 };
+
+static struct Polygon poly_p3_b2 = { {
+    { 325, 133 },
+    { 479, 133 },
+    { 479, 196 },
+    { 325, 196 },
+} };
+
+static struct ComicBox block_p3_b2_boxes[] = {
+    { 2, 244, 208, 198, "      THIS IS BULL-DIP! HIDE 'N\n  SEEK IS A SISSY-BOY KID-GAME!\nA MAN OUGHTA DO HIS FIGHTIN' OUT IN\n        THE OPEN, I TELL YA.", "      C'EST NUL! LES JEUX DE\n  CACHE-CACHE, C'EST BON POUR LA\nMATERNELLE! UN HOMME DOIT SAVOIR\n     SE BATTRE A DECOUVERT, MOI\n         JE VOUS LE DIS.", "      ESTO APESTA! SOLO LOS\n  COBARDES SE ESCONDEN ASI!\nUN HOMBRE VERDADERO DA LA CARA Y\n        PELEA.", "\n         DAS IST DOCH ALLES\n        BULLENSCHEI\xe1""E HIER!\n  VERSTECKSPIELEN IST WAS F\x9a""R FEIGE\n   JUNGS! EIN MANN SOLLTE SEINE\n        K\x8e""MPFE GANZ OFFEN\n           AUSTRAGEN!" },
+};
+
+static struct ComicBlock block_p3_2 = { &poly_p3_b2, -1, -1, block_p3_b2_boxes, 1 };
+
+static struct Polygon poly_p3_b3 = { {
+    { 325, 196 },
+    { 478, 196 },
+    { 478, 212 },
+    { 588, 212 },
+    { 588, 290 },
+    { 511, 290 },
+    { 458, 312 },
+    { 325, 229 },
+} };
+
+static struct ComicBox block_p3_b3_boxes[] = {
+    { 3, 244, 460, 182, "      I KNOW HE'S HERE...\n      I CAN SMELL HIM!", "      JE SAIS QU'IL EST LA... \n      JE LE SENS!", "  SE QUE ESTA AQUI...\n      PUEDO OLERLO!", "       ICH WEI\xe1"", DA\xe1"" ER HIER\n    IST....ICH KANN IHN WITTERN!" },
+    { 4, 244, 247, 139, "      OH, HE'S HERE, LUSCIOUS,\n AND HE'S CLOSER THAN YOU KNOW.\n I DO BELIEVE I'VE FOUND OUR\n          SLIPPERY PREY...", "      OH, IL EST LA, MA BELLE,\n  ET PLUS PRES QUE VOUS NE\n CROYEZ. JE CROIS QUE J'AI TROUVE\n     NOTRE PROIE INSSAISISSABLE.", "      SI, ESTA AQUI,\n Y MAS CERCA DE LO QUE CREES.\n CREO QUE DE UN MOMENTO A\n OTRO SE DEJARA VER...", "        OH, ER IST SOGAR\n   GANZ BESTIMMT HIER, S\x9a""\xe1""E, UND\n N\x8e""HER, ALS DU AHNST. ICH GLAUBE,\n    ICH HABE UNSERE BEUTE\n           ENTDECKT." },
+};
+
+static struct ComicBlock block_p3_3 = { &poly_p3_b3, -1, -1, block_p3_b3_boxes, 2 };
+
+static struct Polygon poly_p3_b4 = { {
+    { 325, 229 },
+    { 458, 312 },
+    { 439, 340 },
+    { 446, 373 },
+    { 472, 394 },
+    { 325, 394 },
+} };
+
+static struct ComicBox block_p3_b4_boxes[] = {
+    { 3, 244, 471, 265, "    SHOW ME A TARGET, TOPHAT!\n I'M GONNA DOUBLE THAT SCUM'S\n       WEIGHT WITH HOT LEAD!", "      MONTREZ-MOI LA CIBLE,\n TOPHAT! QUAND JE L'AURAI CRIBLE\n  DE BALLES, IL PESERA DEUX FOIS\n            PLUS LOURD!", "   DIME DONDE, DIVA!\n MANDARE A ESA PESTE AL\n       CEMENTERIO!", "      WENN DU IHN GEFUNDEN\n    HAST, DANN ZEIG MIR DAS ZIEL,\n ZYLINDERCHEN! ICH VERDOPPLE DAS\n   GEWICHT DIESES ST\x9a""CKS ABSCHAUM\n               MIT BLEI!" },
+};
+
+static struct ComicBlock block_p3_4 = { &poly_p3_b4, -1, -1, block_p3_b4_boxes, 1 };
+
+static struct Polygon poly_p3_b5 = { {
+    { 458, 312 },
+    { 511, 290 },
+    { 588, 290 },
+    { 588, 394 },
+    { 412, 394 },
+    { 446, 373 },
+    { 439, 340 },
+} };
+
+static struct ComicBox block_p3_b5_boxes[] = {
+    { 4, 244, 290, 294, "     CERTAINLY, DESPERADO, BUT\nIT IS PERHAPS MORE ACCURATE TO\n     SAY THAT HE HAS FOUND US!", "\n     BIEN SUR, DESPERADO. MAIS\nIL SERAIT PEUT-ETRE PLUS JUSTE DE\n   DIRE QUE C'EST LUI QUI NOUS\n            A TROUVES!", "     SEGURO, DESESPERADO.\nPERO ME TEMO QUE SERA EL QUIEN\n     NOS DESCUBRA PRIMERO!", "\n        SICHER, SHOWDOWN.\n  ABER ES W\x8e""RE VIELLEICHT PR\x8e""ZISER,\n       ZU SAGEN, DA\xe1"" ER UNS\n            GEFUNDEN HAT." },
+};
+
+static struct ComicBlock block_p3_5 = { &poly_p3_b5, -1, -1, block_p3_b5_boxes, 1 };
+
+static struct ComicBlock page_3_blocks[] = {
+    block_p3_0,
+    block_p3_1,
+    block_p3_2,
+    block_p3_3,
+    block_p3_4,
+    block_p3_5,
+};
+
+static struct ComicPage page_3 = { "DARK/COMDATA/LEPG5_6.SCN", 98, 43, 0, 0, page_3_blocks, 6 };
+
+static struct Polygon poly_p4_b0 = { {
+    { 62, 0 },
+    { 147, 137 },
+    { 62, 137 },
+} };
+
+static struct ComicBox block_p4_b0_boxes[] = {
+    { 1, 244, 135, 92, "     WHAT THE HELL...?", "\n     MAIS QU'EST-CE QUE...?", "     QUE DEMONIOS...?", "\n        WAS ZUR H\x99""LLE...?" },
+};
+
+static struct ComicBlock block_p4_0 = { &poly_p4_b0, -1, -1, block_p4_b0_boxes, 1 };
+
+static struct Polygon poly_p4_b1 = { {
+    { 62, 0 },
+    { 238, 0 },
+    { 147, 137 },
+} };
+
+static struct ComicBox block_p4_b1_boxes[] = {
+    { 5, 246, 182, 46, "    SHOWTIME KIDDIES...\n        GERONIMO!", "\n  QUE LE SPECTACLE COMMENCE...\n        GERONIMO!", "    HOLA, CHICOS...\n        SORPRESA!", "\n JETZT IST SHOWTIME, KINDERCHEN...\n            GERONIMO!" },
+};
+
+static struct ComicBlock block_p4_1 = { &poly_p4_b1, -1, -1, block_p4_b1_boxes, 1 };
+
+static struct Polygon poly_p4_b2 = { {
+    { 238, 0 },
+    { 322, 0 },
+    { 322, 137 },
+    { 147, 137 },
+} };
+
+static struct ComicBox block_p4_b2_boxes[] = {
+    { 4, 244, 15, 28, "    HOO-HOO! BOGEY AT\n     TWELVE O'CLOCK HIGH!", "      HO HO! ENNEMI A\n   12 HEURES DROIT DESSUS!", "    TAN PUNTUAL COMO\n     SIEMPRE!", "             HO-HO!\n     FEINDFLIEGER OBEN AUF\n           ZW\x99""LF UHR!" },
+    { 2, 244, 65, 55, "    IT'S A FREAKIN' AMBUSH!", "\n     C'EST UNE EMBUSCADE!", "    ESTO ES UNA EMBOSCADA!", " \n      DAS IST EIN VERDAMMTER\n           HINTERHALT!" },
+};
+
+static struct ComicBlock block_p4_2 = { &poly_p4_b2, -1, -1, block_p4_b2_boxes, 2 };
+
+static struct Polygon poly_p4_b3 = { {
+    { 62, 137 },
+    { 147, 137 },
+    { 147, 399 },
+    { 62, 399 },
+} };
+
+static struct ComicBox block_p4_b3_boxes[] = {
+    { 3, 246, 161, 233, "    UNHHH... TOUCHDOWN!", "\n    UNHHH... ATTERRISSAGE!", "    EXACTO!", "\n  UFF...DER ADLER IST GELANDET!" },
+};
+
+static struct ComicBlock block_p4_3 = { &poly_p4_b3, -1, -1, block_p4_b3_boxes, 1 };
+
+static struct Polygon poly_p4_b4 = { {
+    { 147, 137 },
+    { 322, 137 },
+    { 322, 399 },
+    { 147, 399 },
+} };
+
+static struct ComicBox block_p4_b4_boxes[] = {
+    { 2, 244, 5, 193, "    YOU TWO STAY BACK!\n       HE'S MINE!", "       RESTEZ EN ARRIERE!\n         IL EST A MOI!!", "    RETROCEDED!\n       ES MIO!", "        IHR BEIDEN HALTET\n     EUCH RAUS! ER GEH\x99""RT MIR!" },
+};
+
+static struct ComicBlock block_p4_4 = { &poly_p4_b4, -1, -1, block_p4_b4_boxes, 1 };
+
+static struct Polygon poly_p4_b5 = { {
+    { 474, 176 },
+    { 514, 193 },
+    { 528, 226 },
+    { 519, 256 },
+    { 478, 281 },
+    { 440, 269 },
+    { 421, 232 },
+    { 432, 195 },
+} };
+
+static struct ComicBox block_p4_b5_boxes[] = {
+    { 4, 244, 250, 187, "   HOLY #@*$!! NOOOOOO!", "\n   SAINT #@*$!! NOOOOOON!", "  #@*$!! NOOOOOO!", "\n VERDAMMTE #@*$!! NEEEEEEIIIIN!" },
+};
+
+static struct ComicBlock block_p4_5 = { &poly_p4_b5, -1, -1, block_p4_b5_boxes, 1 };
+
+static struct Polygon poly_p4_b6 = { {
+    { 322, 103 },
+    { 583, 103 },
+    { 583, 251 },
+    { 457, 282 },
+    { 321, 251 },
+} };
+
+static struct ComicBox block_p4_b6_boxes[] = {
+    { 3, 244, 464, 108, "     I'M GOING TO EAT YOU\n        UP LITTLE BOY!", "     JE VAIS TE MANGER TOUT\n       CRU, PETIT HOMME!", "    TE DEVORARE,\n        MUCHACHITO!", "        KOMM, KLEINER, ICH\n   HAB' DICH ZUM FRESSEN GERN!" },
+    { 4, 246, 256, 83, "    BE CAREFUL, WIDOWMARK,\nTHIS TIME YOU MAY BITE OFF MORE\n    THAN YOU CAN CHEW!", "     ATTENTION, WIDOWMARK,\n  CETTE FOIS-CI, VOUS RISQUEZ\n    D'AVOIR LES YEUX PLUS GROS\n       QUE LE VENTRE!", "    CUIDADO, VIUDA,\nESTE BOCADO TE PUEDE RESULTAR\n    INDIGESTO!", "     VORSICHT, WITWE, BEI\xe1""\n   NICHT MEHR AB, ALS DU AUCH\n         KAUEN KANNST!" },
+};
+
+static struct ComicBlock block_p4_6 = { &poly_p4_b6, -1, -1, block_p4_b6_boxes, 2 };
+
+static struct Polygon poly_p4_b7 = { {
+    { 321, 251 },
+    { 457, 282 },
+    { 457, 399 },
+    { 321, 399 },
+} };
+
+static struct ComicBox block_p4_b7_boxes[] = {
+    { 3, 244, 444, 243, "   HELP ME! OH MY G-MMMRPH....", "\n   A L'AIDE! OH MON D-MMMRPH...", "   AYUDADME! MI D-MMMRPH....", "\n   HILFE! OH MEIN G-MMMRPH..." },
+};
+
+static struct ComicBlock block_p4_7 = { &poly_p4_b7, 99, 58, block_p4_b7_boxes, 1 };
+
+static struct Polygon poly_p4_b8 = { {
+    { 457, 282 },
+    { 583, 251 },
+    { 583, 399 },
+    { 457, 399 },
+} };
+
+static struct ComicBox block_p4_b8_boxes[] = {
+    { 4, 244, 283, 260, "    DAMN... WRAPPED HER UP\nSLICK AS SNOT AND DISAPPEARED\n   FASTER 'N SANTY CLAUS!", "    ZUT... IL L'A EMBALLEE\nCOMME UNE MOMIE ET IL A DISPARU\n  PLUS VITE QUE LE PERE NOEL!", "   ESA HA BAJADO CON\nMAS VELOCIDAD QUE\n   PAPA NOEL!", "       VERDAMMT...WICKELT\n    SIE EIN WIE DER BLITZ UND\n VERSCHWINDET SCHNELLER ALS DER\n          WEIHNACHTSMANN!" },
+    { 4, 244, 326, 284, "       IT WOULD SEEM THAT\n  WIDOWMARK GOT IN OVER HER\nHEAD. I'D NO IDEA HE COULD\n USE HIS CLOAK LIKE THAT....", "        IL ME SEMBLE QUE\n  WIDOWMARK S'EST FAIT AVOIR. JE\nNE SAVAIS PAS QU'IL POUVAIT UTILISER\n        SA CAPE COMME \x80""A....", "      PARECE QUE VIUDA\n  NEGRA HA PERDIDO LAS PATAS.\n NO SABIA QUE EL PODIA USAR\n SU CAPA DE ESA FORMA...", "\n         SCHEINT SO, ALS\n   STECKTE DIE WITWE BIS \x9a""BER BEIDE\nOHREN IN DER SACHE DRIN. ICH HATTE\n   JA KEINE AHNUNG, WAS ER MIT\n        SEINEM CAPE ALLES\n        ANSTELLEN KANN..." },
+    { 4, 244, 326, 284, "      I GUESS WE OUGHTA GO\n   FIND 'EM... WE CAN COVER MORE\n GROUND IF WE SPLIT UP. WATCH\n     YOUR BACK, LADY.", "      JE CROIS QU'IL FAUT LES\n   RETROUVER. NOUS COUVRIRONS\n  PLUS DE TERRAIN SI NOUS NOUS\n    SEPARONS. FAITES ATTENTION A\n           VOUS, MADAME.", "     VAYAMOS A POR\n  EL. CUBRIREMOS MAS TERRENO\n SI NOS SEPARAMOS. CUIDA\n    TU ESPALDA.", "        SCH\x8e""TZE, WIR M\x9a""SSEN\n    IHN SUCHEN GEHEN. WIR HABEN\n  BESSERE CHANCEN, WENN WIR UNS\n     AUFTEILEN. HALT' DIR DEN\n        R\x9a""CKEN FREI, LADY..." },
+};
+
+static struct ComicBlock block_p4_8 = { &poly_p4_b8, -1, -1, block_p4_b8_boxes, 3 };
+
+static struct ComicBlock page_4_blocks[] = {
+    block_p4_0,
+    block_p4_1,
+    block_p4_2,
+    block_p4_3,
+    block_p4_4,
+    block_p4_5,
+    block_p4_6,
+    block_p4_7,
+    block_p4_8,
+};
+
+static struct ComicPage page_4 = { "DARK/COMDATA/LEPG7_8.SCN", 98, 44, 0, 0, page_4_blocks, 9 };
+
+static struct Polygon poly_p5_b0 = { {
+    { 168, 83 },
+    { 184, 55 },
+    { 185, 63 },
+    { 269, 13 },
+    { 282, 91 },
+    { 191, 89 },
+    { 192, 100 },
+} };
+
+static struct ComicBox block_p5_b0_boxes[] = {
+    { 2, 246, 22, 70, "     QUIET WITCH, OR I'LL PULL\n  IT ALL OUT! I'M TAKING YOU DOWN,\nWIDOWMARK. IF YOU COOPERATE, I\n       MAY LET YOU LIVE.", "     DU CALME, SORCIERE, OU\n  JE VAIS M'ENERVER! JE SUIS LE\nPLUS FORT, WIDOWMARK. SI VOUS\n   COOPEREZ, JE VOUS LAISSERAI\n         PEUT-ETRE LA VIE SAUVE.", "    QUIETA, BRUJA, O TE HARE\n  CAER! TE TENGO,\nVIUDA NEGRA. SI COOPERAS,\n     QUIZAS VIVAS.", "        RUHE, ELENDE HEXE,\n  ODER ICH REI\xe1""E DIR JEDES DAVON\n EINZELN AUS! H\x99""R ZU, WITWE, WENN\n     DU MIR HILFST, LASSE ICH DICH\n         VIELLEICHT AM LEBEN!" },
+};
+
+static struct ComicBlock block_p5_0 = { &poly_p5_b0, -1, -1, block_p5_b0_boxes, 1 };
+
+static struct Polygon poly_p5_b1 = { {
+    { 59, 2 },
+    { 322, 2 },
+    { 322, 116 },
+    { 230, 116 },
+    { 230, 133 },
+    { 186, 133 },
+    { 186, 128 },
+    { 59, 128 },
+} };
+
+static struct ComicBox block_p5_b1_boxes[] = {
+    { 3, 244, 200, 30, "    OUCH! MY HAIR...!", "\n      AIE! MES CHEVEUX!", "    OH! MI PELO...!", "\n         AUA! MEINE HAARE...!" },
+};
+
+static struct ComicBlock block_p5_1 = { &poly_p5_b1, -1, -1, block_p5_b1_boxes, 1 };
+
+static struct Polygon poly_p5_b2 = { {
+    { 59, 128 },
+    { 186, 128 },
+    { 186, 194 },
+    { 59, 194 },
+} };
+
+static struct ComicBox block_p5_b2_boxes[] = {
+    { 7, 244, 215, 85, "      HAH, FOUND YA WEASEL!\n MUCH AS I'D LIKE TO SEE WHAT\nHE'D DO TA WIDOWMARK, NOW'S THE\n  PERFECT TIME TA CALL HIM OUT...", "      HAH, JE T'AI TROUVE,\n SALE PUTOIS! J'AIMERAIS BEAUCOUP\nVOIR CE QU'IL VA FAIRE A WIDOWMARK,\n  MAIS C'EST LE MOMENT PARFAIT...", "      ESTA ENTRETENIDO.\n AUNQUE ME GUSTARIA VER LO\nQUE LE HARA A VIUDA NEGRA, ES\n  EL MOMENTO PERFECTO...", "        HA, DA IST DIE RATTE!\n    SO GERNE ICH AUCH SEHEN\n  W\x9a""RDE, WAS ER MIT DER SCHWARZEN\n WITWE ANSTELLT, JETZT IST DIE RICHTIGE\n      ZEIT, DIE SACHE HINTER\n          UNS ZU BRINGEN..." },
+};
+
+static struct ComicBlock block_p5_2 = { &poly_p5_b2, -1, -1, block_p5_b2_boxes, 1 };
+
+static struct Polygon poly_p5_b3 = { {
+    { 186, 134 },
+    { 235, 134 },
+    { 235, 194 },
+    { 186, 194 },
+} };
+
+static struct ComicBox block_p5_b3_boxes[] = {
+    { 3, 244, 275, 80, "    LET THE LADY GO,\nDUNG-LICKER! YOU N' I GOT\n  BUSINESS TA TEND TO!", "    LAISSE PARTIR LA\nFEMME, LECHE-BOUSE! TOI ET MOI,\n  IL FAUT QU'ON DISCUTE!", "   QUE LA DAMA SE\nLAS ARREGLE COMO PUEDA. YO\n  TENGO ALGO QUE HACER.", "      LA\xe1"" DIE LADY GEHEN,\n  DUNGFRESSER! DU UND ICH, WIR\n    HABEN WAS ZU ERLEDIGEN!" },
+};
+
+static struct ComicBlock block_p5_3 = { &poly_p5_b3, -1, -1, block_p5_b3_boxes, 1 };
+
+static struct Polygon poly_p5_b4 = { {
+    { 230, 116 },
+    { 322, 116 },
+    { 322, 249 },
+    { 230, 249 },
+} };
+
+static struct ComicBox block_p5_b4_boxes[] = {
+    { 4, 246, 71, 96, "    WHA...? OOOOPH!", "\n       QU...? OOOOUPH!", "    QUE...? OOOOH!", "\n           WAS...? UFF!" },
+    { 3, 244, 318, 113, "    I'M GOING TO NAIL YOU\nJUST LIKE THIS FOR EVERY STRAND\n      OF HAIR I LOST!", "    JE VAIS TE DONNER UN\nCOUP POUR CHAQUE CHEVEU QUE\n         J'AI PERDU!", "    TE HARE UNA HERIDA\nCOMO ESTA POR CADA CABELLO QUE\n      PERDI!", "    F\x9a""R JEDE EINZELNE LOCKE,\nDIE ICH VERLOREN HABE, ZAHLE ICH\n           ES DIR HEIM!" },
+};
+
+static struct ComicBlock block_p5_4 = { &poly_p5_b4, 99, 25, block_p5_b4_boxes, 2 };
+
+static struct Polygon poly_p5_b5 = { {
+    { 59, 194 },
+    { 92, 199 },
+    { 111, 221 },
+    { 108, 258 },
+    { 98, 258 },
+    { 102, 268 },
+    { 59, 268 },
+} };
+
+static struct ComicBox block_p5_b5_boxes[] = {
+    { 3, 246, 145, 190, "    GETTING AWAY! WIDOWMARK'S\n  GETTING AWAY....", "       ELLE S'ENFUIT!\n     WIDOWMARK S'ENFUIT...", "    ADIOS, VIUDA NEGRA!", "         SIE ENTKOMMT!\n     DIE SCHWARZE WITWE\n         ENTKOMMT MIR!" },
+};
+
+static struct ComicBlock block_p5_5 = { &poly_p5_b5, -1, -1, block_p5_b5_boxes, 1 };
+
+static struct Polygon poly_p5_b6 = { {
+    { 98, 258 },
+    { 181, 257 },
+    { 138, 398 },
+} };
+
+static struct ComicBox block_p5_b6_boxes[] = {
+    { 3, 244, 198, 273, "    TIME TO DIE, RATMEAT!\n       MAKE YER MOVE!", "      TON HEURE EST VENUE,\n  RAT PUANT! A TOI DE JOUER!", "  ES HORA DE MORIR, RATA!\n      DEFIENDETE!", "       ZEIT ZUM STERBEN,\nRATTENGESICHT! MACH DEINEN ZUG!" },
+};
+
+static struct ComicBlock block_p5_6 = { &poly_p5_b6, -1, -1, block_p5_b6_boxes, 1 };
+
+static struct Polygon poly_p5_b7 = { {
+    { 59, 194 },
+    { 230, 194 },
+    { 230, 268 },
+    { 59, 268 },
+} };
+
+static struct ComicBox block_p5_b7_boxes[] = {
+    { 5, 246, 220, 247, "  ...LET HER GO...CONCENTRATE!\nDON'T GIVE DESPERADO THE TIME HE\n           NEEDS.", "    ... LA LAISSER PARTIR...\n  SE CONCENTRER! NE PAS LAISSER\n     A DESPERADO LE TEMPS DONT\n         IL A BESOIN.", "  ...AHORA DEBO\nCONCENTRARME Y NO DARLE TIEMPO\n  A DESESPERADO.", "      ... LA\xe1"" SIE GEHEN... \n  KONZENTRIER' DICH! DU DARFST\n SHOWDOWN NICHT DIE ZEIT GEBEN,\n         DIE ER BRAUCHT." },
+};
+
+static struct ComicBlock block_p5_7 = { &poly_p5_b7, -1, -1, block_p5_b7_boxes, 1 };
+
+static struct Polygon poly_p5_b8 = { {
+    { 323, 0 },
+    { 478, 0 },
+    { 503, 97 },
+    { 323, 97 },
+} };
+
+static struct ComicBox block_p5_b8_boxes[] = {
+    { 6, 246, 174, 66, "    I'M HIT! NEVER MIND -\nKEEP FOCUSED! THE GRENADE HAS\n    GOT TO HIT CLOSE....", "    JE SUIS TOUCHE! RESTER\nCONCENTRE! LA GRENADE DOIT\n    TOMBER ASSEZ PRES... ", "   ESTOY HERIDO! PERO NO\nIMPORTA. LA GRANADA GOLPEARA\n    Y...", "    ICH BIN GETROFFEN...EGAL,\nKONZENTRATION! DIE GRANATE MU\xe1""\n   DICHT NEBEN IHM TREFFEN..." },
+};
+
+static struct ComicBlock block_p5_8 = { &poly_p5_b8, 99, 13, block_p5_b8_boxes, 1 };
+
+static struct Polygon poly_p5_b9 = { {
+    { 478, 0 },
+    { 588, 0 },
+    { 588, 97 },
+    { 503, 97 },
+} };
+
+static struct ComicBox block_p5_b9_boxes[] = {
+    { 6, 246, 356, 52, "    DAMN, HURTS LIKE THE\nMOTHER OF ALL PAIN! LET IT BLEED.", "         AIE, \x80""A FAIT\n      TRES MAL! JE SAIGNE.", "   MALDITA SEA, COMO\nDUELE! NO DEBO PENSAR EN ESO.", "    VERDAMMT, DAS SCHMERZT\n  WIE VERR\x9a""CKT. EGAL, LA\xe1"" ES\n          BLUTEN..." },
+};
+
+static struct ComicBlock block_p5_9 = { &poly_p5_b9, -1, -1, block_p5_b9_boxes, 1 };
+
+static struct Polygon poly_p5_b10 = { {
+    { 323, 97 },
+    { 453, 97 },
+    { 453, 206 },
+    { 323, 206 },
+} };
+
+static struct ComicBox block_p5_b10_boxes[] = {
+    { 8, 244, 156, 69, "     OH, $%#@! I'M BLIND AS A\n  FRIGGIN' BAT! WHAT THE HELL'S HE\n      PUT IN THOSE DAMNED\n          GRENADES?!", "     OH, $%#@! JE SUIS AUSSI\n  AVEUGLE QU'UNE TAUPE! MAIS\n  QU'EST-CE QU'IL PEUT BIEN METTRE\n    DANS CES MAUDITES GRENADES?", "    $%#@! ESTOY CIEGO\n  COMO UNA RATA! QUE DEMONIOS\n      PUSO EN ESA\n          GRANADA?!", "       OH, $%#@! ICH BIN\n    BLIND WIE 'NE VERFLUCHTE\n  FLEDERMAUS! WAS ZUR H\x99""LLE HAT\n     ER IN DIESE VERDAMMTEN\n        GRANATEN GEPACKT?" },
+};
+
+static struct ComicBlock block_p5_10 = { &poly_p5_b10, 99, 10, block_p5_b10_boxes, 1 };
+
+static struct Polygon poly_p5_b11 = { {
+    { 453, 97 },
+    { 588, 97 },
+    { 588, 143 },
+    { 454, 143 },
+} };
+
+static struct ComicBox block_p5_b11_boxes[] = {
+    { 6, 244, 303, 150, "    CAN'T LET HIM CIRCLE\n       'ROUND ON ME!", "    JE NE PEUX PAS LE\nLAISSER TOURNER AUTOUR DE MOI!", "   NO DEBO DEJAR QUE ME\n       SORPRENDA!", "      ICH DARF IHN NICHT IN\n     MEINEN R\x9a""CKEN LASSEN!" },
+    { 2, 244, 303, 155, "      YER TRICKS DON'T MAKE\n NO DIFFERENCE! SO COME 'N GET\nME YA FREAKIN' DEVIL, 'CAUSE\n   I'M GONNA BLOW YA TO HELL!", "         VOS RUSES NE\n   M'IMPRESSIONNENT PAS! ALORS\nVENEZ ME CHERCHER, SALE DEMON,\n     JE VAIS VOUS RENVOYER\n           EN ENFER!", "    TUS TRUCOS NO TE SERVIRAN\n DE NADA! VEN A DONDE PUEDA\nVERTE PARA VOLARTE LA CABEZA", "      DEINE TRICKS HELFEN DIR\n AUCH NICHT! LOS, KOMM DOCH HER\nUND HOL' MICH, DU TEUFEL, DAMIT ICH\n   DICH ZUR H\x99""LLE PUSTEN KANN!" },
+};
+
+static struct ComicBlock block_p5_11 = { &poly_p5_b11, -1, -1, block_p5_b11_boxes, 2 };
+
+static struct Polygon poly_p5_b12 = { {
+    { 401, 206 },
+    { 504, 206 },
+    { 481, 296 },
+    { 427, 296 },
+} };
+
+static struct ComicBox block_p5_b12_boxes[] = {
+    { 8, 246, 242, 207, "    HE'S COMPLETELY\nDISORIENTED. FIRING BLIND...NOW.\n   TAKE HIM OUT NOW!", "    IL EST COMPLETEMENT\nDESORIENTE. IL TIRE AU HASARD...JE\n VAIS M'EN OCCUPER, MAINTENANT!", "  ESTA DESORIENTADO\nY DISPARA A CIEGAS. ESTA ES MI\n   OPORTUNIDAD!", "       ER HAT V\x99""LLIG DIE\n    ORIENTIERUNG VERLOREN,\n   FEUERT BLINDLINGS DRAUFLOS.\n      JETZT...SCHALTE IHN\n            JETZT AUS!" },
+};
+
+static struct ComicBlock block_p5_12 = { &poly_p5_b12, -1, -1, block_p5_b12_boxes, 1 };
+
+static struct Polygon poly_p5_b13 = { {
+    { 504, 206 },
+    { 588, 206 },
+    { 588, 320 },
+    { 481, 296 },
+} };
+
+static struct ComicBox block_p5_b13_boxes[] = {
+    { 4, 244, 325, 179, "    WHERE THE HELL ARE\nYOU NIGHTBREED? WHEN I FIND YOU,\n    I'M GONNA - UNNNGH!!!", "     OU DIABLE ETES-VOUS\n DONC, SUPPOT DE LA NUIT? SI JE\n    VOUS ATTRAPE, JE VAIS--\n           UNNNGH!!!", "    DONDE ESTAS, DEMONIO?\nCUANDO TE ENCUENTRE TE... UNNNGH!!!", "    WO ZUR H\x99""LLE STECKST\nDU NACHTBRUT? WENN ICH DICH FINDE,\n    WERDE ICH DI---UMMMPF!!!" },
+};
+
+static struct ComicBlock block_p5_13 = { &poly_p5_b13, -1, -1, block_p5_b13_boxes, 1 };
+
+static struct ComicBlock page_5_blocks[] = {
+    block_p5_0,
+    block_p5_1,
+    block_p5_2,
+    block_p5_3,
+    block_p5_4,
+    block_p5_5,
+    block_p5_6,
+    block_p5_7,
+    block_p5_8,
+    block_p5_9,
+    block_p5_10,
+    block_p5_11,
+    block_p5_12,
+    block_p5_13,
+};
+
+static struct ComicPage page_5 = { "DARK/COMDATA/LEPG9_10.SCN", 98, 45, 0, 0, page_5_blocks, 14 };
+
+static struct Polygon poly_p6_b0 = { {
+    { 255, 0 },
+    { 324, 0 },
+    { 324, 83 },
+    { 269, 83 },
+} };
+
+static struct ComicBox block_p6_b0_boxes[] = {
+    { 5, 246, 335, 59, "    ...AND THEN THERE WERE TWO.", "\n     ... ET ILS FURENT DEUX.", "    ...Y SOLO QUEDARON DOS.", "\n  ... DA WAREN'S NUR NOCH ZWEI..." },
+};
+
+static struct ComicBlock block_p6_0 = { &poly_p6_b0, -1, -1, block_p6_b0_boxes, 1 };
+
+static struct Polygon poly_p6_b1 = { {
+    { 192, 83 },
+    { 324, 83 },
+    { 324, 199 },
+    { 192, 199 },
+} };
+
+static struct ComicBox block_p6_b1_boxes[] = {
+    { 8, 246, 5, 39, "    TOUGH LUCK, GUNSLINGER,\n   CAN'T SAY I'LL MISS YOU.", "    PAS DE CHANCE, MAIS JE NE\n  PENSE PAS QUE TU ME MANQUES\n          A L'AVENIR.", "  MALA SUERTE, PISTOLERO,\n NO TE ECHARE DE MENOS.", "    TJA, PECH, REVOLVERHELD,\n ABER ICH KANN NICHT BEHAUPTEN,\n  DA\xe1"" ICH DICH VERMISSEN WERDE." },
+};
+
+static struct ComicBlock block_p6_1 = { &poly_p6_b1, -1, -1, block_p6_b1_boxes, 1 };
+
+static struct Polygon poly_p6_b2 = { {
+    { 74, 185 },
+    { 156, 185 },
+    { 156, 243 },
+    { 73, 243 },
+} };
+
+static struct ComicBox block_p6_b2_boxes[] = {
+    { 1, 246, 160, 250, "    WIDOWMARK!", "\n         WIDOWMARK!", "  VIUDA NEGRA!", "\r         SCHWARZE WITWE!" },
+};
+
+static struct ComicBlock block_p6_2 = { &poly_p6_b2, -1, -1, block_p6_b2_boxes, 1 };
+
+static struct Polygon poly_p6_b3 = { {
+    { 199, 278 },
+    { 225, 253 },
+    { 265, 246 },
+    { 325, 259 },
+    { 325, 316 },
+    { 276, 316 },
+    { 283, 300 },
+    { 208, 300 },
+} };
+
+static struct ComicBox block_p6_b3_boxes[] = {
+    { 8, 244, 52, 216, "    ...PAY! HE'S GOING TO\n  PAY BIG! WITH HIS HEART, AND HIS\n BLOOD, AND HIS FEAR... OH, HIS\n   FEAR! HE'S GOING TO PAY....", "     ...PAYER! IL VA PAYER\n  TRES CHER! AVEC SON COEUR, ET\n SON SANG, ET SA PEUR... OH, SA\n          PEUR! IL VA PAYER....", "    ...LO PAGARAS, CERDO!\n  PAGARAS CON TU CORAZON, TU\n SANGRE Y TU ANGUSTIA... OH, SU\n  ANGUSTIA! EL PAGARA...", "    ...BEZAHLEN! UND WIE ER\n  BEZAHLEN WIRD DAF\x9a""R! MIT SEINEM\nHERZEN, SEINEM BLUT, SEINER ANGST...\n   OH JA, SEINER PANISCHEN ANGST.\n     ER WIRD DAF\x9a""R BEZAHLEN..." },
+};
+
+static struct ComicBlock block_p6_3 = { &poly_p6_b3, -1, -1, block_p6_b3_boxes, 1 };
+
+static struct Polygon poly_p6_b4 = { {
+    { 60, 300 },
+    { 283, 300 },
+    { 276, 316 },
+    { 216, 316 },
+    { 251, 399 },
+    { 60, 399 },
+} };
+
+static struct ComicBox block_p6_b4_boxes[] = {
+    { 3, 244, 175, 290, "    DESPERADO...?!", "\n        DESPERADO...?!", "    DESESPERADO...?!", "\n         SHOWDOWN...?!" },
+};
+
+static struct ComicBlock block_p6_4 = { &poly_p6_b4, -1, -1, block_p6_b4_boxes, 1 };
+
+static struct Polygon poly_p6_b5 = { {
+    { 216, 316 },
+    { 324, 316 },
+    { 324, 399 },
+    { 251, 399 },
+} };
+
+static struct ComicBox block_p6_b5_boxes[] = {
+    { 3, 246, 250, 338, "    HE GOT WHAT HE DESERVED.", "\n   IL A EU CE QU'IL MERITAIT...", "   TUVO LO QUE MERECIA.", "         ER HAT BEKOMMEN,\n       WAS ER VERDIENT HAT." },
+    { 4, 244, 52, 295, "    YOU...!", "\n          VOUS...!", "    TU...!", "\n                 DU...!" },
+};
+
+static struct ComicBlock block_p6_5 = { &poly_p6_b5, -1, -1, block_p6_b5_boxes, 2 };
+
+static struct Polygon poly_p6_b6 = { {
+    { 324, 0 },
+    { 586, 0 },
+    { 586, 99 },
+    { 433, 99 },
+    { 389, 86 },
+    { 382, 50 },
+    { 362, 34 },
+    { 347, 52 },
+} };
+
+static struct ComicBox block_p6_b6_boxes[] = {
+    { 2, 244, 242, 69, "    I DON'T KNOW HOW YOU\nREACHED THE TOP BEFORE ME, BUT\n  I'M NOT IMPRESSED.", "    JE NE SAIS PAS COMMENT\n VOUS AVEZ PU ARRIVER ICI AVANT\n    MOI, MAIS JE NE SUIS\n     PAS IMPRESSIONNEE.", "   NO SE COMO LLEGASTE\nAQUI ANTES QUE YO, PERO NO ME\n  IMPRESIONAS.", "       ICH WEI\xe1"" ZWAR NICHT,\n  WIE DU VOR MIR RAUFGEKOMMEN\n     BIST, ABER ES BEEINDRUCKT\n           MICH NICHT." },
+};
+
+static struct ComicBlock block_p6_6 = { &poly_p6_b6, -1, -1, block_p6_b6_boxes, 1 };
+
+static struct Polygon poly_p6_b7 = { {
+    { 324, 0 },
+    { 347, 52 },
+    { 362, 34 },
+    { 382, 50 },
+    { 389, 86 },
+    { 405, 124 },
+    { 402, 150 },
+    { 418, 197 },
+    { 454, 245 },
+    { 324, 245 },
+} };
+
+static struct ComicBox block_p6_b7_boxes[] = {
+    { 2, 246, 132, 71, "        I'M SURPRISED YOU\n    HAVEN'T LEARNED THAT THE\n TAPESTRY OF NIGHT IS WOVEN WITH\nSURPRISES, WIDOWMARK. BUT, IF YOU\n  UNDERESTIMATE IT, THE DARKNESS\n    WILL SWALLOW YOU WHOLE.", "       JE SUIS SURPRIS DE\n    VOIR QUE VOUS NE SAVEZ PAS\n QUE LA TAPISSERIE DE LA NUIT EST\nTISSEE DE SURPRISES, WIDOWMARK. SI\n VOUS LA SOUS-ESTIMEZ, LA NUIT VOUS\n     ENGLOUTIRA TOUTE ENTIERE.", "    ES CURIOSO QUE AUN\n  NO SEPAS QUE LA NOCHE ESTA\n LLENA DE SORPRESAS, VIUDA NEGRA.\n  SI SUBESTIMAS A LAS TINIEBLAS,\n    PEOR PARA TI.", "          ICH BIN ERSTAUNT,\n     DA\xe1"" DU IMMER NOCH NICHT\n GELERNT HAST, DA\xe1"" DER STOFF DER\nNACHT AUS \x9a""BERRASCHUNGEN GEWOBEN\n  WIRD, SCHWARZE WITWE. ABER WENN\n    DU DIE FINSTERNIS UNTERSCH\x8e""TZT,\n      WIRD SIE DICH VERSCHLINGEN." },
+};
+
+static struct ComicBlock block_p6_7 = { &poly_p6_b7, -1, -1, block_p6_b7_boxes, 1 };
+
+static struct Polygon poly_p6_b8 = { {
+    { 389, 86 },
+    { 433, 99 },
+    { 586, 99 },
+    { 586, 150 },
+    { 402, 150 },
+    { 405, 124 },
+} };
+
+static struct ComicBox block_p6_b8_boxes[] = {
+    { 2, 244, 242, 138, "    VERY POETIC!", "\n       TRES POETIQUE!", "    MUY POETICO!", "\n   WIE AUSGESPROCHEN POETISCH!" },
+    { 4, 246, 337, 55, "    I'M GLAD YOU LIKE IT,\n  BUT IT'S NOT POETRY, IT'S A\n   FUNDAMENTAL MAXIM THAT-", "      SI VOUS AIMEZ, TANT\n   MIEUX, MAIS CE N'EST PAS DE\n  LA POESIE, C'EST UNE MAXIME\n       FONDAMENTALE QUI --", "   ME ALEGRA QUE TE GUSTE,\n  PERO NO ES POESIA. ES UNA\n  REGLA BASICA QUE-", "       SCH\x99""N, DA\xe1"" ES DIR\n   GEF\x8e""LLT, ABER ES IST KEINE\n POESIE. ES IST EINE FUNDAMENTALE\n          MAXIME, DIE..." },
+};
+
+static struct ComicBlock block_p6_8 = { &poly_p6_b8, -1, -1, block_p6_b8_boxes, 2 };
+
+static struct Polygon poly_p6_b9 = { {
+    { 402, 150 },
+    { 586, 150 },
+    { 586, 245 },
+    { 454, 245 },
+    { 418, 197 },
+} };
+
+static struct ComicBox block_p6_b9_boxes[] = {
+    { 6, 244, 261, 201, "       I DON'T GIVE A RAT'S ASS\n   ABOUT YOUR MAXIMS! I LIVE BY MY\n OWN RULES AND I'VE WAITED A LONG\nTIME FOR YOUR HEAD. I NEVER EAT\n   THE HEAD, YOU KNOW? I KEEP IT\n        IN A SAFE PLACE....", "             JE ME FOUS\n   COMPLETEMENT DE VOS MAXIMES!\n JE VIS SELON MES PROPRES REGLES,\n  ET J'ATTENDS VOTRE TETE DEPUIS\n LONGTEMPS. JE NE MANGE JAMAIS LES\n  TETES, VOUS SAVEZ... JE LES GARDE\n         DANS UN ENDROIT SUR...", "    ME IMPORTAN POCO TUS\n  REGLAS! YO TENGO LAS MIAS Y HE\n ESPERADO MUCHO POR TU CABEZA.\n  NUNCA LAS COMO, SABES? LAS\n   GUARDO EN LUGAR SEGURO...", "           ICH GEBE KEINEN\n   RATTENFURZ AUF DEINE MAXIMEN!\n ICH LEBE NACH MEINEN EIGENEN REGELN,\nUND ICH HABE SCHON VIEL ZU LANGE AUF\n  DEINEN KOPF GEWARTET. ICH ESSE DEN\n   KOPF NIEMALS AUF, WEI\xe1""T DU. DEN \n    BEWAHRE ICH AN EINEM\n         EHRENPLATZ AUF..." },
+};
+
+static struct ComicBlock block_p6_9 = { &poly_p6_b9, -1, -1, block_p6_b9_boxes, 1 };
+
+static struct Polygon poly_p6_b10 = { {
+    { 324, 245 },
+    { 586, 245 },
+    { 586, 290 },
+    { 388, 399 },
+    { 324, 399 },
+} };
+
+static struct ComicBox block_p6_b10_boxes[] = {
+    { 2, 244, 176, 303, "    IT'S PAYBACK TIME!", "\n    IL EST TEMPS DE PAYER!", "  LA HORA HA LLEGADO!", "\n             ZAHLTAG!" },
+};
+
+static struct ComicBlock block_p6_10 = { &poly_p6_b10, -1, -1, block_p6_b10_boxes, 1 };
+
+static struct ComicBlock page_6_blocks[] = {
+    block_p6_0,
+    block_p6_1,
+    block_p6_2,
+    block_p6_3,
+    block_p6_4,
+    block_p6_5,
+    block_p6_6,
+    block_p6_7,
+    block_p6_8,
+    block_p6_9,
+    block_p6_10,
+};
+
+static struct ComicPage page_6 = { "DARK/COMDATA/LEPG1112.SCN", 98, 46, 0, 0, page_6_blocks, 11 };
+
+static struct Polygon poly_p7_b0 = { {
+    { 112, 50 },
+    { 206, 50 },
+    { 164, 91 },
+    { 216, 136 },
+    { 116, 136 },
+    { 158, 92 },
+} };
+
+static struct ComicBox block_p7_b0_boxes[] = {
+    { 7, 244, 220, 49, "     SUCKER!", "\n             SALAUD !", "  CHUPA ESTA!", "\n           PENNER!" },
+};
+
+static struct ComicBlock block_p7_0 = { &poly_p7_b0, 99, 104, block_p7_b0_boxes, 1 };
+
+static struct Polygon poly_p7_b1 = { {
+    { 175, 102 },
+    { 254, 102 },
+    { 186, 208 },
+    { 140, 136 },
+    { 216, 136 },
+} };
+
+static struct ComicBox block_p7_b1_boxes[] = {
+    { 7, 246, 254, 107, "     DAMN HER....", "\n          MAUDITE SOIT...!", "     MALDITA...", "\n        DIESE VERDAMMTE...!" },
+};
+
+static struct ComicBlock block_p7_1 = { &poly_p7_b1, -1, -1, block_p7_b1_boxes, 1 };
+
+static struct Polygon poly_p7_b2 = { {
+    { 59, 119 },
+    { 129, 119 },
+    { 161, 168 },
+    { 161, 268 },
+    { 59, 268 },
+} };
+
+static struct ComicBox block_p7_b2_boxes[] = {
+    { 5, 246, 171, 205, "     VENOM!!!", "\n           DU VENIN!!!", "    VENENO!!!", "\n             GIFT!!!" },
+};
+
+static struct ComicBlock block_p7_2 = { &poly_p7_b2, 99, 126, block_p7_b2_boxes, 1 };
+
+static struct Polygon poly_p7_b3 = { {
+    { 161, 190 },
+    { 322, 190 },
+    { 322, 282 },
+    { 161, 281 },
+} };
+
+static struct ComicBox block_p7_b3_boxes[] = {
+    { 7, 244, 323, 172, "   ...GAINING! THE BASTARD'S\n   GAINING ON ME!", "     ...IL ME RATTRAPE! CE\n      CHIEN ME RATTRAPE!", "   ...ME PILLO! EL BASTARDO\n  ME HA PILLADO!", "    ...FERTIG! DIESER BASTARD\n  MACHT MICH WIRKLICH FERTIG!" },
+};
+
+static struct ComicBlock block_p7_3 = { &poly_p7_b3, -1, -1, block_p7_b3_boxes, 1 };
+
+static struct Polygon poly_p7_b4 = { {
+    { 323, 0 },
+    { 487, 0 },
+    { 464, 168 },
+    { 322, 157 },
+} };
+
+static struct ComicBox block_p7_b4_boxes[] = {
+    { 2, 246, 176, 48, "      I TOLD YOU TO BEHAVE!\n  EITHER SETTLE DOWN NOW, OR\n YOU CAN JOIN DESPERADO ON THE\n       BODY BAG EXPRESS!", "\n      JE VOUS AI DIT DE VOUS\n  TENIR TRANQUILLE! SOIT VOUS\n VOUS CALMEZ TOUT DE SUITE, SOIT\n VOUS ALLEZ REJOINDRE DESPERADO\n       AU RAYON DES CHERS\n            DISPARUS!", "    TE LO DIJE!\n  RINDETE O IRAS A UNIRTE A\n DESESPERADO EN EL EXPRESO AL\n       INFIERNO!", "      ICH HABE DIR GESAGT,\n  DU SOLLST DICH BENEHMEN! H\x99""R\n    JETZT AUF, ODER DU KANNST\n    SHOWDOWN IM LEICHENSACK\n         GESELLSCHAFT LEISTEN!" },
+};
+
+static struct ComicBlock block_p7_4 = { &poly_p7_b4, -1, -1, block_p7_b4_boxes, 1 };
+
+static struct Polygon poly_p7_b5 = { {
+    { 428, 193 },
+    { 464, 168 },
+    { 522, 157 },
+    { 586, 178 },
+    { 586, 240 },
+    { 487, 257 },
+    { 431, 230 },
+} };
+
+static struct ComicBox block_p7_b5_boxes[] = {
+    { 4, 244, 319, 99, "    WAIT...!", "\n         ATTENDEZ...!", "  ESPERA...!", "\n            WARTE...!" },
+};
+
+static struct ComicBlock block_p7_5 = { &poly_p7_b5, -1, -1, block_p7_b5_boxes, 1 };
+
+static struct Polygon poly_p7_b6 = { {
+    { 322, 157 },
+    { 464, 168 },
+    { 428, 193 },
+    { 431, 230 },
+    { 456, 246 },
+    { 322, 249 },
+} };
+
+static struct ComicBox block_p7_b6_boxes[] = {
+    { 1, 246, 433, 251, "    AHHHH! THAT'S IT WITCH,\nTIME TO PUNCH YOUR TICKET...\n  ALL ABOARD!", "       AHHHH! C'EST \x80""A,\n    SORCIERE, IL EST TEMPS...\n           ALLONS-Y!", "  BIEN! TOMA TU BOLETO \nAL INFIERNO. TODOS A\n  BORDO!", "     NA GUT, ALTE HEXE, DAS\n   WAR'S! ZEIT ZUM EINT\x9a""TEN!" },
+};
+
+static struct ComicBlock block_p7_6 = { &poly_p7_b6, -1, -1, block_p7_b6_boxes, 1 };
+
+static struct Polygon poly_p7_b7 = { {
+    { 530, 258 },
+    { 586, 240 },
+    { 586, 399 },
+    { 530, 399 },
+} };
+
+static struct ComicBox block_p7_b7_boxes[] = {
+    { 8, 246, 330, 290, "   AND THEN THERE WAS ONE...", "\n  ET IL N'EN RESTA PLUS QU'UNE...", "   Y SOLO UNO QUEDO...", "\n   ...DA WAR ES NUR NOCH EINER...." },
+};
+
+static struct ComicBlock block_p7_7 = { &poly_p7_b7, -1, -1, block_p7_b7_boxes, 1 };
+
+static struct ComicBlock page_7_blocks[] = {
+    block_p7_0,
+    block_p7_1,
+    block_p7_2,
+    block_p7_3,
+    block_p7_4,
+    block_p7_5,
+    block_p7_6,
+    block_p7_7,
+};
+
+static struct ComicPage page_7 = { "DARK/COMDATA/LEPG1314.SCN", 98, 47, 0, 0, page_7_blocks, 8 };
+
+static struct Polygon poly_p8_b0 = { {
+    { 59, 0 },
+    { 324, 0 },
+    { 324, 45 },
+    { 278, 49 },
+    { 214, 80 },
+    { 188, 136 },
+    { 59, 124 },
+} };
+
+static struct ComicBox block_p8_b0_boxes[] = {
+    { 5, 246, 218, 54, "   ...SO WEAK. IT'S THE VENOM...\n NOT SURE I CAN MAKE IT. STOP IT!\nSTAY ALERT!  I'M TWO DOWN WITH\n    ONE TO GO... WONDER WHERE\n           SHE IS...", "\n   ...SI FAIBLE. C'EST LE VENIN...\n JE NE SAIS PAS SI JE TIENDRAI LE\nCOUP. STOP! RESTER EVEILLE! JE\nSUIS AU BOUT DU ROULEAU... JE ME\n    DEMANDE OU ELLE PEUT\n          BIEN ETRE....", "   ...ESTOY DEBIL. ES EL VENENO...\n NO SE SI PODRE. BASTA!\nESTATE ALERTA! AUN TE QUEDA\n    UNA... DONDE\n           ESTARA?", "\n   ...SO SCHWACH. DAS IST DAS\n GIFT...WEI\xe1"" NICHT, OB ICH ES SCHAFFE.\nH\x99""R AUF! BLEIB WACH! ZWEI SIND SCHON\n  ABGEFR\x9a""HST\x9a""CKT, EINE IST NOCH AUF\n   DER WARTELISTE! ICH FRAGE\n      MICH, WO SIE STECKT..." },
+};
+
+static struct ComicBlock block_p8_0 = { &poly_p8_b0, -1, -1, block_p8_b0_boxes, 1 };
+
+static struct Polygon poly_p8_b1 = { {
+    { 324, 45 },
+    { 278, 49 },
+    { 214, 80 },
+    { 188, 136 },
+    { 324, 149 },
+} };
+
+static struct ComicBox block_p8_b1_boxes[] = {
+    { 3, 244, 252, 74, "    HELLO HANDSOME, BUY A\n       GIRL A DRINK?", "     SALUT, BEAU GOSSE, TU\n      M'OFFRES UN VERRE?", "    HOLA, HERMOSO. ME\n     PAGAS UNA COPA?", "    HALLO, H\x9a""BSCHER. L\x8e""DST\n  DU MICH ZU 'NEM DRINK EIN?" },
+    { 1, 246, 354, 151, "    TOPHAT...!", "\n          TOPHAT...!", "    DIVA...", "\n          ZYLINDERCHEN..!" },
+};
+
+static struct ComicBlock block_p8_1 = { &poly_p8_b1, -1, -1, block_p8_b1_boxes, 2 };
+
+static struct Polygon poly_p8_b2 = { {
+    { 129, 215 },
+    { 245, 216 },
+    { 245, 315 },
+    { 129, 315 },
+} };
+
+static struct ComicBox block_p8_b2_boxes[] = {
+    { 3, 244, 255, 199, "      YOU MAY BE DARKNESS\n INCARNATE, DEARY, BUT YOU BLEED\n   JUST LIKE ANY MISERABLE\n            STOOGE.", "      VOUS ETES PEUT-ETRE\n L'INCARNATION DES TENEBRES, TRES\n CHER, MAIS VOUS SAIGNEZ COMME\n     LE PREMIER CRETIN VENU!", "     SERAS LA ENCARNACION\n DE LA NOCHE, PERO TU SANGRE ES\n  ROJA COMO LA DE CUALQUIER\n            IDIOTA.", "        DU MAGST JA DIE\n   VERK\x99""RPERTE DUNKELHEIT SEIN,\n  SCHATZI, ABER DU BLUTEST GENAU\n    WIE JEDES ARME SCHWEIN." },
+};
+
+static struct ComicBlock block_p8_2 = { &poly_p8_b2, -1, -1, block_p8_b2_boxes, 1 };
+
+static struct Polygon poly_p8_b3 = { {
+    { 59, 124 },
+    { 324, 149 },
+    { 324, 209 },
+    { 59, 232 },
+} };
+
+static struct ComicBox block_p8_b3_boxes[] = {
+    { 1, 244, 195, 174, "    CORRECT! YOU WIN THE\n     PRIZE, BABY FACE!", "    EXACT! TU AS GAGNE LE\n  GROS LOT, GUEULE D'AMOUR!", "    EXACTO! HAS GANADO\n   EL PRECIO, NENE!", "    STIMMT! DER KANDIDAT HAT\n HUNDERT PUNKTE, MILCHGESICHT!" },
+};
+
+static struct ComicBlock block_p8_3 = { &poly_p8_b3, 99, 27, block_p8_b3_boxes, 1 };
+
+static struct Polygon poly_p8_b4 = { {
+    { 60, 303 },
+    { 181, 303 },
+    { 181, 399 },
+    { 59, 399 },
+} };
+
+static struct ComicBox block_p8_b4_boxes[] = {
+    { 3, 244, 196, 298, "        I WATCHED YOU TAKE\n   OUT DESPERADO AND WIDOWMARK...\n    YOU WERE MARVY! BUT I CAN'T\n  IMAGINE WHY YOU'RE WORKING SO\n  HARD TO REMOVE THE COMPETITION.\n       WE NEED EACH OTHER...", "        JE VOUS AI OBSERVE\n     PENDANT QUE VOUS VOUS\n    OCCUPIEZ DE DESPERADO ET DE\n      WIDOWMARK... VOUS ETIEZ\n           MERVEILLEUX!", "    FUISTE MUY HABIL PARA\n  MATAR A DESESPERADO Y VIUDA\n  NEGRA. PERO NO CONTASTE CON\n  MI ASTUCIA.\n   RECUERDA QUE SOMOS UNO...", "        ICH HABE ZUGESCHAUT,\n     WIE DU SHOWDOWN UND DIESE\n SPINNE AUSGESCHALTET HAST...DU BIST\n SUPERSUPERSUPER, BABIIIEE! ABER ICH\n  WEI\xe1"" GAR NICHT, WARUM DU DICH SO\n     ANSTRENGST MIT MIR. WIR\n     BRAUCHEN EINANDER DOCH..." },
+    { 3, 244, 196, 298, "NULL", "\n      MAIS JE NE COMPRENDS\n   PAS POURQUOI VOUS FAITES\n  TOUS CES EFFORTS POUR VOUS\n DEBARRASSER DE VOS ADVERSAIRES.\n   NOUS AVONS BESOIN DE CETTE\n           RIVALITE...", "NULL", "NULL" },
+};
+
+static struct ComicBlock block_p8_4 = { &poly_p8_b4, -1, -1, block_p8_b4_boxes, 2 };
+
+static struct Polygon poly_p8_b5 = { {
+    { 191, 305 },
+    { 324, 305 },
+    { 324, 399 },
+    { 191, 399 },
+} };
+
+static struct ComicBox block_p8_b5_boxes[] = {
+    { 4, 244, 12, 285, "     ...LIKE DIFFERENT SIDES\n  OF THE SAME COIN, SWEET CHEEKS,\n WE DEFINE OUR OPPOSITE! MMMMM,\n   YUMMY... TASTES JUST LIKE\n            CHICKEN!", "    ... COMME LES DEUX COTES\n  D'UNE PIECE, NOUS DEFINISSONS\n NOTRE CONTRAIRE! MMMMM, MIAM...\n       ON DIRAIT DU POULET!", "     ...COMO LAS DOS CARAS\n  DE UNA MONEDA. SOMOS LOS\n OPUESTOS QUE NO PUEDEN VIVIR\n  EL UNO SIN EL OTRO...", "     ...WIE DIE BEIDEN SEITEN\n  DERSELBEN M\x9a""NZE, KNUDDELB\x8e""R.\n OHNE DEN ANDEREN G\x8e""BE ES KEINEN\n   VON UNS. HMMMM, LECKER...\n        SCHMECKT WIE H\x9a""HNCHEN!" },
+};
+
+static struct ComicBlock block_p8_5 = { &poly_p8_b5, -1, -1, block_p8_b5_boxes, 1 };
+
+static struct Polygon poly_p8_b6 = { {
+    { 324, 0 },
+    { 562, 0 },
+    { 524, 30 },
+    { 523, 102 },
+    { 322, 102 },
+} };
+
+static struct ComicBox block_p8_b6_boxes[] = {
+    { 6, 246, 200, 83, "    STAY CONSCIOUS... JUST\n       STAY AWAKE...!", "      RESTER CONSCIENT...\n       RESTER EVEILLE...!", "   MANTENTE DESPIERTO...\n    NO TE DUERMAS...!", "     BLEIB' BEI BEWU\xe1""TSEIN....\n      BLEIB' BLO\xe1"" WACH...!" },
+};
+
+static struct ComicBlock block_p8_6 = { &poly_p8_b6, -1, -1, block_p8_b6_boxes, 1 };
+
+static struct Polygon poly_p8_b7 = { {
+    { 562, 0 },
+    { 524, 30 },
+    { 523, 102 },
+    { 558, 131 },
+    { 589, 135 },
+} };
+
+static struct ComicBox block_p8_b7_boxes[] = {
+    { 2, 244, 340, 81, "    NOW FOR SOME REAL FUN!", "          ON VA ENFIN\n       POUVOIR S'AMUSER!", "   AHORA NOS DIVERTIREMOS!", "        UND JETZT ZU ETWAS\n         RICHTIG SPA\xe1""IGEM!" },
+};
+
+static struct ComicBlock block_p8_7 = { &poly_p8_b7, -1, -1, block_p8_b7_boxes, 1 };
+
+static struct Polygon poly_p8_b8 = { {
+    { 324, 102 },
+    { 523, 102 },
+    { 558, 131 },
+    { 589, 135 },
+    { 589, 260 },
+    { 324, 260 },
+} };
+
+static struct ComicBox block_p8_b8_boxes[] = {
+    { 4, 244, 227, 82, "     YEE-HAW, RIDE'M COWBOY!\n  I REALLY DON'T THINK YOU'RE\n INTO THIS, DEAR...I WONDER IF\nIT WOULD HELP IF I SHOVED ANOTHER\n      COIN IN YOUR SLOT!", "\n     YIPPY, ALLEZ GO! JE CROIS\n   VRAIMENT QUE VOUS N'AVEZ PAS\n  LA TETE A CE QUE VOUS FAITES,\n MON CHER! JE ME DEMANDE SI VOUS\n   N'AURIEZ PAS BESOIN D'UN\n        PETIT COUP DE MAIN!", "    VENGA, VAQUERO!\n  VEAMOS SI SABES JUGAR A\n ESTO... BAILARAS MEJOR SI\nPONGO OTRA MONEDA EN LA\n      MAQUINA?", "             JUHUUH, LOS,\n         REITE SIE ZU, COWBOY!\n  IRGENDWIE SCHEINT DIR DAS NICHT SO\n RICHTIG ZU GEFALLEN, SCHATZ. OB\nES WOHL HELFEN W\x9a""RDE, WENN ICH\n NOCH EINE WEITERE M\x9a""NZE IN DEINEN\n     SCHLITZ EINWERFE?" },
+};
+
+static struct ComicBlock block_p8_8 = { &poly_p8_b8, -1, -1, block_p8_b8_boxes, 1 };
+
+static struct Polygon poly_p8_b9 = { {
+    { 324, 260 },
+    { 461, 260 },
+    { 461, 399 },
+    { 324, 399 },
+} };
+
+static struct ComicBox block_p8_b9_boxes[] = {
+    { 4, 244, 181, 258, "    AND TO THINK YOU WANTED\nTO STAY IN TONIGHT! OH, YOU\n         SILLY BOY!", "      ET DIRE QUE VOUS NE\n  PENSIEZ PAS SORTIR CE SOIR!\n        PAUVRE IMBECILE!", "  Y PENSAR QUE IBAS A\nQUEDARTE EN CASA HOY,\n    CHICO TONTO!", "    NA BITTE, UND DU WOLLTEST\nHEUTE ABEND ZU HAUSE BLEIBEN!\n         DUMMERLE....!" },
+};
+
+static struct ComicBlock block_p8_9 = { &poly_p8_b9, -1, -1, block_p8_b9_boxes, 1 };
+
+static struct Polygon poly_p8_b10 = { {
+    { 461, 260 },
+    { 589, 260 },
+    { 589, 399 },
+    { 461, 399 },
+} };
+
+static struct ComicBox block_p8_b10_boxes[] = {
+    { 4, 244, 314, 253, "      WELL I'M SURE WE COULD\n  HAVE MORE FUN, BUT IT IS A\nSCHOOL NIGHT...SO, I'LL JUST\n       MURDER YOU NOW!!", "      JE SUIS SURE QUE NOUS\n  POURRIONS NOUS AMUSER ENCORE\nPLUS, MAIS C'EST UNE NUIT SPECIALE...\n     ALORS JE VAIS VOUS TUER!", "   ME GUSTARIA DIVERTIRME\n  UN POCO MAS, PERO DEBO IRME,\n ASI QUE TE MATARE YA!", "\n        NAJA, ALSO ICH SCH\x8e""TZE,\n    WIR K\x99""NNTEN NOCH MEHR SPA\xe1""\n  MITEINANDER HABEN, ABER ICH MU\xe1""\n    ZEITIG HEIM. ALSO WERDE ICH\n      DICH JETZT EINFACH\n       KURZ UMBRINGEN!!" },
+};
+
+static struct ComicBlock block_p8_10 = { &poly_p8_b10, -1, -1, block_p8_b10_boxes, 1 };
+
+static struct ComicBlock page_8_blocks[] = {
+    block_p8_0,
+    block_p8_1,
+    block_p8_2,
+    block_p8_3,
+    block_p8_4,
+    block_p8_5,
+    block_p8_6,
+    block_p8_7,
+    block_p8_8,
+    block_p8_9,
+    block_p8_10,
+};
+
+static struct ComicPage page_8 = { "DARK/COMDATA/LEPG1516.SCN", 98, 48, 1, 0, page_8_blocks, 11 };
+
+static struct Polygon poly_p9_b0 = { {
+    { 187, 0 },
+    { 306, 0 },
+    { 334, 35 },
+    { 311, 82 },
+    { 247, 95 },
+    { 187, 83 },
+} };
+
+static struct ComicBox block_p9_b0_boxes[] = {
+    { 2, 255, 75, 40, "    BACK OFF, TOPHAT!", "\n        RECULE, TOPHAT!", "    ATRAS, DIVA!", "\n      ZUR\x9a""CK, ZYLINDERLADY!" },
+};
+
+static struct ComicBlock block_p9_0 = { &poly_p9_b0, 99, 25, block_p9_b0_boxes, 1 };
+
+static struct Polygon poly_p9_b1 = { {
+    { 187, 83 },
+    { 247, 95 },
+    { 308, 102 },
+    { 278, 153 },
+    { 289, 230 },
+    { 319, 261 },
+    { 255, 399 },
+    { 187, 399 },
+} };
+
+static struct ComicBox block_p9_b1_boxes[] = {
+    { 2, 255, 10, 150, "        TOPHAT'S OUT FOR THE\n   COUNT. I FOUND DESPERADO AND I\n ASSUME THAT MOUND OF HAIR AND\nBLOOD IS WHAT'S LEFT OF WIDOWMARK.\n YOU SURE AS HELL WERE THOROUGH...\n         ARE YOU O.K.?", "\n        TOPHAT EST ELIMINEE.\n   J'AI TROUVE DESPERADO ET JE\nSUPPOSE QU'IL NE RESTE DE WIDOWMARK\nQUE CES TAS DE CHEVEUX COUVERTS DE\n     SANG. TU AS FAIT DU BEAU\n         TRAVAIL... \x80""A VA?", "      LA DIVA ESTA FUERA DE\n   COMBATE. VI A DESESPERADO Y\n SUPONGO QUE AQUELLOS RESTOS\n ES LO QUE QUEDA DE VIUDA NEGRA.\n PARECE QUE TE HAS DIVERTIDO...\n        ESTAS BIEN?", "        MISS ZYLINDERCHEN IST\n   AUSGEZ\x8e""HLT. ICH HABE SHOWDOWN\n   GEFUNDEN, UND ICH VERMUTE MAL,\n  DIESER HAUFEN BLUTIGER HAARE IST\n   ALLES, WAS VON DER SCHWARZEN\n   WITWE \x9a""BRIGGEBLIEBEN IST." },
+    { 2, 255, 10, 150, "NULL", "NULL", "NULL", "      ALSO DU ARBEITEST\n    SCHON VERDAMMT GR\x9a""NDLICH.\n       HE, BIST DU OK?" },
+    { 4, 246, 44, 208, "    I'M FINE! YOU'VE GOT A\nLOT OF NERVE, STILETTO, BUTTING\n  IN WHERE YOU DON'T BELONG!", "\n    JE VAIS TRES BIEN! TU AS\nDU CRAN, STILETTO D'INTERVENIR DANS\n   DES AFFAIRES QUI NE TE\n        REGARDENT PAS!", "   PERFECTAMENTE! NO SE\n POR QUE TE METES DONDE NO TE\n LLAMAN, STILETTO!", "\n    MIR GEHT'S GUT. DU HAST\nVIELLEICHT NERVEN, STILETTO, HIER\n  EINFACH REINZUPLATZEN, WO DU\n    GAR NICHTS VERLOREN HAST!" },
+};
+
+static struct ComicBlock block_p9_1 = { &poly_p9_b1, -1, -1, block_p9_b1_boxes, 3 };
+
+static struct Polygon poly_p9_b2 = { {
+    { 278, 153 },
+    { 309, 102 },
+    { 451, 102 },
+    { 451, 251 },
+    { 353, 277 },
+    { 289, 230 },
+} };
+
+static struct ComicBox block_p9_b2_boxes[] = {
+    { 1, 255, 443, 168, "        I'M YOUR PARTNER! I\n   DON'T KNOW WHAT YOUR PROBLEM\n IS LATELY. YOU'RE OBVIOUSLY ON\nSOME EGO TRIP, TAKING OUT ALL THE\n BUTTHEADS SINGLE-HANDEDLY, BUT IF\n  I HADN'T SHOWN, TOPHAT WOULD'VE\n    FINISHED YOU OFF, HERO!", "       JE SUIS TA PARTENAIRE!\n   JE NE SAIS PAS QUEL EST TON\n     PROBLEME DEPUIS QUELQUE\n              TEMPS.", "        SOMOS SOCIOS! NO\n   SE QUE TE PASA ULTIMAMENTE.\n TE HAS VUELTO EGOISTA, NO CUENTAS\n CONMIGO PARA NADA... PERO DE NO\n SER POR MI, LA DIVA TE HUBIERA\n    MATADO, HEROE!", "       ICH BIN DEINE PARTNERIN!\n    ICH WEI\xe1"" NICHT, WAS IN LETZTER\n        ZEIT MIT DIR LOS IST!" },
+    { 1, 255, 443, 168, "NULL", "\n     TU ES APPAREMMENT DANS\n  UN TRIP SOLITAIRE, TU ESSAYES\n  D'ELIMINER TOUS LES MALFRATS\n  DE LA VILLE D'UNE SEULE MAIN.\n   MAIS SANS MON INTERVENTION,\n     TOPHAT T'AURAIT REGLE TON\n           COMPTE, HEROS! ", "NULL", "           DU BIST WOHL AUF\n       EINEM EGO-TRIP, DA\xe1"" DU\n   ALLE MISTBACKEN GANZ ALLEINE\n AUSSCHALTEN WILLST, ABER WENN ICH\n    NICHT AUFGETAUCHT W\x8e""RE, H\x8e""TTE\n        MISS ZYLINDERCHEN DICH\n          HELDEN ABSERVIERT!" },
+};
+
+static struct ComicBlock block_p9_2 = { &poly_p9_b2, -1, -1, block_p9_b2_boxes, 2 };
+
+static struct Polygon poly_p9_b3 = { {
+    { 319, 261 },
+    { 353, 277 },
+    { 329, 399 },
+    { 255, 399 },
+} };
+
+static struct ComicBox block_p9_b3_boxes[] = {
+    { 3, 246, 384, 308, "      YOU ARE FULL OF CRAP,\n  GIRL! I HAD EVERYTHING UNDER\nCONTROL...JUST DROP IT BECAUSE THIS\n     DISCUSSION IS OVER!", "      TU NE RACONTES QUE DES\n  CONNERIES, FEMME. JE CONTROLAIS\nPARFAITEMENT LA SITUATION... LAISSE\n  TOMBER, DE TOUTE MANIERE, CETTE\n      DISCUSSION EST TERMINEE!", "  TE DAS MUCHA IMPORTANCIA,\n MUCHACHITA! TODO ESTABA BAJO\n CONTROL... LARGATE YA! NO HAY\n NADA DE QUE HABLAR!", "          DU ERZ\x8e""HLST NUR\n  BL\x99""DSINN, STILETTO! ICH HATTE\nALLES WUNDERBAR UNTER KONTROLLE...\n  VERGI\xe1"" ES, DIE DISKUSSION IST\n             GELAUFEN!" },
+};
+
+static struct ComicBlock block_p9_3 = { &poly_p9_b3, -1, -1, block_p9_b3_boxes, 1 };
+
+static struct Polygon poly_p9_b4 = { {
+    { 353, 277 },
+    { 451, 251 },
+    { 451, 399 },
+    { 329, 399 },
+} };
+
+static struct ComicBox block_p9_b4_boxes[] = {
+    { 4, 246, 198, 243, "      TAKE TOPHAT TO THE\n  POLICE, AND DON'T FORGET\nABOUT THE OTHER BODIES. I'M\n    GOING TO SHADOWLAIR.", "      EMMENE TOPHAT A LA\n  POLICE, ET N'OUBLIE PAS LES\n  AUTRES CADAVRES. JE VAIS A\n       L'ANTRE D'OMBRE.", "   LLEVA A LA DIVA A LA\n  POLICIA Y NO OLVIDES LOS\n DOS CADAVERES. YO VOY A\n LA CUEVA SOMBRIA.", "     BRING ZYLINDERCHEN ZUR\n  POLIZEI, UND VERGI\xe1"" DIE ANDEREN\nLEICHEN NICHT. ICH GEHE ZUM\n    SCHATTENHORT ZUR\x9a""CK." },
+};
+
+static struct ComicBlock block_p9_4 = { &poly_p9_b4, -1, -1, block_p9_b4_boxes, 1 };
+
+static struct ComicBlock page_9_blocks[] = {
+    block_p9_0,
+    block_p9_1,
+    block_p9_2,
+    block_p9_3,
+    block_p9_4,
+};
+
+static struct ComicPage page_9 = { "DARK/COMDATA/LEPG17.SCN", 98, 49, 1, 0, page_9_blocks, 5 };
+
+static struct Polygon poly_p10_b0 = { {
+    { 59, 0 },
+    { 228, 0 },
+    { 222, 115 },
+    { 59, 115 },
+} };
+
+static struct ComicBox block_p10_b0_boxes[] = {
+    { 0, 246, 69, 103, "SHADOWLAIR. LOCATED DEEP UNDERGROUND, THE REFORMED\nTEMPLE IS A REMNANT OF AN ERA PASSED. ONCE THE\nHALLOWED SHRINE OF AN ELITE SECRET ORDER OF\nINTELLIGENTSIA, THE TEMPLE NOW SERVES A SINGLE MAN\nAS THE BASTION OF MIDNIGHT... THE REFUGE OF SHADOW...\nTHE SANCTUARY OF DARKSHEER.", "L'ANTRE D'OMBRE.  ENFOUI DANS LES PROFONDEURS DE\nLA VILLE, LE TEMPLE REFORME TEMOIGNE DES SPLENDEURS\nDU PASSE. AUTREFOIS UTILISE COMME SANCTUAIRE POUR UN\nORDRE SECRET, LE TEMPLE NE SERT PLUS AUJOURD'HUI QU'A\nUN SEUL HOMME, QUI S'EN SERT DE BASTION NOCTURNE...\nLE REFUGE DE L'OMBRE... LE SANCTUAIRE DE DARKSHEER.", "LA CUEVA SOMBRIA. REFUGIO SUBTERRANEO HECHO A\nPARTIR DE UN TEMPLO ANTIGUO. LO QUE UNA VEZ FUE\nLA ELITE DE UNA ORDEN SECRETA DE ESTUDIOSOS,\nAHORA ES EL HOGAR DE UN SOLO HOMBRE, EL AMO DE\nLA NOCHE... EL SANTUARIO DE TENEBROSO.", "DER SCHATTENHORT. DER UNTERIRDISCHE EHEMALIGE\nTEMPEL IST DAS \x9a""BERBLEIBSEL EINER LANGE\nVERGANGENEN \x8e""RA. EINST DIENTE ER ALS HEILIGER\nSCHREIN EINES GEHEIMBUNDES DER GEISTIGEN ELITE.\nHEUTE DIENT ER NUR EINEM EINZIGEN MANN ALS BASTION\nDER MITTERNACHT...ALS HORT DER FINSTERNIS...\nALS ZUFLUCHT VON DARKSHEER." },
+    { 5, 246, 177, 102, "        LIQUIDARK... SO COLD IT\n    BURNS! IT'S ALWAYS LIKE THAT\n WHEN I'M INJURED. HOW MANY TIMES\nHAVE I DONE THIS? BAPTIZED IN THE\nICY WETNESS OF DISTILLED DARKNESS...\n      IT WORKS EVERY TIME...\n         SAVES MY SKIN.", "        LE LIQUIDARK... IL EST SI\n    FROID QU'IL BRULE! C'EST COMME\n \x80""A QUAND JE SUIS BLESSE, EN TOUT\nCAS. COMMENT AI-JE REUSSI? BAPTISE\nDANS L'HUMIDITE GLACIALE DES TENEBRES\n  DISTILLEES... IL FONCTIONNE TOUT\n       LE TEMPS... ET ME SAUVE\n                LA VIE.", "        LIQUIOSCURO... TAN FRIO\n    QUE QUEMA! SIEMPRE PASA CUANDO\n ESTOY HERIDO. CUANTAS VECES HE\nHECHO ESTO? ES MI BAUTISMO EN LA\nHELADA HUMEDAD DE LAS TINIEBLAS...\n   SIEMPRE FUNCIONA...\n   SIEMPRE ME SALVA.", "         DUSTER\x99""L... SO KALT,\n      DA\xe1"" ES BRENNT. SO IST ES\n  IMMER, WENN ICH VERLETZT BIN. WIE\n  OFT HABE ICH DAS SCHON GETAN?\n GETAUFT IN DER EISIGEN FEUCHTIGKEIT\n   DESTILLIERTER DUNKELHEIT...\n         FUNKTIONIERT JEDESMAL...\n              RETTET MICH." },
+};
+
+static struct ComicBlock block_p10_0 = { &poly_p10_b0, -1, -1, block_p10_b0_boxes, 2 };
+
+static struct Polygon poly_p10_b1 = { {
+    { 59, 115 },
+    { 222, 115 },
+    { 230, 286 },
+    { 59, 286 },
+} };
+
+static struct ComicBox block_p10_b1_boxes[] = {
+    { 7, 246, 153, 252, "        REMEMBERING... HOW IT\n   ALL STARTED. I WAS JUST A PUNK\n ORPHAN. FATHER DESMOND... WHAT A\nSALESMAN! HE HAD US ALL JUMPING TO\n BECOME WARDS... TO HELP CLEAN UP\n   THE STREETS OF NOCTROPOLIS.\n     BIRTH OF A VIGILANTE...", "          JE ME SOUVIENS...\n    COMMENT TOUT A COMMENCE.\n J'ETAIS ORPHELIN. LE PERE DESMOND...\nQUEL VENDEUR! NOUS VOULIONS TOUS\nDEVENIR DES PUPILLES... POUR L'AIDER\n     A NETTOYER LES RUES DE\n     NOCTROPOLIS. LA NAISSANCE\n          D'UN VIGILE....", "        RECUERDO COMO EMPEZO\n  TODO. YO ERA UN PILLUELO DE LAS\n CALLES. EL PADRE DESMOND... QUE\n TIO! NOS TENIA A TODOS SALTANDO\n PARA CONVERTIRNOS EN GUARDIANES Y\n   LIMPIAR LAS CALLES.\n     ASI ME HICE VIGILANTE...", "     ERINNERUNGEN...WIE ALLES\n     BEGANN. ICH WAR NUR EIN\n     STREUNENDER WAISENKNABE." },
+    { 7, 246, 153, 252, "NULL", "NULL", "NULL", "          VATER DESMOND...\n   WAS F\x9a""R EIN VERK\x8e""UFER! BRACHTE\n  UNS ALLE DAZU, NICHTS SEHNLICHER\n     ZU WOLLEN, ALS DER WEHR\nANZUGEH\x99""REN... DIE STRA\xe1""EN AUFR\x8e""UMEN.\n       GEBURT EINER B\x9a""RGERWEHR..." },
+};
+
+static struct ComicBlock block_p10_1 = { &poly_p10_b1, -1, -1, block_p10_b1_boxes, 2 };
+
+static struct Polygon poly_p10_b2 = { {
+    { 193, 286 },
+    { 326, 286 },
+    { 326, 399 },
+    { 226, 399 },
+} };
+
+static struct ComicBox block_p10_b2_boxes[] = {
+    { 7, 246, 196, 276, "         YEARS LATER, POKING\n  AROUND: SUBTERRAINIA... STUMBLED\nACROSS THE BROTHERHOOD'S TEMPLE.\nMAN, I DIDN'T KNOW WHAT I'D FOUND!\n       ...TOOK IT SLOW...\n        WORKED IN SECRET...", "         DES ANNEES PLUS TARD,\n  EN EXPLORANT SUBTERRAINIA... J'AI\n RETROUVE PAR HASARD LE TEMPLE DE\nLA CONFRERIE. MAIS JE NE SAVAIS PAS\n CE QUE JE VENAIS DE DECOUVRIR! IL\n    M'A FALLU LONGTEMPS... J'AI\n     TRAVAILLE DANS LE PLUS\n             GRAND SECRET....", "    Y LUEGO DESCUBRI A\n  SUBTERRAINIA Y A ESTE\n TEMPLO OLVIDADO.\n AUN NO SABIA LO QUE HABIA\n   HALLADO! PERO \n   TRABAJE EN SECRETO...", "        JAHRE SP\x8e""TER, ALS ICH\n   IN SUBTERRAINIA HERUMST\x99""BERTE...\n  STOLPERTE \x9a""BER DEN TEMPEL DER\n  BRUDERSCHAFT. MANN, ICH WU\xe1""TE\n     JA NICHT MAL, WAS ICH\n      DA GEFUNDEN HATTE! LIE\xe1""\n       MIR ZEIT...ARBEITETE\n           IM GEHEIMEN..." },
+};
+
+static struct ComicBlock block_p10_2 = { &poly_p10_b2, -1, -1, block_p10_b2_boxes, 1 };
+
+static struct Polygon poly_p10_b3 = { {
+    { 326, 0 },
+    { 491, 0 },
+    { 491, 93 },
+    { 448, 93 },
+    { 448, 81 },
+    { 337, 81 },
+    { 337, 93 },
+    { 326, 93 },
+} };
+
+static struct ComicBox block_p10_b3_boxes[] = {
+    { 6, 246, 195, 85, "        I'VE PROBABLY READ IT A\n   THOUSAND TIMES... THE BIG BOOK...\n     MY BIBLE AND BLUEPRINT: A\n    COMPENDIUM OF KNOWLEDGE AND\n   THEOREMS AS RESEARCHED BY THE\n      BROTHERHOOD OF THE NIGHT.", "\n        J'AI PROBABLEMENT DU LE\n    LIRE UN MILLIER DE FOIS... LE\n   GRAND LIVRE... MA BIBLE... UN\n CONCENTRE DE CONNAISSANCE ET DE\n   THEOREMES TEL QUE LE DICTE\n       LA CONFRERIE DE LA NUIT.", "        LEI EL LIBRO MAS DE\n   MIL VECES... FUE MI BIBLIA...\n     CONTENIA TODOS LOS \n   DESCUBRIMIENTOS DE LA \n     HERMANDAD DE LA NOCHE.", "           ICH MU\xe1"" ES SCHON\n    HUNDERTMAL GELESEN HABEN...\n  DAS GROSSE BUCH... MEINE BIBEL UND\n GEBRAUCHSANWEISUNG - DIE SAMMLUNG\n  ALLEN WISSENS UND DER THEOREME\n       DER BRUDERSCHAFT DER NACHT." },
+};
+
+static struct ComicBlock block_p10_3 = { &poly_p10_b3, -1, -1, block_p10_b3_boxes, 1 };
+
+static struct Polygon poly_p10_b4 = { {
+    { 491, 0 },
+    { 593, 0 },
+    { 593, 157 },
+    { 530, 143 },
+    { 471, 151 },
+    { 471, 93 },
+    { 491, 93 },
+} };
+
+static struct ComicBox block_p10_b4_boxes[] = {
+    { 6, 246, 330, 88, "        THE BOOK TAUGHT ME\n   HOW TO DISTILL LIQUIDARK. I\n PUT WHAT I LEARNED TO GOOD USE...\nSPENT COUNTLESS HOURS IN THAT DAMN\n LAB... UNTIL I FOUND A WAY TO BIND\n  THE LIQUIDARK TO FABRIC AND\n           BODY ARMOR.", "        LE LIVRE M'A APPRIS\n   A DISTILLER LE LIQUIDARK. J'AI\n MIS DE MON MIEUX CES CONNAISSANCES\nEN PRATIQUE... DES HEURES INFINIES\n DANS CE LABO AVANT DE... TROUVER\n  UN MOYEN DE LIER LE LIQUIDARK\n    ET LE TISSU DE MON COSTUME.", "        EN EL LIBRO VI COMO\n   DESTILAR EL LIQUIOSCIRO. LE\n DI UN BUEN USO... PASE MUCHAS\nHORAS EN EL LABORATORIO HASTA QUE\n  PUDE CONSTRUIR CON EL MI\n           ARMADURA.", "        DAS BUCH LEHRTE MICH,\n     DUSTER\x99""L ZU DESTILLIEREN.\n   ICH WANDTE MEIN WISSEN GUT AN,\n   VERBRACHTE ENDLOSE STUNDEN IN\n  DIESEM VERDAMMTEN LABOR, BIS ICH\n      EINEN WEG FAND, DUSTER\x99""L\n        AN GEWEBE ZU BINDEN." },
+};
+
+static struct ComicBlock block_p10_4 = { &poly_p10_b4, -1, -1, block_p10_b4_boxes, 1 };
+
+static struct Polygon poly_p10_b5 = { {
+    { 326, 93 },
+    { 337, 93 },
+    { 337, 81 },
+    { 448, 81 },
+    { 448, 93 },
+    { 471, 93 },
+    { 471, 151 },
+    { 438, 173 },
+    { 426, 200 },
+    { 326, 200 },
+} };
+
+static struct ComicBox block_p10_b5_boxes[] = {
+    { 5, 246, 439, 161, "         THE NOCTROGLYPH...\n   IT TOOK WEEKS JUST TO FIGURE\n OUT WHAT THE HELL IT WAS, LET\nALONE HOW TO WORK IT! POWERFUL...\n  SAVED MY BUTT MORE THAN A\n           FEW TIMES...", "\n         LE NOCTROGLYPHE...\n   IL M'A FALLU DES SEMAINES POUR\n COMPRENDRE DE QUOI IL S'AGISSAIT,\nSANS MEME PARLER DE L'UTILISER! MAIS\n    IL M'A SAUVE LA VIE PLUS\n          D'UNE FOIS...", "     EL NOCTROGLIFO...\n   ME LLEVO SEMANAS DESCUBRIR\n LO QUE ERA Y HACERLO FUNCIONAR.\n ES MUY PODEROSO... ME HA SACADO\n DE APUROS MAS DE UNA VEZ...", "         DER NOCTROGLYPH...\n    ICH HABE WOCHEN GEBRAUCHT,\n  NUR UM HERAUSZUFINDEN, WAS DAS\n IST, GAR NICHT DAVON ZU REDEN, WIE\n  ER FUNKTIONIERT. M\x8e""CHTIG....HAT\n     MEINEN HINTERN MEHR ALS\n    NUR EIN PAARMAL GERETTET." },
+};
+
+static struct ComicBlock block_p10_5 = { &poly_p10_b5, -1, -1, block_p10_b5_boxes, 1 };
+
+static struct Polygon poly_p10_b6 = { {
+    { 426, 200 },
+    { 438, 173 },
+    { 471, 151 },
+    { 530, 143 },
+    { 593, 157 },
+    { 593, 245 },
+    { 593, 233 },
+    { 491, 245 },
+    { 443, 233 },
+} };
+
+static struct ComicBox block_p10_b6_boxes[] = {
+    { 6, 246, 279, 203, "        THOUGHT I WAS READY...\n  GONE AND FORGED MYSELF INTO\nONE BAD-ASS HERO! THEN I MET HER\n IN A BLIND ALLEY ONE NIGHT...\n  THOUGHT SHE WAS SOME PUNK THIEF...\n           STILETTO...", "        JE CROYAIS ETRE PRET...\n   JE ME SUIS FORGE UNE IMAGE DE\n HEROS PEU COMMODE! ET PUIS UN\nJOUR, JE L'AI RENCONTREE DANS UNE\n    ALLEE SOMBRE... JE CROYAIS\n     QUE C'ETAIT UNE VOLEUSE...\n            STILETTO....", "    CREI ESTAR LISTO...\n  YA ME HABIA FRAGUADO COMO\n SUPER-HEROE! Y ENTONCES LA\n ENCONTRE A ELLA, A\n ESA VAGABUNDA...\n           STILETTO...", "        DACHTE, ICH W\x8e""RE BEREIT...\n    MACHTE AUS MIR SELBST EINEN\n   VERDAMMTEN SUPERHELDEN. UND\n DANN, EINES ABENDS IN EINER DUNKLEN\n    SEITENSTRA\xe1""E, TRAF ICH SIE...\n     DACHTE, SIE W\x8e""RE NUR\n     EINE DIEBIN...STILETTO..." },
+};
+
+static struct ComicBlock block_p10_6 = { &poly_p10_b6, -1, -1, block_p10_b6_boxes, 1 };
+
+static struct Polygon poly_p10_b7 = { {
+    { 326, 200 },
+    { 426, 200 },
+    { 426, 312 },
+    { 395, 373 },
+    { 326, 399 },
+} };
+
+static struct ComicBox block_p10_b7_boxes[] = {
+    { 8, 246, 156, 213, "        SHE LAID ME OUT FLAT!\n   BEFORE I KNEW WHAT'D HAPPENED,\nSHE HAD A BLADE AT MY THROAT... SHE\n LIKED THE COSTUME THOUGH. GOOD\n THING TOO, OR SHE'D PROBABLY HAVE\n      GUTTED ME RIGHT THERE.", "        ELLE M'A EU! AVANT QUE\n   JE PUISSE COMPRENDRE CE QUI SE\n PASSAIT, ELLE AVAIT DEJA POSE SA\n LAME SUR MA GORGE! ELLE AIMAIT\n  MON COSTUME.. HEUREUSEMENT,\n  SINON ELLE M'AURAIT EGORGE\n             SUR PLACE.", "     ME HIZO CAER Y, ANTES\n DE SABER LO QUE OCURRIA,\n APOYO UN CUCHILLO EN MI GARGANTA.\n QUERIA ROBARME EL DISFRAZ.\n  LA CONVENCI PARA HABLAR.", "         SIE LEGTE MICH AUFS\n    KREUZ! BEVOR ICH WU\xe1""TE, WAS\n MIR GESCHAH, HATTE ICH IHR MESSER\nAN DER KEHLE! ABER DER ANZUG GEFIEL\n IHR; WAS F\x9a""R EIN GL\x9a""CK, SONST H\x8e""TTE\n    SIE MICH WOHL AN ORT UND\n         STELLE AUSGEWEIDET." },
+};
+
+static struct ComicBlock block_p10_7 = { &poly_p10_b7, -1, -1, block_p10_b7_boxes, 1 };
+
+static struct Polygon poly_p10_b8 = { {
+    { 326, 399 },
+    { 395, 373 },
+    { 426, 233 },
+    { 492, 233 },
+    { 494, 312 },
+    { 517, 379 },
+    { 593, 399 },
+} };
+
+static struct ComicBox block_p10_b8_boxes[] = {
+    { 8, 246, 240, 282, "        I TOOK HER BACK TO\n  SHADOWLAIR WHERE SHE AGREED TO\n BECOME MY PARTNER. WE PROWLED\nTHE STREETS TOGETHER. UNARMED, SHE'S\n VICIOUS, BUT WITH THOSE BLADES,\n   SHE'S DOWNRIGHT LETHAL! WE\n    BECAME A FORMIDABLE TEAM...\n       DARKSHEER AND STILETTO.", "         JE L'AI RAMENEE A\n    L'ANTRE D'OMBRE, OU ELLE\n ACCEPTA DE DEVENIR MA PARTENAIRE.\n   NOUS AVONS ECUME LES RUES\nENSEMBLE... SANS ARME, ELLE EST\n   RUSEE, MAIS AVEC SES COUTEAUX,\n         ELLE EST MORTELLE!", "        LA TRAJE A LA CUEVA\n  SOMBRIA Y ACEPTO SER MI SOCIA.\n JUNTOS RECORRIMOS LAS CALLES.\n ES MORTAL CON SUS CUCHILLOS.\n ERAMOS UN GRAN EQUIPO...\n       TENEBROSO Y STILETTO.", "      ICH NAHM SIE MIT ZUR\x9a""CK\n  ZUM SCHATTENHORT, UND SIE WILLIGTE\n  EIN, MEINE PARTNERIN ZU WERDEN." },
+    { 8, 246, 240, 282, "NULL", "          NOUS FORMIONS\n        UNE EQUIPE UNIQUE...\n        DARKSHEER ET STILETTO.", "NULL", "            WIR TRIEBEN UNS\n    ZUSAMMEN RUM. UNBEWAFFNET\n  IST SIE SCHON GEF\x8e""HRLICH, ABER\n MIT DIESEN KLINGEN IST SIE EINFACH\n    T\x99""DLICH! WIR WURDEN EIN\n       UNSCHLAGBARES TEAM...\n       DARKSHEER UND STILETTO." },
+};
+
+static struct ComicBlock block_p10_8 = { &poly_p10_b8, -1, -1, block_p10_b8_boxes, 2 };
+
+static struct Polygon poly_p10_b9 = { {
+    { 491, 245 },
+    { 593, 245 },
+    { 593, 399 },
+    { 517, 379 },
+    { 494, 312 },
+} };
+
+static struct ComicBox block_p10_b9_boxes[] = {
+    { 8, 246, 305, 212, "        WE'VE BEEN TOGETHER\n   EVER SINCE... WELL, EXCEPT\n LATELY... I GUESS SHE HAS A RIGHT\nTO BE TICKED THAT I'VE BEEN WORKING\n ALONE. THE VENOM'S GONE... AND THE\n   BULLET SCORE'S HEALED... LIKE I\n    SAID, IT WORKS EVERY TIME.", "\n       NOUS SOMMES ENSEMBLE\n   DEPUIS CE JOUR-LA.... EN FAIT,\nUN PEU MOINS DEPUIS QUELQUE TEMPS.\nJE PENSE QU'ELLE A LE DROIT\n  D'ETRE VEXEE PARCE QUE J'AI\n         TRAVAILLE SEUL.", "      DESDE ENTONCES\n   ESTAMOS JUNTOS... HASTA HACE\n POCO... SUPONGO QUE TIENE RAZON\n AL ENFADARSE PORQUE YO TRABAJE\n SOLO. BIEN. EL VENENO SE HA IDO Y\n  LA HERIDA DE BALA ESTA CURADA...\n       SIEMPRE FUNCIONA.", "         SEITDEM SIND WIR\n    ZUSAMMEN...NAJA, BIS AUF DIE\n LETZTE ZEIT. SCH\x8e""TZE, SIE HAT DAS\n RECHT, ETWAS SAUER ZU SEIN, DA\xe1"" ICH\nALLEIN GEARBEITET HABE. DAS GIFT IST\n   FORT...DIE WUNDE VERHEILT...WIE\n    GESAGT, FUNKTIONIERT\n             JEDESMAL." },
+    { 8, 246, 305, 212, "NULL", "       LE VENIN EST PARTI... \n  ET LES BLESSURES DES BALLES\nONT ETE GUERIES. COMME JE VOUS\n    L'AI DIT, \x80""A MARCHE A TOUS\n           LES COUPS.", "NULL", "NULL" },
+};
+
+static struct ComicBlock block_p10_9 = { &poly_p10_b9, -1, -1, block_p10_b9_boxes, 2 };
+
+static struct ComicBlock page_10_blocks[] = {
+    block_p10_0,
+    block_p10_1,
+    block_p10_2,
+    block_p10_3,
+    block_p10_4,
+    block_p10_5,
+    block_p10_6,
+    block_p10_7,
+    block_p10_8,
+    block_p10_9,
+};
+
+static struct ComicPage page_10 = { "DARK/COMDATA/LEPG1819.SCN", 98, 50, 1, 0, page_10_blocks, 10 };
+
+static struct Polygon poly_p11_b0 = { {
+    { 232, 82 },
+    { 323, 83 },
+    { 323, 165 },
+    { 239, 165 },
+} };
+
+static struct ComicBox block_p11_b0_boxes[] = {
+    { 7, 246, 332, 32, "         THEY COINED ME THEIR\n   CHAMPION...THE PRESS! JUST A\n     LOT OF GLAMOUR AND WINDOW\n DRESSING. OH, THEY WERE USUALLY\nLOYAL, BUT THERE WERE TIMES THEY\n       TURNED ON ME OVERNIGHT!", "\n        IL M'ONT CONSACRE COMME\n   LEUR CHAMPION... LA PRESSE! EN\nFAIT, BEAUCOUP DE POUDRE AUX YEUX...\nOH, ILS ETAIENT LOYALS, MAIS IL M'ONT\n      PARFOIS ABANDONNE SANS\n           EXPLICATION!", "         ME HICIERON SU\n  CAMPEON LA PRENSA! YO\n  ERA EL MAS FAMOSO DE LA\n CIUDAD. Y POR LO GENERAL ERAN\n LEALES CONMIGO, PERO TAMBIEN\n         ES QUE UNO SE CANSA!", "       SIE HABEN MICH ZU IHREM\n    HELDEN GEMACHT....DIE PRESSE!\n  JEDE MENGE GLAMOUR UND SHOW.\n    NAJA, MEISTENS HABEN SIE MICH\nUNTERST\x9a""TZT, ABER ES GAB AUCH ZEITEN,\n     DA HABEN SIE SICH \x9a""BER NACHT\n        GEGEN MICH GEWANDT!" },
+};
+
+static struct ComicBlock block_p11_0 = { &poly_p11_b0, -1, -1, block_p11_b0_boxes, 1 };
+
+static struct Polygon poly_p11_b1 = { {
+    { 61, 0 },
+    { 323, 0 },
+    { 322, 234 },
+    { 62, 234 },
+} };
+
+static struct ComicBox block_p11_b1_boxes[] = {
+    { 7, 246, 166, 33, "         I'M STILL NOT SURE\n   I'M DOING THE RIGHT THING...\n THIS CITY HAS COUNTED ON ME TO\nALWAYS BE THERE... LURKING IN THE\n       EVER-PRESENT SHADOWS.", "        JE NE SAIS PAS ENCORE\n   SI J'AI PRIS LA BONNE DECISION...\nCETTE VILLE A TOUJOURS COMPTE SUR\n    MOI... RODANT DANS L'OMBRE\n          OMNIPRESENTE.", "         NO ESTOY SEGURO DE\n ESTAR HACIENDO LO CORRECTO...\n ESTA CIUDAD HA CONTADO CONMIGO\n DESDE QUE ME CONVERTI EN\n       TENEBROSO.", "        ICH BIN MIR IMMER NOCH\n       NICHT SICHER, OB ICH DAS\n RICHTIGE TUE. DIE STADT HAT SICH\nDARAUF VERLASSEN, DA\xe1"" ICH IMMER F\x9a""R\n    SIE DA BIN.. IN DEN SCHATTEN,\n          DIE \x9a""BERALL SIND." },
+};
+
+static struct ComicBlock block_p11_1 = { &poly_p11_b1, -1, -1, block_p11_b1_boxes, 1 };
+
+static struct Polygon poly_p11_b2 = { {
+    { 322, 234 },
+    { 266, 257 },
+    { 242, 320 },
+    { 261, 369 },
+    { 322, 399 },
+} };
+
+static struct ComicBox block_p11_b2_boxes[] = {
+    { 8, 246, 84, 219, "       ...I DESERVE MORE!", "\n   ... JE MERITE MIEUX QUE \x80""A!", "       ...MEREZCO MAS!", "\n       ... ICH VERDIENE MEHR!" },
+};
+
+static struct ComicBlock block_p11_2 = { &poly_p11_b2, -1, -1, block_p11_b2_boxes, 1 };
+
+static struct Polygon poly_p11_b3 = { {
+    { 62, 235 },
+    { 322, 234 },
+    { 322, 399 },
+    { 62, 399 },
+} };
+
+static struct ComicBox block_p11_b3_boxes[] = {
+    { 5, 246, 181, 280, "         I'VE WORKED HARD TO\n   BECOME WHAT I AM, BUT I'M SO\n DAMN TIRED! FIGHTING OFF EVERY\nCRACKPOT AND PSYCHO THAT WANTS TO\n   USE NOCTROPOLIS AS THEIR\n     PERSONAL PLAYGROUND...", "         J'AI TRAVAILLE DUR\n     POUR DEVENIR CE QUE JE SUIS\n AUJOU'D'HUI, MAIS JE SUIS VRAIMENT\nFATIGUE! JE ME SUIS BATTU CONTRE TOUS\n MALFAITEURS ET AUTRES PSYCHOPATHES\n  QUI DECIDAIENT UN JOUR D'ADOPTER\n        NOCTROPOLIS COMME\n          TERRAIN DE JEU...", "         TRABAJE MUCHO PARA\n  CONVERTIRME EN LO QUE SOY,\n PERO TODO TIENE UN FIN. PELEAR\n CONTRA CADA RATERO O SICOPATA\n QUE QUIERE HACER DE NOCTROPOLIS\n        SUS DOMINIOS...", "         ICH HABE HART\n   GEARBEITET, UM DAS ZU WERDEN,\n       WAS ICH HEUTE BIN." },
+    { 5, 246, 181, 280, "NULL", "NULL", "NULL", "         ABER ICH BIN ES SO\n    VERDAMMT LEID, GEGEN JEDEN\n  VERR\x9a""CKTEN UND PSYCHOPATHEN ZU\n   K\x8e""MPFEN, DER NOCTROPOLIS ALS\n   SEINEN PERS\x99""NLICHEN SPIELPLATZ\n             BETRACHTET..." },
+};
+
+static struct ComicBlock block_p11_3 = { &poly_p11_b3, -1, -1, block_p11_b3_boxes, 2 };
+
+static struct Polygon poly_p11_b4 = { {
+    { 323, 0 },
+    { 471, 0 },
+    { 324, 175 },
+} };
+
+static struct ComicBox block_p11_b4_boxes[] = {
+    { 0, 246, 349, 61, "NOCTROPOLIS CITY HALL", "MAIRIE DE NOCTROPOLIS", "AYUNTAMIENTO DE NOCTROPOLIS", "RATHAUS VON NOCTROPOLIS" },
+};
+
+static struct ComicBlock block_p11_4 = { &poly_p11_b4, -1, -1, block_p11_b4_boxes, 1 };
+
+static struct Polygon poly_p11_b5 = { {
+    { 471, 0 },
+    { 586, 0 },
+    { 586, 170 },
+} };
+
+static struct ComicBox block_p11_b5_boxes[] = {
+    { 0, 246, 349, 61, "NOCTROPOLIS CITY HALL", "MAIRIE DE NOCTROPOLIS", "AYUNTAMIENTO DE NOCTROPOLIS", "RATHAUS VON NOCTROPOLIS" },
+};
+
+static struct ComicBlock block_p11_5 = { &poly_p11_b5, -1, -1, block_p11_b5_boxes, 1 };
+
+static struct Polygon poly_p11_b6 = { {
+    { 376, 111 },
+    { 534, 111 },
+    { 534, 187 },
+    { 376, 187 },
+} };
+
+static struct ComicBox block_p11_b6_boxes[] = {
+    { 4, 255, 235, 51, "        AHH DARKSHEER, WE WERE\n   JUST DISCUSSING YOU... YOUR\n RECENT CAMPAIGN AGAINST THE\nCITY'S MORE NOTORIOUS ENEMIES\n   HAS BEEN MOST IMPRESSIVE!\n            WELL DONE!", "\n        AHH... DARKSHEER! NOUS\n   PARLIONS JUSTEMENT DE VOUS...\nVOTRE DERNIERE CAMPAGNE CONTRE LES\n ENNEMIS NOTOIRES DE LA VILLE ETAIT\n     VRAIMENT IMPRESSIONNANTE!\n            BIEN JOUE! ", "        AH, TENEBROSO.\n  HABLABAMOS DE TI... TU\n RECIENTE CRUZADA CONTRA LOS\n ENEMIGOS MAS NOTABLES DE\n LA CIUDAD HA SIDO IMPRESIONANTE!\n          BIEN HECHO!", "        AAH, DARKSHEER, WIR\n   REDEN GERADE \x9a""BER SIE. IHRE\n J\x9a""NGSTE KAMPAGNE GEGEN DIE \x9a""BLEN\n  FEINDE DER STADT WAR \x8e""U\xe1""ERST\n       EINDRUCKSVOLL. SEHR GUT\n              GEMACHT!" },
+    { 4, 246, 247, 71, "        THANK YOU MR. MAYOR.\n   YOU'LL BE PLEASED TO KNOW\n THAT TOPHAT IS IN CUSTODY AND\nTHAT DESPERADO AND WIDOWMARK WON'T\n     TROUBLE THE CITIZENS OF\n      NOCTROPOLIS EVER AGAIN.", "\n       MERCI, MONSIEUR LE MAIRE.\n   VOUS SEREZ HEUREUX D'APPRENDRE\n QUE TOPHAT EST EN PRISON, ET QUE\nDESPERADO ET WIDOWMARK N'ENNUIERONT\n    PLUS JAMAIS LES HABITANTS\n         DE NOCTROPOLIS.", "        GRACIAS, ALCALDE.\n  LE GUSTARA SABER QUE LA\n DIVA ESTA EN PRISION Y QUE\n DESESPERADO Y VIUDA NEGRA NO\n   VOLVERAN A MOLESTAR A LOS\n   CIUDADANOS DE NOCTROPOLIS.", "         VIELEN DANK, HERR\n     B\x9a""RGERMEISTER. ES WIRD SIE\n     FREUEN, ZU H\x99""REN, DA\xe1"" MISS\n  ZYLINDERCHEN IN HAFT GENOMMEN\n WURDE, UND DA\xe1"" SHOWDOWN UND DIE\n     SCHWARZE WITWE DIE B\x9a""RGER VON\n     NOCTROPOLIS NIE WIEDER\n         BEL\x8e""STIGEN WERDEN." },
+};
+
+static struct ComicBlock block_p11_6 = { &poly_p11_b6, -1, -1, block_p11_b6_boxes, 2 };
+
+static struct Polygon poly_p11_b7 = { {
+    { 323, 261 },
+    { 378, 270 },
+    { 396, 292 },
+    { 396, 336 },
+    { 367, 366 },
+    { 323, 368 },
+} };
+
+static struct ComicBox block_p11_b7_boxes[] = {
+    { 3, 255, 431, 210, "         R-RETIRE? BUT YOU\n   CAN'T! WE'RE JUST NOT CAPABLE\nOF DEALING WITH THE MISCREANTS THAT\nPLAGUE THE CITY... FOR THE LOVE OF\n  GOD, THINK OF MY PUBLIC IMAGE!\n    THERE'S AN ELECTION COMING...", "\n       P-PRENDRE VOTRE RETRAITE?\n   MAIS C'EST IMPOSSIBLE! NOUS NE\nPOURRONS PAS LUTTER SEUL CONTRE\nLES MALFAITEURS QUI RUINENT NOTRE\n CITE! POUR L'AMOUR DU CIEL, PENSEZ\n      A MON IMAGE! IL Y A DES\n         ELECTIONS BIENTOT...", "         RETIRARTE? NO\n   PUEDES! NOSOTROS NO SOMOS\n CAPACES DE HACER FRENTE A LOS\n DESALMADOS QUE ASEDIAN ESTA\n   CIUDAD. POR FAVOR, ESPERA\n       A LAS ELECCIONES!", "         Z-Z-ZUR RUHE SETZEN?\n   ABER DAS GEHT NICHT! WIR WERDEN\n DOCH ALLEINE NICHT MIT ALL DIESEN\n\x9a""BELT\x8e""TERN FERTIG, DIE UNSERE STADT\n   PLAGEN! UM GOTTES WILLEN,\n   DENKEN SIE DOCH AM MEIN IMAGE...\n      DIE WAHLEN STEHEN VOR\n             DER T\x9a""R!" },
+};
+
+static struct ComicBlock block_p11_7 = { &poly_p11_b7, -1, -1, block_p11_b7_boxes, 1 };
+
+static struct Polygon poly_p11_b8 = { {
+    { 507, 213 },
+    { 535, 226 },
+    { 544, 250 },
+    { 535, 277 },
+    { 506, 292 },
+    { 475, 277 },
+    { 466, 255 },
+    { 475, 226 },
+} };
+
+static struct ComicBox block_p11_b8_boxes[] = {
+    { 4, 246, 266, 169, "       ACTUALLY MR MAYOR,\n   THAT'S WHY I CAME TO SEE YOU...\n I HAVE DECIDED TO RETIRE. AS A\n COURTESY, I THOUGHT YOU SHOULD\n   KNOW BEFORE ANY PUBLIC\n        ANNOUNCEMENT.", "        EN FAIT, MONSIEUR LE\n    MAIRE, C'EST POUR \x80""A QUE JE\n SUIS VENU VOUS VOIR. J'AI DECIDE DE\nPRENDRE MA RETRAITE. JE PENSAIS QU'IL\n  ETAIT PLUS CONVENABLE DE VOUS\n     PREVENIR PERSONNELLEMENT\n       AVANT DE L'ANNONCER\n         OFFICIELLEMENT.", "      EN REALIDAD POR ESO\n   VENIA A VERLE, ALCALDE...\n HE DECIDIDO RETIRARME. ME\n PARECIO QUE DEBIA DECIRSELO A\n    USTED ANTES QUE A\n        NADIE.", "          EIGENTLICH BIN ICH\n      GENAU DESWEGEN HIER, HERR\n       B\x9a""RGERMEISTER. ICH HABE\n  BESCHLOSSEN, MICH ZUR RUHE ZU\n  SETZEN. ICH DACHTE, SIE SOLLTEN ES\n       ERFAHREN, BEVOR ICH ES\n        \x99""FFENTLICH BEKANNTGEBE." },
+};
+
+static struct ComicBlock block_p11_8 = { &poly_p11_b8, -1, -1, block_p11_b8_boxes, 1 };
+
+static struct Polygon poly_p11_b9 = { {
+    { 324, 175 },
+    { 585, 170 },
+    { 585, 267 },
+    { 323, 267 },
+} };
+
+static struct ComicBox block_p11_b9_boxes[] = {
+    { 4, 255, 224, 135, "      EXCELLENT! ACCORDING TO\n  OUR LISTS, THAT ACCOUNTS FOR\nEVERY CRIMINAL MASTERMIND TO DATE.\n  YOU'VE CERTAINLY EARNED A REST!", "      EXCELLENT! D'APRES NOS\n  LISTES, TOUS LES CRIMINELS SONT\nMAINTENANT SOUS LES VERROUS.\n VOUS AVEZ BIEN GAGNE UN PEU\n           DE REPOS!", "      EXCELENTE! SEGUN NUESTRA\n  LISTA, ESO DEJA LA CIUDAD LIMPIA\n DE CRIMINALES IMPORTANTES.\n  TE HAS GANADO UN DESCANSO!", "       AUSGEZEICHNET! NACH\n  UNSERER LISTE W\x8e""REN DAMIT JETZT\nALLE MEISTERVERBRECHER ABGEHAKT.\n    SIE HABEN SICH WIRKLICH EINE\n           PAUSE VERDIENT!" },
+};
+
+static struct ComicBlock block_p11_9 = { &poly_p11_b9, -1, -1, block_p11_b9_boxes, 1 };
+
+static struct Polygon poly_p11_b10 = { {
+    { 378, 270 },
+    { 506, 270 },
+    { 506, 324 },
+    { 378, 324 },
+} };
+
+static struct ComicBox block_p11_b10_boxes[] = {
+    { 4, 246, 233, 219, "        I DON'T GIVE A DAMN\n   ABOUT YOUR POPULARITY RATING!\nAND, AS YOU MENTIONED BEFORE,\nNOCTROPOLIS' BOGEY MEN ARE EITHER\n DEAD, OR IN LOCK-UP... MY\n  DECISION IS NOT NEGOTIABLE.", "       JE N'AI QUE FAIRE DE\n   VOTRE POPULARITE! ET, COMME\n JE VOUS L'AI DIT LES ENNEMIS DE\nNOCTROPOLIS SONT TOUS MORTS OU EN\n    PRISON... MA DECISION EST\n          IRREVOCABLE.", "         NO ME IMPORTA TU\n   IMAGEN PUBLICA! Y TODOS LOS\n CRIMINALES IMPORTANTES ESTAN\n MUERTOS O ENCERRADOS. MI\n  DECISION NO ES NEGOCIABLE.", "       IHRE BELIEBTHEIT K\x9a""MMERT\n    MICH EINEN DRECK! UND WIE SIE\n   BEREITS SO RICHTIG BEMERKTEN,\n SIND DIE B\x99""SEWICHTE ALLE ENTWEDER\n  TOT ODER IM GEF\x8e""NGNIS. MEINE\n   ENTSCHEIDUNG IST UNUMST\x99""\xe1""LICH." },
+};
+
+static struct ComicBlock block_p11_10 = { &poly_p11_b10, -1, -1, block_p11_b10_boxes, 1 };
+
+static struct Polygon poly_p11_b11 = { {
+    { 323, 324 },
+    { 506, 324 },
+    { 506, 399 },
+    { 323, 399 },
+} };
+
+static struct ComicBox block_p11_b11_boxes[] = {
+    { 4, 255, 239, 288, "        MR. MAYOR, I PROPOSE\n   THAT WE THROW DARKSHEER A\nHERO'S PARADE! AFTERWARD, YOU\nCOULD GIVE HIM THE KEY TO THE\n  CITY AT A TELEVISED CEREMONY!\n   IT WOULD BE GREAT PUBLICITY...", "       MONSIEUR LE MAIRE, JE\n   PROPOSE D'ORGANISER UN DEFILE\n   POUR NOTRE HEROS, DARKSHEER!\nENSUITE, VOUS POURRIEZ LUI REMETTRE\n LA CLEF DE LA VILLE AU COURS D'UNE\n  EMISSION TELEVISEE! CELA VOUS\n      FERAIT UNE EXCELLENTE\n             PUBLICITE.", "        ALCALDE, PROPONGO\n   QUE LE DESPIDAMOS CON UN \n DESFILE. USTED PODRIA DARLE\n LAS LLAVES DE LA CIUDAD\n   EN UN ACTO TELEVISADO!\n    SERIA UNA GRAN PUBLICIDAD...", "       HERR B\x9a""RGERMEISTER, ICH\n   SCHLAGE VOR, WIR VERANSTALTEN\n     ZU EHREN DARKSHEERS EINE\nHELDENPARADE! ANSCHLIE\xe1""END K\x99""NNTEN\nSIE IHM DIE EHRENSCHL\x9a""SSEL ZUR STADT\n    \x9a""BERREICHEN, LIVE IM FERNSEHEN.\n       DAS W\x8e""RE PRIMA PUBLICITY!" },
+};
+
+static struct ComicBlock block_p11_11 = { &poly_p11_b11, -1, -1, block_p11_b11_boxes, 1 };
+
+static struct Polygon poly_p11_b12 = { {
+    { 506, 267 },
+    { 585, 267 },
+    { 585, 399 },
+    { 506, 399 },
+} };
+
+static struct ComicBox block_p11_b12_boxes[] = {
+    { 4, 255, 362, 245, "      WELL, DARKSHEER, WHAT\n      DO YOU THINK?", "       ALORS, DARKSHEER,\n  QU'EST-CE QUE VOUS EN PENSEZ?", "      BIEN, TENEBROSO, QUE\n      DICES A ESO?", "      NUN, DARKSHEER, WAS\n      HALTEN SIE DAVON?" },
+    { 2, 246, 332, 314, "      I SUPPOSE THAT WOULD\n      BE ALL RIGHT...", "        JE PENSE QUE \x80""A\n        POURRAIT ALLER...", "      SUPONGO QUE ES UNA\n      BUENA IDEA...", "      ICH SCH\x8e""TZE, DAS GEHT\n       IN ORDNUNG..." },
+};
+
+static struct ComicBlock block_p11_12 = { &poly_p11_b12, -1, -1, block_p11_b12_boxes, 2 };
+
+static struct ComicBlock page_11_blocks[] = {
+    block_p11_0,
+    block_p11_1,
+    block_p11_2,
+    block_p11_3,
+    block_p11_4,
+    block_p11_5,
+    block_p11_6,
+    block_p11_7,
+    block_p11_8,
+    block_p11_9,
+    block_p11_10,
+    block_p11_11,
+    block_p11_12,
+};
+
+static struct ComicPage page_11 = { "DARK/COMDATA/LEPG2021.SCN", 98, 15, 1, 0, page_11_blocks, 13 };
+
+static struct Polygon poly_p12_b0 = { {
+    { 186, 112 },
+    { 220, 123 },
+    { 229, 144 },
+    { 219, 167 },
+    { 186, 177 },
+    { 155, 169 },
+    { 144, 144 },
+    { 158, 118 },
+} };
+
+static struct ComicBox block_p12_b0_boxes[] = {
+    { 1, 255, 244, 170, "      FORGIVE ME FATHER, FOR\n      I HAVE SINNED...", "\n    PARDONNEZ-MOI, MON PERE,\n    CAR J'AI PECHE...", "     PERDONEME, PADRE, PORQUE\n      HE PECADO...", "     VERGIB MIR, VATER, DENN\n     ICH HABE GES\x9a""NDIGT..." },
+};
+
+static struct ComicBlock block_p12_0 = { &poly_p12_b0, -1, -1, block_p12_b0_boxes, 1 };
+
+static struct Polygon poly_p12_b1 = { {
+    { 57, 3 },
+    { 179, 3 },
+    { 182, 140 },
+    { 57, 137 },
+} };
+
+static struct ComicBox block_p12_b1_boxes[] = {
+    { 0, 246, 84, 113, "THE NOCTROPOLIS CITY CATHEDRAL", "CATHEDRALE DE NOCTROPOLIS", "LA CATEDRAL DE NOCTROPOLIS", "DER DOM VON NOCTROPOLIS" },
+    { 5, 255, 168, 93, "      I DON'T KNOW WHAT ELSE\n   TO DO... WHO TO TALK TO. I\n    WONDER IF DESMOND EVEN\n          KNOWS YET.", "       JE NE SAIS PAS QUOI\n   FAIRE... NI A QUI PARLER. JE\n ME DEMANDE SI LE PERE DESMOND\n         EST AU COURANT...", "      NO SE QUE HACER NI A\n   QUIEN HABLAR. ME PREGUNTO\n      SI DESMOND LO\n         SABRA.", "      ICH WEI\xe1"" NICHT MEHR,\n  WAS ICH NOCH TUN KANN....MIT WEM\n ICH NOCH REDEN KANN. OB ES VATER\n  DESMOND \x9a""BERHAUPT SCHON WEI\xe1""?" },
+};
+
+static struct ComicBlock block_p12_1 = { &poly_p12_b1, -1, -1, block_p12_b1_boxes, 2 };
+
+static struct Polygon poly_p12_b2 = { {
+    { 193, 3 },
+    { 316, 3 },
+    { 316, 137 },
+    { 190, 140 },
+} };
+
+static struct ComicBox block_p12_b2_boxes[] = {
+    { 7, 255, 325, 32, "      I HATE COMING HERE. THE\n CONFESSIONAL ALWAYS MAKES ME\n  FEEL SO... GUILTY. I HATE\n          COMING HERE.", "\n     J'AI HORREUR DE VENIR ICI.\n JE ME SENS TOUJOURS... COUPABLE\n  DANS UN CONFESSIONNAL. JE HAIS\n            CET ENDROIT.", "      ODIO VENIR AQUI. EL\n CONFESIONARIO SIEMPRE ME\n  HACE SENTIR... CULPABLE.", "\n       ICH HASSE ES HIER. BEI\n DER BEICHTE F\x9a""HLE ICH MICH IMMER\n    SO...SCHULDIG. ICH HASSE\n               ES HIER." },
+};
+
+static struct ComicBlock block_p12_2 = { &poly_p12_b2, -1, -1, block_p12_b2_boxes, 1 };
+
+static struct Polygon poly_p12_b3 = { {
+    { 57, 152 },
+    { 181, 149 },
+    { 177, 396 },
+    { 57, 396 },
+} };
+
+static struct ComicBox block_p12_b3_boxes[] = {
+    { 3, 255, 201, 181, "      STILETTO, HAVE YOU SEEN\n     THE PAPER? IT READS:\n    \"DARKSHEER TO RETIRE\"!\n NOW, WHAT THE HELL IS GOING ON?", "      STILETTO, TU AS LU LES\n    JOURNAUX? \"DARKSHEER PREND\n    SA RETRAITE!\" MAIS QUE SE\n            PASSE-T-IL?", "      STILETTO, HAS LEIDO\n     LA PRENSA? DICE QUE\n    TENEBROSO SE RETIRA!\n QUE DEMONIOS ESTA PASANDO?", "      STILETTO, HAST DU DIE\n     ZEITUNG GELESEN? DA STEHT\n    \"DARKSHEER IN PENSION\"!\n  WAS ZUR H\x99""LLE IST DA LOS?" },
+    { 3, 255, 132, 160, "       I WISH I KNEW, FATHER.\n  IT'S NOT THE SAME BETWEEN US\nANYMORE... WE HARDLY EVEN SPEAK\n            ANYMORE.", "       J'AIMERAIS LE SAVOIR,\n  PERE. CE N'EST PLUS LA MEME\nCHOSE ENTRE NOUS DEPUIS QUELQUE\n             TEMPS...", "       ESO QUERRIA SABER YO.\nTODO HA CAMBIADO ENTRE NOSOTROS.\n     YA NO HABLAMOS SIN PELEAR.", "       ICH W\x9a""NSCHTE, ICH W\x9a""\xe1""TE\n  ES, VATER. ES WAR IN LETZTER\n ZEIT ZWISCHEN UNS NICHT MEHR SO\n   WIE FR\x9a""HER...WIR REDEN KAUM\n          NOCH MITEINANDER." },
+};
+
+static struct ComicBlock block_p12_3 = { &poly_p12_b3, -1, -1, block_p12_b3_boxes, 2 };
+
+static struct Polygon poly_p12_b4 = { {
+    { 191, 149 },
+    { 316, 152 },
+    { 316, 396 },
+    { 196, 396 },
+} };
+
+static struct ComicBox block_p12_b4_boxes[] = {
+    { 1, 255, 325, 262, "        I HAD TO READ IT IN THE\n   PAPER, TOO. THAT SON OF A - HE\n DOESN'T GIVE A DAMN ABOUT THINGS...\n  ABOUT ME!  HE'S JUST GOING TO\n   THROW IT ALL AWAY WITHOUT\n          LOOKING BACK.", "       JE L'AI APPRIS MOI AUSSI\n  DANS LE JOURNAL. CE FILS DE P...,\n IL SE FICHE PAS MAL DES AUTRES...\n ET DE MOI! IL VA SIMPLEMENT TOUT\n      ABANDONNER SANS REGRET.", "        ME HE ENTERADO POR\n   LA PRENSA. ESE HIJO DE... NO\n  FUE CAPAZ DE DECIRMELO!\n   NOS HA DADO A TODOS LA\n      ESPALDA.", "\n        SELBST ICH MU\xe1""TE ES AUS\n   DER ZEITUNG ERFAHREN. DIESER\n VERDAMMTE---ER K\x9a""MMERT SICH EINEN\nDRECK UM ALLES...UM MICH! ER SCHMEI\xe1""T\n   EINFACH ALLES WEG, OHNE SICH\n         AUCH NUR UMZUDREHEN." },
+    { 1, 255, 189, 258, "      EASY STILETTO, THERE\n  MUST BE AN EXPLANATION...", "     DU CALME, STILETTO, IL\n DOIT BIEN Y AVOIR UNE\n       EXPLICATION!", "      CALMA, STILETTO, DEBE\n DE HABER UNA EXPLICACION...", "      BERUHIGE DICH, STILETTO,\n  ES MU\xe1"" EINE VERN\x9a""NFTIGE\n    ERKL\x8e""RUNG DAF\x9a""R GEBEN." },
+};
+
+static struct ComicBlock block_p12_4 = { &poly_p12_b4, -1, -1, block_p12_b4_boxes, 2 };
+
+static struct Polygon poly_p12_b5 = { {
+    { 448, 140 },
+    { 482, 153 },
+    { 498, 186 },
+    { 485, 219 },
+    { 448, 235 },
+    { 409, 216 },
+    { 399, 183 },
+    { 404, 154 },
+} };
+
+static struct ComicBox block_p12_b5_boxes[] = {
+    { 2, 255, 201, 219, "       THERE, THERE, STILETTO,\n    OF COURSE GOD HEARS YOUR\nPRAYERS. HE WANTS YOU TO BE HAPPY..\n BUT RIGHT NOW YOU MUST TALK TO\n  DARKSHEER. HE NO LONGER TAKES\n         MY COUNSEL...", "\n      ALLONS, ALLONS, STILETTO,\n    BIEN SUR QUE DIEU ENTEND TES\n   PRIERES... IL VEUT QUE TU SOIS\n HEUREUSE... MAIS POUR L'INSTANT, TU\n    DOIS PARLER A DARKSHEER. IL\n       REFUSE D'ECOUTER MES\n              CONSEILS.", "        TE EQUIVOCAS,\n    DIOS TE ESCUCHA Y DESEA\n QUE SEAS FELIZ...\n HABLALE A TENEBROSO. SIEMPRE\n EL TE HACE MAS CASO QUE A\n         MI...", "\n       KOMM, KOMM, STILETTO,\n   NAT\x9a""RLICH H\x99""RT GOTT DEINE GEBETE.\n  ER WILL, DA\xe1"" DU GL\x9a""CKLICH BIST...\n ABER ERSTMAL MU\xe1""T DU MIT DARKSHEER\n  REDEN. ER H\x99""RT NICHT MEHR AUF\n            MEINEN RAT." },
+};
+
+static struct ComicBlock block_p12_5 = { &poly_p12_b5, -1, -1, block_p12_b5_boxes, 1 };
+
+static struct Polygon poly_p12_b6 = { {
+    { 317, 0 },
+    { 400, 0 },
+    { 400, 83 },
+    { 317, 83 },
+} };
+
+static struct ComicBox block_p12_b6_boxes[] = {
+    { 1, 255, 406, 57, "      DO YOU BELIEVE GOD'S\n REALLY THERE, FATHER? IS ALL\nTHAT CRAP ABOUT HEARING PRAYERS\n AND GIVING BLESSINGS FOR REAL...?", "      VOUS CROYEZ VRAIMENT\n  QUE DIEU EST LA, PERE? TOUTES\n  CES HISTOIRES DE PRIERES ET DE\n BENEDICTIONS, C'EST DONC VRAI?", "     CREE QUE DIOS ESTA\n AQUI, PADRE? Y QUE ESCUCHA\n NUESTRAS PLEGARIAS?", "\n      GLAUBEN SIE DENN WIRKLICH,\n DA\xe1"" ES EINEN GOTT GIBT, VATER? DA\xe1""\n  AN ALL DIESEM UNFUG MIT GEBETEN\n      UND SEGEN WAS DRAN IST?" },
+};
+
+static struct ComicBlock block_p12_6 = { &poly_p12_b6, -1, -1, block_p12_b6_boxes, 1 };
+
+static struct Polygon poly_p12_b7 = { {
+    { 496, 0 },
+    { 580, 0 },
+    { 580, 154 },
+    { 496, 154 },
+} };
+
+static struct ComicBox block_p12_b7_boxes[] = {
+    { 6, 255, 306, 79, "      IF THERE IS A GOD, HE\n  DOESN'T HEAR MY PRAYERS...", "      S'IL Y A UN DIEU, IL\n  N'ENTEND PAS MES PRIERES.", "    SI HAY UN DIOS, SE HA\n  OLVIDADO DE MI...", "      WENN ES EINEN GOTT GIBT,\n  DANN H\x99""RT ER MEINE GEBETE\n            NICHT." },
+};
+
+static struct ComicBlock block_p12_7 = { &poly_p12_b7, -1, -1, block_p12_b7_boxes, 1 };
+
+static struct Polygon poly_p12_b8 = { {
+    { 317, 83 },
+    { 446, 83 },
+    { 446, 292 },
+    { 317, 292 },
+} };
+
+static struct ComicBox block_p12_b8_boxes[] = {
+    { 2, 255, 126, 112, "       YOU DON'T UNDERSTAND,\n FATHER...I LOVE HIM! I LOVE HIM\n AND HE'S READY TO WALK OUT OF\n          MY LIFE!", "       VOUS NE COMPRENEZ PAS,\n MON PERE... JE L'AIME! JE L'AIME\n         ET IL M'ABANDONNE!", "       USTED NO COMPRENDE,\n PADRE... YO LO AMO! Y AHORA VA\n A ESCAPAR DE MI!", "       SIE VERSTEHEN NICHT,\n  VATER...ICH LIEBE IHN! ICH LIEBE\n IHN, UND ER WILL EINFACH SO AUS\n   MEINEM LEBEN VERSCHWINDEN!" },
+    { 1, 255, 431, 102, "      I KNOW YOUR FEELINGS...\n THAT'S WHY YOU HAVE TO BE THE\nONE TO CONVINCE HIM THAT THIS\n DECISION TO RETIRE IS WRONG.", "     JE CONNAIS TES SENTIMENTS...\n C'EST POUR CETTE RAISON QUE TU\nDOIS LE CONVAINCRE QUE SA DECISION\n     DE PARTIR EST UNE ERREUR.", "    SIEMPRE LO HE SABIDO...\n ES POR ESO QUE ERES TU QUIEN\n DEBE CONVENCERLO DE QUE ESTA\n EN UN ERROR AL RETIRARSE.", "      ICH KENNE DEINE GEF\x9a""HLE...\n    DARUM IST ES JA AUCH DEINE\nAUFGABE, IHN ZU \x9a""BERZEUGEN, DA\xe1""\n  SEIN ENTSCHLU\xe1"", SICH ZUR RUHE ZU\n         SETZEN, FALSCH IST." },
+};
+
+static struct ComicBlock block_p12_8 = { &poly_p12_b8, -1, -1, block_p12_b8_boxes, 2 };
+
+static struct Polygon poly_p12_b9 = { {
+    { 317, 292 },
+    { 446, 292 },
+    { 446, 399 },
+    { 317, 399 },
+} };
+
+static struct ComicBox block_p12_b9_boxes[] = {
+    { 4, 255, 156, 238, "        COME, I'LL WALK YOU\n  OUT. STILETTO, I KNOW IN MY HEART\nTHAT IF YOU CAN PERSUADE DARKSHEER\n  TO STAY, THEN HE'LL RETURN YOUR\n   AFFECTION.  YOU WILL TRY,\n          WON'T YOU?", "\n        VIENS, JE VAIS TE\n  RACCOMPAGNER. STILETTO, JE SAIS,\nAU FOND DE MON COEUR, QUE SI TU\nPEUX PERSUADER DARKSHEER DE RESTER,\n     IL TE RENDRA TON AFFECTION.\n            TU ESSAIERAS? ", "        VE, SE QUE TU PUEDES\n  CONVENCER A TENEBROSO.\n  MUESTRALE TUS SENTIMIENTOS. LO\n  INTENTARAS, VERDAD?", "\n        KOMM, ICH BRINGE DICH\n  ZUR T\x9a""R. STILETTO, ICH WEI\xe1"" GENAU,\nWENN DU ES SCHAFFST, DARKSHEER ZUM\n BLEIBEN ZU \x9a""BERREDEN, WIRD ER DEINE\n  GEF\x9a""HLE ERWIDERN. DU WIRST ES\n      VERSUCHEN, NICHT WAHR?" },
+};
+
+static struct ComicBlock block_p12_9 = { &poly_p12_b9, -1, -1, block_p12_b9_boxes, 1 };
+
+static struct Polygon poly_p12_b10 = { {
+    { 448, 154 },
+    { 580, 154 },
+    { 580, 399 },
+    { 448, 399 },
+} };
+
+static struct ComicBox block_p12_b10_boxes[] = {
+    { 4, 255, 252, 263, "      I-I'LL TRY, FATHER...", "        JE... J'ESSAIERAI,\n        MON PERE.", "  LO INTENTARE, PADRE...", "         ICH...ICH WERDE ES\n         VERSUCHEN, VATER..." },
+};
+
+static struct ComicBlock block_p12_10 = { &poly_p12_b10, -1, -1, block_p12_b10_boxes, 1 };
+
+static struct ComicBlock page_12_blocks[] = {
+    block_p12_0,
+    block_p12_1,
+    block_p12_2,
+    block_p12_3,
+    block_p12_4,
+    block_p12_5,
+    block_p12_6,
+    block_p12_7,
+    block_p12_8,
+    block_p12_9,
+    block_p12_10,
+};
+
+static struct ComicPage page_12 = { "DARK/COMDATA/LEPG2223.SCN", 98, 51, 1, 0, page_12_blocks, 11 };
+
+static struct Polygon poly_p13_b0 = { {
+    { 188, 0 },
+    { 270, 0 },
+    { 285, 141 },
+    { 270, 145 },
+    { 188, 91 },
+} };
+
+static struct ComicBox block_p13_b0_boxes[] = {
+    { 2, 246, 13, 86, "      WHAT THE HELL?!", "\n      QUE SE PASSE-T-IL?!", "      QUE DEMONIOS?!", "\n        WAS ZUR H\x99""LLE?!" },
+};
+
+static struct ComicBlock block_p13_0 = { &poly_p13_b0, 99, 25, block_p13_b0_boxes, 1 };
+
+static struct Polygon poly_p13_b1 = { {
+    { 188, 91 },
+    { 270, 145 },
+    { 240, 156 },
+    { 222, 189 },
+    { 188, 189 },
+} };
+
+static struct ComicBox block_p13_b1_boxes[] = {
+    { 1, 246, 261, 193, "      YOU'D BETTER HAVE A\nDAMN GOOD REASON FOR DOING\n      THAT, STILETTO!", "     J'ESPERE QUE TU AS UNE\n    BONNE RAISON DE FAIRE \x80""A,\n            STILETTO!", "  SUPONGO QUE TENDRAS UNA\n BUENA RAZON PARA HACER\n      ESTO, STILETTO!", "      ICH HOFFE, DU HAST EINEN\n VERDAMMT GUTEN GRUND DAF\x9a""R,\n            STILETTO!" },
+};
+
+static struct ComicBlock block_p13_1 = { &poly_p13_b1, -1, -1, block_p13_b1_boxes, 1 };
+
+static struct Polygon poly_p13_b2 = { {
+    { 270, 0 },
+    { 369, 0 },
+    { 351, 140 },
+    { 285, 141 },
+} };
+
+static struct ComicBox block_p13_b2_boxes[] = {
+    { 1, 255, 372, 62, "        I THOUGHT YOU MIGHT\n   BE GETTING SOFT...THAT MIGHT\n  EXPLAIN YOUR \"RETIREMENT!\" I\n APPRECIATE YOU TALKING WITH ME\n  BEFORE PUBLICLY DISSOLVING OUR\n          PARTNERSHIP.", "        JE VOYAIS BIEN QUE TU\n   DEVENAIS MOU... CE QUI EXPLIQUE\nTA \"RETRAITE\"!  C'EST GENTIL DE ME\n   PARLER AVANT DE DISSOUDRE EN\n        PUBLIC NOTRE EQUIPE!", "     PENSE QUE TE ESTABAS\n  DEBILITANDO Y QUE ESO EXPLICABA\n  TU \"RETIRO\"! YO HUBIERA\n PREFERIDO QUE HABLARAS CONMIGO\n ANTES DE DISOLVER PUBLICAMENTE\n    NUESTRA SOCIEDAD.", "         ICH DACHTE, DU WIRST\n    VIELLEICHT WEICH. DAS K\x99""NNTE\n  DEINE \"PENSIONIERUNG\" ERKL\x8e""REN.\n DANKE, DA\xe1"" DU ES MIR SO SCHONEND\n BEIGEBRACHT UND \x99""FFENTLICH DAS\n    ENDE UNSERER PARTNERSCHAFT\n        BEKANNTGEGEBEN HAST." },
+};
+
+static struct ComicBlock block_p13_2 = { &poly_p13_b2, -1, -1, block_p13_b2_boxes, 1 };
+
+static struct Polygon poly_p13_b3 = { {
+    { 369, 0 },
+    { 450, 0 },
+    { 450, 95 },
+    { 360, 66 },
+} };
+
+static struct ComicBox block_p13_b3_boxes[] = {
+    { 2, 246, 191, 75, "      LOOK, STILETTO, I'M\n  SORRY...IF IT'S ANY CONSOLATION,\n THE HARDEST THING WILL BE\n         LEAVING YOU...", "      ECOUTE, STILETTO, JE\n   SUIS DESOLE. SI \x80""A PEUT TE\nCONSOLER, SACHE QUE LE PLUS DUR\n       POUR MOI SERA DE TE\n            QUITTER....", "  LO SIENTO, STILETTO, SI\n ESO TE SIRVE DE CONSUELO, LO\n MAS DURO HA SIDO DEJARTE.", "      H\x99""R MAL, STILETTO, ES\n  TUT MIR LEID. WENN ES DICH\n BERUHIGT: DICH ZU VERLASSEN, WIRD\n   DAS SCHWERSTE DARAN SEIN..." },
+};
+
+static struct ComicBlock block_p13_3 = { &poly_p13_b3, -1, -1, block_p13_b3_boxes, 1 };
+
+static struct Polygon poly_p13_b4 = { {
+    { 360, 66 },
+    { 450, 95 },
+    { 450, 189 },
+    { 415, 189 },
+    { 395, 159 },
+    { 351, 140 },
+} };
+
+static struct ComicBox block_p13_b4_boxes[] = {
+    { 1, 255, 473, 175, "    DO YOU REALLY MEAN THAT?", "\nTU PENSES VRAIMENT CE QUE TU DIS?", "   LO DICES EN SERIO?", "\n     MEINST DU DAS EHRLICH?" },
+};
+
+static struct ComicBlock block_p13_4 = { &poly_p13_b4, -1, -1, block_p13_b4_boxes, 1 };
+
+static struct Polygon poly_p13_b5 = { {
+    { 222, 189 },
+    { 240, 156 },
+    { 285, 141 },
+    { 318, 138 },
+    { 318, 202 },
+    { 254, 201 },
+    { 285, 226 },
+} };
+
+static struct ComicBox block_p13_b5_boxes[] = {
+    { 3, 255, 309, 112, "    LET ME SHOW YOU...", "\n  LAISSE-MOI TE LE PROUVER....", "   TE LO DEMOSTRARE...", "\n    KOMM, ICH ZEIGE ES DIR...." },
+    { 3, 255, 339, 112, "    OH, YESSS...! WHAT IS IT?\n     WHY ARE YOU STOPPING?!", "           OH, OUIIII..!\n QU'EST-CE QU'IL Y A? POURQUOI\n           TU ARRETES?!", "  QUE HACES?\r  POR QUE TE DETIENES?!", "        OH, JAAAA...!\n   WAS IST LOS? WARUM H\x99""RST\n           DU AUF?" },
+};
+
+static struct ComicBlock block_p13_5 = { &poly_p13_b5, -1, -1, block_p13_b5_boxes, 2 };
+
+static struct Polygon poly_p13_b6 = { {
+    { 318, 138 },
+    { 351, 140 },
+    { 395, 159 },
+    { 415, 189 },
+    { 380, 228 },
+    { 383, 201 },
+    { 318, 202 },
+} };
+
+static struct ComicBox block_p13_b6_boxes[] = {
+    { 4, 246, 121, 110, "      THIS CAN'T WORK OUT,\n STILETTO...I'VE GOT A PARADE\nJUST HOURS FROM NOW, AFTER THAT\n     I'M LEAVING TOWN.", "      STILETTO, \x80""A NE PEUT\n PAS MARCHER... J'AI UN DEFILE\nDANS QUELQUES HEURES, ET JE QUITTE\n        LA VILLE ENSUITE... ", "   ES TARDE,\n STILETTO... AHORA DEBO\n ASISTIR AL DESFILE. LUEGO\n     ME IRE DE LA CIUDAD.", "      DAS KANN NICHT GUTGEHEN,\n  STILETTO...IN EIN PAAR STUNDEN\n    IST DIESE PARADE, DANACH\n   VERSCHWINDE ICH AUS DER STADT." },
+    { 3, 255, 453, 122, "     I KNOW. BUT THERE'S\n SOMETHING YOU DON'T KNOW...\n SOMETHING I'VE NEVER TOLD YOU.", "       JE SAIS. MAIS IL Y A\n  QUELQUE CHOSE QUE TU NE SAIS\n   PAS... QUELQUE CHOSE QUE JE NE\n            T'AI JAMAIS DIT....", "     LO SE. PERO HAY\n ALGO QUE NO SABES...\n ALGO QUE NUNCA TE HE DICHO.", "       ICH WEI\xe1"". ABER DA IST\n  NOCH ETWAS, DAS DU NICHT WEI\xe1""T...\n     ETWAS, DAS ICH DIR NIE\n         GESAGT HABE..." },
+};
+
+static struct ComicBlock block_p13_6 = { &poly_p13_b6, -1, -1, block_p13_b6_boxes, 2 };
+
+static struct Polygon poly_p13_b7 = { {
+    { 277, 399 },
+    { 274, 367 },
+    { 318, 334 },
+    { 361, 371 },
+    { 359, 399 },
+} };
+
+static struct ComicBox block_p13_b7_boxes[] = {
+    { 3, 246, 381, 284, "       ...I'M SORRY, STILETTO,\n    BUT IT CAN'T BE LIKE THAT.\n I'VE MADE OTHER PLANS... GOALS\nTHAT JUST DON'T ACCOMMODATE A\n RELATIONSHIP. SOMEDAY YOU'LL\n   UNDERSTAND... GOODBYE.", "      JE SUIS DESOLE, STILETTO,\n   MAIS \x80""A NE PEUT PAS SE PASSER\nCOMME \x80""A. J'AI D'AUTRES PLANS... DES\n PLANS QUI NE ME PERMETTENT PAS DE\nCONSERVER UNE RELATION AMOUREUSE...\n      UN JOUR, TU COMPRENDRAS...\n              AU REVOIR.", "   ...LO SIENTO, STILETTO,\n   PERO NO PUEDE SER. HE HECHO\n OTROS PLANES... EN LOS QUE NO\n ES POSIBLE MANTENER UNA\n RELACION. ALGUN DIA LO\n   ENTENDERAS... ADIOS.", "\n      ES TUT MIR LEID, STILETTO,\n    ABER DAS KANN ICH NICHT. ICH\n HABE ANDERE PL\x8e""NE...ZIELE, DIE SICH\nMIT EINER BEZIEHUNG NICHT VEREINBAREN\n  LASSEN. EINES TAGES WIRST DU MICH\n        VERSTEHEN. LEB WOHL." },
+};
+
+static struct ComicBlock block_p13_7 = { &poly_p13_b7, -1, -1, block_p13_b7_boxes, 1 };
+
+static struct Polygon poly_p13_b8 = { {
+    { 254, 201 },
+    { 383, 201 },
+    { 359, 399 },
+    { 277, 399 },
+} };
+
+static struct ComicBox block_p13_b8_boxes[] = {
+    { 4, 255, 104, 230, "      I... LOVE YOU! IF YOU\n  WON'T CHANGE YOUR MIND ABOUT\nLEAVING, THEN PLEASE... LET ME\n      COME WITH YOU.", "      JE... JE T'AIME! SI TU\n NE VEUX PAS CHANGER D'AVIS AU\nSUJET DE TON DEPART, ALORS JE T'EN\n     PRIE... LAISSE-MOI VENIR\n            AVEC TOI!", "     YO... TE AMO! Y SI\n ESO NO TE HACE DESISTIR DE\n PARTIR... LLEVAME CONTIGO", "       ICH... LIEBE DICH! WENN\n   DU DEINE PL\x8e""NE SCHON NICHT\n    \x8e""NDERST, DANN...LA\xe1"" MICH\n      WENIGSTENS MIT DIR GEHEN!" },
+};
+
+static struct ComicBlock block_p13_8 = { &poly_p13_b8, -1, -1, block_p13_b8_boxes, 1 };
+
+static struct ComicBlock page_13_blocks[] = {
+    block_p13_0,
+    block_p13_1,
+    block_p13_2,
+    block_p13_3,
+    block_p13_4,
+    block_p13_5,
+    block_p13_6,
+    block_p13_7,
+    block_p13_8,
+};
+
+static struct ComicPage page_13 = { "DARK/COMDATA/LEPG24.SCN", 98, 52, 1, 0, page_13_blocks, 9 };
+
+static struct Polygon poly_p14_b0 = { {
+    { 323, 111 },
+    { 417, 111 },
+    { 417, 164 },
+    { 323, 164 },
+} };
+
+static struct ComicBox block_p14_b0_boxes[] = {
+    { 1, 255, 440, 161, "       NEVER AGAIN!!!", "\n         PLUS JAMAIS \x80""A!!!", "    NUNCA MAS!", "\n            NIE WIEDER!!!" },
+};
+
+static struct ComicBlock block_p14_0 = { &poly_p14_b0, -1, -1, block_p14_b0_boxes, 1 };
+
+static struct Polygon poly_p14_b1 = { {
+    { 476, 278 },
+    { 589, 278 },
+    { 589, 353 },
+    { 476, 353 },
+} };
+
+static struct ComicBox block_p14_b1_boxes[] = {
+    { 4, 255, 322, 247, "      NEVER EVER AGAIN!!!", "\n  JAMAIS, NON, PLUS JAMAIS \x80""A!!!", "       NUNCA MAS!!!", "\n     NIEMALS, NIEMALS WIEDER!!!" },
+};
+
+static struct ComicBlock block_p14_1 = { &poly_p14_b1, -1, -1, block_p14_b1_boxes, 1 };
+
+static struct Polygon poly_p14_b2 = { {
+    { 323, 0 },
+    { 589, 0 },
+    { 589, 83 },
+    { 451, 213 },
+    { 323, 90 },
+} };
+
+static struct ComicBox block_p14_b2_boxes[] = {
+    { 2, 255, 225, 104, "      ...FURTHER MORE, IN\n  RECOGNITION OF CONSPICUOUS\nSERVICE TO THE REGISTERED VOTERS\n    OF NOCTROPOLIS CITY...", "     ... DE PLUS, EN\n  REMERCIEMENT DES SERVICES\n  DESINTERESSES RENDUS AUX\n  ELECTEURS DE NOCTROPOLIS...", "   ...Y EN RECONOCIMIENTO\n  A LOS SERVICIOS PRESTADOS\n A LOS ELECTORES DE\n    NOCTROPOLIS...", "      ...DESWEITEREN M\x99""CHTE\n  ICH, IN ANERKENNUNG DER DIENSTE,\nDIE ER F\x9a""R DIE REGISTRIERTEN W\x8e""HLER\n   VON NOCTROPOLIS GELEISTET HAT..." },
+};
+
+static struct ComicBlock block_p14_2 = { &poly_p14_b2, -1, -1, block_p14_b2_boxes, 1 };
+
+static struct Polygon poly_p14_b3 = { {
+    { 323, 90 },
+    { 451, 213 },
+    { 451, 300 },
+    { 323, 300 },
+} };
+
+static struct ComicBox block_p14_b3_boxes[] = {
+    { 2, 255, 160, 227, "      ...IT IS MY HONOR AND\n  PRIVELEGE TO IMPART THE KEY\nTO NOCTROPOLIS CITY TO DARKSHEER,\n WHO LIKE YOUR MAYOR, \"GOT THE\n        JOB DONE IN '51!\"", "      ... J'AI L'HONNEUR ET\n  LE PRIVILEGE D'OFFRIR LA CLEF\nDE NOCTROPOLIS A DARKSHEER, QUI,\n  COMME VOTRE MAIRE, A \"FAIT SON\n          JOB EN '51!\"", "      ...TENGO EL HONOR Y\n EL PRIVILEGIO DE ENTREGAR LAS\n LLAVES DE NOCTROPOLIS A\n TENEBROSO, QUE, AL IGUAL QUE\n  YO, SABE HACER SU TRABAJO", "      ...DEN SCHL\x9a""SSEL ZUR\n  STADT NOCTROPOLIS AN DARKSHEER\n\x9a""BERREICHEN, DER - WIE AUCH ICH ALS\n    B\x9a""RGERMEISTER - STETS SEIN\n          BESTES GEGEBEN HAT." },
+};
+
+static struct ComicBlock block_p14_3 = { &poly_p14_b3, -1, -1, block_p14_b3_boxes, 1 };
+
+static struct Polygon poly_p14_b4 = { {
+    { 451, 213 },
+    { 589, 83 },
+    { 589, 300 },
+    { 451, 300 },
+} };
+
+static struct ComicBox block_p14_b4_boxes[] = {
+    { 2, 246, 313, 215, "     UH...THANK-YOU MR. MAYOR.\n     THANKS TO EVERYONE!", "     EUH... MERCI, MONSIEUR LE\n   MAIRE... MERCI TOUT LE MONDE!", "     EH... GRACIAS, ALCALDE.\n     GRACIAS A TODOS!", "     EHM... VIELEN DANK, HERR\n  B\x9a""RGERMEISTER. DANKE, IHNEN\n             ALLEN!" },
+};
+
+static struct ComicBlock block_p14_4 = { &poly_p14_b4, -1, -1, block_p14_b4_boxes, 1 };
+
+static struct ComicBlock page_14_blocks[] = {
+    block_p14_0,
+    block_p14_1,
+    block_p14_2,
+    block_p14_3,
+    block_p14_4,
+};
+
+static struct ComicPage page_14 = { "DARK/COMDATA/LEPG2526.SCN", 98, 53, 1, 0, page_14_blocks, 5 };
+
+static struct Polygon poly_p15_b0 = { {
+    { 225, 22 },
+    { 293, 35 },
+    { 283, 103 },
+    { 213, 90 },
+} };
+
+static struct ComicBox block_p15_b0_boxes[] = {
+    { 5, 246, 312, 85, "      THE MOMENT OF TRUTH...\nDIDN'T THINK IT WOULD BE SO HARD.", "      LE MOMENT DE VERITE...\n    JE NE PENSAIS PAS QUE CE\n         SERAIT SI DUR.", "  EL MOMENTO DE LA VERDAD...\n NUNCA PENSE QUE SERIA TAN DURO.", "     DER MOMENT DER WAHRHEIT...\n  H\x8e""TTE NIE GEDACHT, DA\xe1"" ES SO\n      SCHWER SEIN W\x9a""RDE." },
+};
+
+static struct ComicBlock block_p15_0 = { &poly_p15_b0, -1, -1, block_p15_b0_boxes, 1 };
+
+static struct Polygon poly_p15_b1 = { {
+    { 213, 155 },
+    { 250, 118 },
+    { 289, 155 },
+    { 253, 193 },
+} };
+
+static struct ComicBox block_p15_b1_boxes[] = {
+    { 5, 246, 309, 176, "      STILL, I KNOW IT'S THE\nRIGHT CHOICE... I'VE GOT A BRIGHTER\n       FUTURE OUT THERE...", "      POURTANT, JE SAIS QUE\nC'EST LE BON CHOIX... MON FUTUR\n  SERA PLUS BRILLANT AILLEURS...", "  PERO SE QUE HAGO LO\n CORRECTO... ME ESPERA UN\n   FUTURO BRILLANTE...", "      TROTZDEM, ICH WEI\xe1"", DA\xe1""\n   ES DIE RICHTIGE ENTSCHEIDUNG\n  WAR... MEINE ZUKUNFT STRAHLT NUN\n          VIEL HELLER..." },
+};
+
+static struct ComicBlock block_p15_1 = { &poly_p15_b1, -1, -1, block_p15_b1_boxes, 1 };
+
+static struct Polygon poly_p15_b2 = { {
+    { 239, 209 },
+    { 304, 272 },
+    { 210, 292 },
+} };
+
+static struct ComicBox block_p15_b2_boxes[] = {
+    { 6, 246, 22, 277, "     TIME TO GO... FAREWELL\nNOCTROPOLIS... YOU'LL ALWAYS BE\n            HOME.", "     IL EST TEMPS DE PARTIR...\nADIEU, NOCTROPOLIS... TU RESTERAS\n     TOUJOURS DANS MON COEUR.", "  ES HORA DE DECIR ADIOS,\nNOCTROPOLIS... SIEMPRE SERAS\n      MI HOGAR.", "      ZEIT ZUM GEHEN...AUF\n   WIEDERSEHEN, NOCTROPOLIS...\n       DU WIRST IMMER MEIN\n           ZUHAUSE SEIN." },
+};
+
+static struct ComicBlock block_p15_2 = { &poly_p15_b2, -1, -1, block_p15_b2_boxes, 1 };
+
+static struct Polygon poly_p15_b3 = { {
+    { 187, 0 },
+    { 452, 0 },
+    { 452, 399 },
+    { 187, 399 },
+} };
+
+static struct ComicBox block_p15_b3_boxes[] = {
+    { 0, 246, 198, 39, "ASSUAGED BY THE KNOWLEDGE THAT DARKSHEER HAS CLEANSED\nAWAY ALL VESTIGE OF ARCHVILLAINY, THE CITY OF NIGHT\nRELAXES ITS GUARD AND SLEEPS... PERCHANCE TO DREAM...", "RASSUREE DE SAVOIR QUE DARKSHEER A ELIMINE TOUTE TRACE\nDES GRANDS CRIMINELS, LA CITE DE LA NUIT RELACHE SA\nGARDE ET S'ENDORT... ESPERANT UN REVE...", " TRANQUILA AL SABER QUE TENEBROSO LA HA LIBRADO DE\n SUS ENEMIGOS, LA CIUDAD DE LA NOCHE SE RELAJA Y SE\n DISPONE A DORMIR...", "BES\x8e""NFTIGT DURCH DAS WISSEN, DA\xe1"" DARKSHEER ALLE NESTER\nDES ERZSCHURKENTUMS AUSGER\x8e""UCHERT HAT, ENTSPANNT SICH\nDIE STADT DER NACHT UND SCHL\x8e""FT EIN...VIELLEICHT\nTR\x8e""UMT SIE AUCH..." },
+};
+
+static struct ComicBlock block_p15_3 = { &poly_p15_b3, -1, -1, block_p15_b3_boxes, 1 };
+
+static struct ComicBlock page_15_blocks[] = {
+    block_p15_0,
+    block_p15_1,
+    block_p15_2,
+    block_p15_3,
+};
+
+static struct ComicPage page_15 = { "DARK/COMDATA/LEPG27.SCN", 98, 54, 0, 0, page_15_blocks, 4 };
+
+const struct ComicPage *LastComicPages[] = {
+    &page_1,
+    &page_2,
+    &page_3,
+    &page_4,
+    &page_5,
+    &page_6,
+    &page_7,
+    &page_8,
+    &page_9,
+    &page_10,
+    &page_11,
+    &page_12,
+    &page_13,
+    &page_14,
+    &page_15,
+    NULL
+};
+
+} // end namespace Noctropolis
+
+} // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_last_comic.h b/engines/access/noctropolis/noctropolis_last_comic.h
new file mode 100644
index 00000000000..8c8c9860314
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_last_comic.h
@@ -0,0 +1,40 @@
+/* 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 ACCESS_NOCTROPOLIS_NOCTROPOLIS_LAST_COMIC_H
+#define ACCESS_NOCTROPOLIS_NOCTROPOLIS_LAST_COMIC_H
+
+#include "access/resources.h"
+#include "access/polygon.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+struct ComicPage;
+
+extern const struct ComicPage *LastComicPages[];
+
+} // end namespace Noctropolis
+
+} // end namespace Access
+
+#endif // ACCESS_NOCTROPOLIS_NOCTROPOLIS_LAST_COMIC_H
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index c9857ee5ad2..35b77cfddad 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -23,6 +23,8 @@
 #include "access/noctropolis/noctropolis_game.h"
 #include "access/noctropolis/noctropolis_font.h"
 #include "access/noctropolis/noctropolis_comicviewer.h"
+#include "access/noctropolis/noctropolis_last_comic.h"
+#include "access/noctropolis/noctropolis_special_comic.h"
 #include "access/font.h"
 #include "access/polygon.h"
 
@@ -1945,21 +1947,21 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	// Load the menu polys
 	int i = 0;
 	while (MENU_POLYS[i] != -1) {
-		Polygon polygon;
+		Polygon poly;
 		int pointsCount = MENU_POLYS[i++];
 		while (pointsCount--) {
 			Common::Point point;
 			point.x = MENU_POLYS[i++];
 			point.y = MENU_POLYS[i++];
-			polygon.points.push_back(point);
+			poly.points.push_back(point);
 		}
-		_menuPolygons.push_back(polygon);
+		_menus.push_back(poly);
 	}
 }
 
-int NoctropolisResources::menuPolygonAt(int16 x, int16 y) const {
-	for (int i = 0; i < (int)_menuPolygons.size(); i++) {
-		if (_menuPolygons[i].pointInside(x, y))
+int NoctropolisResources::menuAt(int16 x, int16 y) const {
+	for (int i = 0; i < (int)_menus.size(); i++) {
+		if (_menus[i].pointInside(x, y))
 			return i;
 	}
 	return -1;
@@ -2119,13 +2121,11 @@ const char *NoctropolisResources::getResponseTitle() const {
 }
 
 const ComicResource *NoctropolisResources::getLastComicResource() const {
-	warning("TODO: Get comic resource for LastPages");
-	return nullptr;
+	return new ComicResource(LastComicPages, 15);
 }
 
 const ComicResource *NoctropolisResources::getSpecialComicResource() const {
-	warning("TODO: Get comic resource for LastPages");
-	return nullptr;
+	return new ComicResource(SpecialComicPages, 7);
 }
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_resources.h b/engines/access/noctropolis/noctropolis_resources.h
index 2d256cec103..6961044115a 100644
--- a/engines/access/noctropolis/noctropolis_resources.h
+++ b/engines/access/noctropolis/noctropolis_resources.h
@@ -70,7 +70,7 @@ public:
 	const ComicResource *getLastComicResource() const;
 	const ComicResource *getSpecialComicResource() const;
 
-	int menuPolygonAt(int16 x, int16 y) const;
+	int menuAt(int16 x, int16 y) const;
 
 private:
 	Font *_fontChaleteu;
@@ -81,7 +81,7 @@ private:
 	Font *_fontChaletse;
 	Font *_fontComicseu;
 
-	PolygonArray _menuPolygons;
+	PolygonArray _menus;
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 5a189d3efb5..ad67db391bc 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -388,7 +388,7 @@ void NoctropolisRoom::roomMenu() {
 			_vm->_events->debounceRight();
 		} else if (_vm->_events->_leftButton) {
 			mousePt = _vm->_events->getMousePos();
-			cmdIndex = ((NoctropolisResources *)_vm->_res)->menuPolygonAt(mousePt.x - baseX, mousePt.y - baseY);
+			cmdIndex = ((NoctropolisResources *)_vm->_res)->menuAt(mousePt.x - baseX, mousePt.y - baseY);
 			_vm->_events->debounceLeft();
 		}
 		_vm->_events->pollEventsAndWait();
diff --git a/engines/access/noctropolis/noctropolis_special_comic.cpp b/engines/access/noctropolis/noctropolis_special_comic.cpp
new file mode 100644
index 00000000000..8b6bf0fed5b
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_special_comic.cpp
@@ -0,0 +1,452 @@
+/* Comic Data From Noctropolis Macos, offset 0x99960 */
+
+#include "noctropolis_comicviewer.h"
+#include "noctropolis_special_comic.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+static struct Polygon poly_p1_b0 = { {
+    { 376, 89 },
+    { 427, 104 },
+    { 450, 145 },
+    { 422, 191 },
+    { 377, 203 },
+    { 320, 182 },
+    { 305, 145 },
+    { 328, 104 },
+} };
+
+static struct ComicBox block_p1_b0_boxes[] = {
+    { 3, 244, 453, 88, "     ...SLOW DISSECTION...\n  LIVING AUTOPSY! NO TOOLS...\nRIP HIS HEART FROM ITS PLACE! OH,\n THE PAIN... THE IMMACULATE PAIN!!", "     ...UNE LENTE DISSECTION...\n     UNE AUTOPSIE VIVANTE! PAS\nD'INSTRUMENTS... LUI ARRACHER LE\nCOEUR! OH, QUELLE DOULEUR... UNE\n        DOULEUR IMMACULEE!!", "     ...LO DISECARIA...\n LE HARIA LA AUTOPSIA VIVO...\n SIN INSTRUMENTOS. LE SACARIA\n EL CORAZON... LO HARIA GRITAR!!", "     ... LANGSAM ZERTEILEN...\n  VIVISEKTION. NICHT SCHNEIDEN...\n    REI\xe1""EN! OH, DER SCHMERZ..." },
+};
+
+static struct ComicBlock block_p1_0 = { &poly_p1_b0, -1, -1, block_p1_b0_boxes, 1 };
+
+static struct Polygon poly_p1_b1 = { {
+    { 187, 0 },
+    { 451, 0 },
+    { 451, 95 },
+    { 187, 95 },
+} };
+
+static struct ComicBox block_p1_b1_boxes[] = {
+    { 0, 246, 200, 73, "NOCTROPOLIS CITY PENITENTIARY.", "PENITENCIER MUNICIPAL DE NOCTROPOLIS", "PRISION DE NOCTROPOLIS.", "ST\x8e""DTISCHES GEF\x8e""NGNIS NOCTROPOLIS." },
+};
+
+static struct ComicBlock block_p1_1 = { &poly_p1_b1, -1, -1, block_p1_b1_boxes, 1 };
+
+static struct Polygon poly_p1_b2 = { {
+    { 187, 95 },
+    { 451, 95 },
+    { 451, 210 },
+    { 187, 210 },
+} };
+
+static struct ComicBox block_p1_b2_boxes[] = {
+    { 0, 246, 207, 187, "CELL 427-JJ, MAXIMUM SECURITY WING. CURRENT\nINMATE: DR. WILLIAM BLISH, A.K.A. MASTER\nMACABRE (ARCH CRIMINAL)", "CELLULE 427-JJ, QUARTIER DE HAUTE SECURITE.\nDETENU ACTUEL: DR. WILLIAM BLISH, ALIAS\nMAITRE MACABRE (GRAND CRIMINEL)", "CELDA 427-JJ DE MAXIMA SEGURIDAD. OCUPANTE\nACTUAL: DR. WILLIAM BLISH, ALIAS MAESTRO\nMACABRO (ARCHICRIMINAL)", "ZELLE 427-JJ DES HOCHSICHERHEITSTRAKTES.\nDERZEITIGER INSASSE: DR. WILLIAM BLISH, ALIAS\nDOKTOR MAKABER (ERZSCHURKE)" },
+    { 3, 244, 334, 108, "    ...INTOLERABLE! MY TALENTS\n ARE WASTING BEHIND THESE BLOODY\nBARS. BLOOD! THAT'S THE ANSWER.\n   OH, TO HAVE DARKSHEER AT\n          MY MERCY...", "    ... C'EST INTOLERABLE! MES\n  TALENTS GACHES DERRIERE CES\n  BARREAUX! DU SANG! VOILA LA\n   REPONSE. OH... AVOIR DARKSHEER\n            A MA MERCI...", "    ...INTOLERABLE! MI TALENTO\n DESPERDICIADO TRAS ESTAS REJAS.\n SI PUDIERA PONER MIS MANOS\n    SOBRE TENEBROSO...", "      ... UNERTR\x8e""GLICH! MEINE\n     TALENTE VERGEUDET HINTER\n  GITTERN, WIE BEI EINEM BLUTIGEN\n ANF\x8e""NGER. BLUT! DAS IST DIE ANTWORT.\n   OH, WENN ICH DOCH NUR DARKSHEER\n      IN MEINER GEWALT H\x8e""TTE..." },
+};
+
+static struct ComicBlock block_p1_2 = { &poly_p1_b2, -1, -1, block_p1_b2_boxes, 2 };
+
+static struct Polygon poly_p1_b3 = { {
+    { 187, 210 },
+    { 283, 210 },
+    { 283, 312 },
+    { 233, 337 },
+    { 187, 314 },
+} };
+
+static struct ComicBox block_p1_b3_boxes[] = {
+    { 3, 246, 308, 181, "      IT IS ALWAYS REFRESHING\n   TO ENCOUNTER THOSE WHO\nAPPRECIATE THE AESTHETICS OF\n  PROPER PAIN DISPENSATION.", "        C'EST TOUJOURS\n  RAFRAICHISSANT DE RENCONTRER\n   CEUX QUI SAVENT APPRECIER\n      L'ESTHETIQUE DE LA DOULEUR\n             BIEN INFLIGEE.", "  SIEMPRE ES AGRADABLE\n  ESCUCHAR A UN\n  PROFESIONAL DEL DOLOR.", "            ES IST IMMER\n      ERFRISCHEND, JEMANDEN\n    KENNENZULERNEN, DER DIE\n  \x8e""STHETIK DER SCHMERZVERTEILUNG\n         ZU W\x9a""RDIGEN WEI\xe1""." },
+    { 4, 244, 5, 173, "            WHO...?", "\n          QUI...?", "     QUIEN ERES?", "\n               WER...?" },
+};
+
+static struct ComicBlock block_p1_3 = { &poly_p1_b3, -1, -1, block_p1_b3_boxes, 2 };
+
+static struct Polygon poly_p1_b4 = { {
+    { 187, 314 },
+    { 233, 337 },
+    { 283, 312 },
+    { 283, 399 },
+    { 187, 399 },
+} };
+
+static struct ComicBox block_p1_b4_boxes[] = {
+    { 3, 246, 297, 300, "      I AM FLUX. I HAVE COME\n  TO OFFER YOU A PROPOSITION.\n   BUT I FIND THIS BARRIER\n  BOTHERSOME. COME, JOIN ME\n        IN THE CORRIDOR.", "\n      JE M'APPELLE FLUX. JE\n    SUIS VENU VOUS FAIRE UNE\nPROPOSITION. MAIS JE TROUVE\n CETTE BARRIERE GENANTE. VENEZ,\n     REJOIGNEZ-MOI DANS\n         LE COULOIR.", "    SOY FLUX Y VENGO A\n  HACERTE UNA PROPOSICION.\n  PERO ESTOS BARROTES SON\n  MOLESTOS. POR QUE NO SALES\n    AL CORREDOR?", "          NENNEN SIE MICH\n    EINFACH FLUX. ICH BIN GEKOMMEN,\n     UM IHNEN EINEN VORSCHLAG ZU\n  UNTERBREITEN. ABER ICH FINDE DIESE\n   BARRIERE SEHR ST\x99""REND. KOMMEN\n     SIE DOCH ZU MIR HERAUS\n           AUF DEN FLUR." },
+};
+
+static struct ComicBlock block_p1_4 = { &poly_p1_b4, -1, -1, block_p1_b4_boxes, 1 };
+
+static struct Polygon poly_p1_b5 = { {
+    { 283, 210 },
+    { 451, 210 },
+    { 451, 399 },
+    { 283, 399 },
+} };
+
+static struct ComicBox block_p1_b5_boxes[] = {
+    { 3, 244, 392, 184, "        THE GUARDS...", "\n        LES GARDES...", "        LOS GUARDIAS...", "        ABER DIE WACHEN..." },
+    { 4, 246, 144, 248, "     HAVE BEEN... RELIEVED. I\n SHARE YOUR VIEWPOINT, MACABRE,\n  YOUR GIFTS ARE BEING WASTED\n           HERE...", "      ONT ETE... RELEVES. JE\n  PARTAGE VOTRE POINT DE VUE,\n  MACABRE, VOTRE TALENT N'EST\n        PAS EXPLOITE ICI...", "   HAN IDO A... DESCANSAR.\n ESTOY DE ACUERDO, MACABRO.\n TU TALENTO SE DESPERDICIA\n           AQUI...", "      WURDEN...ABGEL\x99""ST. ICH\n   TEILE IHRE ANSICHT, MAKABER,\n   DA\xe1"" IHRE TALENTE HIER NUR\n        VERGEUDET WERDEN." },
+};
+
+static struct ComicBlock block_p1_5 = { &poly_p1_b5, -1, -1, block_p1_b5_boxes, 2 };
+
+static struct ComicBlock page_1_blocks[] = {
+    block_p1_0,
+    block_p1_1,
+    block_p1_2,
+    block_p1_3,
+    block_p1_4,
+    block_p1_5,
+};
+
+static struct ComicPage page_1 = { "DARK/COMDATA/SEPG01.SCN", 98, 55, 1, 0, page_1_blocks, 6 };
+
+static struct Polygon poly_p2_b0 = { {
+    { 369, 36 },
+    { 450, 36 },
+    { 450, 150 },
+    { 369, 150 },
+} };
+
+static struct ComicBox block_p2_b0_boxes[] = {
+    { 2, 244, 158, 132, "     OF COURSE, FLUX, YOU'RE\nTHE BOSS... NOW TELL ME MORE\n      ABOUT DARKSHEER!", "     BIEN SUR, FLUX... C'EST\nVOUS LE BOSS... MAIS DITES M'EN\n UN PEU PLUS SUR CE DARKSHEER!", "  POR SUPUESTO, FLUX. ERES\nEL JEFE... AHORA HABLAME\n      DE TENEBROSO!", "     SELBSTVERST\x8e""NDLICH, FLUX,\nSIE SIND DER BOSS...ERZ\x8e""HLEN\n   SIE MIR MEHR \x9a""BER DARKSHEER!" },
+};
+
+static struct ComicBlock block_p2_0 = { &poly_p2_b0, -1, -1, block_p2_b0_boxes, 1 };
+
+static struct Polygon poly_p2_b1 = { {
+    { 187, 0 },
+    { 450, 0 },
+    { 450, 217 },
+    { 187, 217 },
+} };
+
+static struct ComicBox block_p2_b1_boxes[] = {
+    { 2, 246, 68, 68, "    ...I OFFER YOU FREEDOM. A\n  CHANCE TO REALIZE YOUR DREAM\nOF RIPPING DARKSHEER'S HEART TO\n BLOODY SHREDS! IN EXCHANGE, I\n    DEMAND YOUR ALLEGIANCE.", "\n    ...JE VOUS OFFRE LA LIBERTE.\n   UNE CHANCE DE REALISER VOTRE\nREVE EN ARRACHANT LE COEUR DE\n  DARKSHEER POUR LE REDUIRE EN\n   LAMBEAUX SANGLANTS! EN ECHANGE,\n       JE VOUS DEMANDE VOTRE\n             FIDELITE", "    ...TE OFREZCO LA LIBERTAD\n Y UNA OPORTUNIDAD DE REALIZAR\n TUS DESEOS DE DESTROZAR A\n TENEBROSO. A CAMBIO, SOLO PIDO\n QUE TE SUBORDINES A MI.", "      ...ICH BIETE IHNEN DIE\n    FREIHEIT, DAZU EINE CHANCE,\n IHREN TRAUM ZU VERWIRKLICHEN UND\n       DARKSHEER DAS HERZ\n   RAUSZUREI\xe1""EN. DAF\x9a""R\n     VERLANGE ICH GEHORSAM." },
+};
+
+static struct ComicBlock block_p2_1 = { &poly_p2_b1, -1, -1, block_p2_b1_boxes, 1 };
+
+static struct Polygon poly_p2_b2 = { {
+    { 187, 150 },
+    { 285, 217 },
+    { 322, 399 },
+    { 187, 399 },
+} };
+
+static struct ComicBox block_p2_b2_boxes[] = {
+    { 3, 246, 296, 212, "     LATER. THE OTHERS AWAIT\n        OUR ARRIVAL.", "     PLUS TARD. LES AUTRES\n        NOUS ATTENDENT.", "  MAS TARDE. LOS DEMAS\n        NOS ESPERAN.", "       SP\x8e""TER. DIE ANDEREN\n         WARTEN AUF UNS." },
+    { 3, 244, 346, 258, "     OTHERS?", "\n        LES AUTRES?", "   LOS DEMAS?", "\n           ANDEREN?" },
+    { 3, 246, 296, 212, "       TOPHAT, DREALMER,\n  GREENTHUMB AND THE SUCCUBUS\nHAVE ALSO ACCEPTED ME AS THEIR\n LEADER. TOGETHER, WE WILL BRING\n   NOCTROPOLIS TO ITS KNEES!", "       TOPHAT, DREALMER,\n  MAINVERTE ET LA SUCCUBE ONT\n EGALEMENT ACCEPTE DE M'OBEIR.\n  ENSEMBLE, NOUS ALLONS METTRE\n     NOCTROPOLIS A GENOUX!", "   LA DIVA, MORFEICO,\n  DEDOVERDE Y LA SUCCUBUS\n TAMBIEN ME HAN ACEPTADO COMO\n LIDER. JUNTOS, PONDREMOS A\n   NOCTROPOLIS DE RODILLAS!", "         MISS ZYLINDERCHEN,\n    TR\x8e""UMLER, GR\x9a""ND\x8e""UMLING UND\n  SUCCUBUS HABEN MICH EBENFALLS\n    ALS ANF\x9a""HRER AKZEPTIERT.\n     GEMEINSAM WERDEN WIR\n       NOCTROPOLIS IN DIE\n          KNIE ZWINGEN!" },
+};
+
+static struct ComicBlock block_p2_2 = { &poly_p2_b2, -1, -1, block_p2_b2_boxes, 3 };
+
+static struct Polygon poly_p2_b3 = { {
+    { 285, 217 },
+    { 450, 217 },
+    { 450, 296 },
+    { 302, 296 },
+} };
+
+static struct ComicBox block_p2_b3_boxes[] = {
+    { 4, 244, 115, 196, "     AH, FLUX, I LIKE YOUR\n             STYLE!", "     AH, FLUX, J'AIME BIEN\n         VOTRE STYLE!", "     ME GUSTA TU\n       ESTILO, FLUX!", "         HMM, FLUX, IHR STIL\n            GEF\x8e""LLT MIR." },
+};
+
+static struct ComicBlock block_p2_3 = { &poly_p2_b3, -1, -1, block_p2_b3_boxes, 1 };
+
+static struct Polygon poly_p2_b4 = { {
+    { 302, 296 },
+    { 450, 296 },
+    { 450, 399 },
+    { 322, 399 },
+} };
+
+static struct ComicBox block_p2_b4_boxes[] = {
+    { 4, 246, 145, 263, "     YES... I BELIEVE YOU'LL\nFIND THAT WE HAVE MUCH IN COMMON.", "\n     OUI... JE CROIS QUE VOUS\n VERREZ BIENTOT QUE NOUS AVONS\n       BEAUCOUP DE CHOSES\n           EN COMMUN...", "  SI... VERAS QUE TENEMOS\n MUCHO EN COMUN.", "       JA, ICH GLAUBE, SIE\nWERDEN FESTSTELLEN, DA\xe1"" WIR EINE\n      MENGE GEMEINSAM HABEN." },
+};
+
+static struct ComicBlock block_p2_4 = { &poly_p2_b4, -1, -1, block_p2_b4_boxes, 1 };
+
+static struct ComicBlock page_2_blocks[] = {
+    block_p2_0,
+    block_p2_1,
+    block_p2_2,
+    block_p2_3,
+    block_p2_4,
+};
+
+static struct ComicPage page_2 = { "DARK/COMDATA/SEPG02.SCN", 98, 55, 1, 0, page_2_blocks, 5 };
+
+static struct Polygon poly_p3_b0 = { {
+    { 187, 0 },
+    { 451, 0 },
+    { 451, 186 },
+    { 187, 186 },
+} };
+
+static struct ComicBox block_p3_b0_boxes[] = {
+    { 2, 246, 98, 99, "       COLLECTIVELY, YOU ARE\n   ARMAGEDDON: A NIGHTMARE FOR\nTHE CITY OF NIGHT! GO NOW, EXPLORE\n EVERY PERVERSION. LET TERROR REIGN\n  IN THE STREETS AND CHAOS CONSUME\n           THE WHOLE!", "        ENSEMBLE, VOUS ETES\n    L'APOCALYPSE, UN CAUCHEMAR\n  POUR LA CITE DE LA NUIT! ALLEZ,\n   MAINTENANT. EXPLOREZ CHAQUE\n   PERVERSION. LAISSEZ LA TERREUR\n    REGNER DANS LES RUES, ET LE\n       CHAOS CONSUMERA TOUT!", "    JUNTOS SEREMOS EL\n   ARMAGEDON, UNA PESADILLA PARA\n LA CIUDAD DE LA NOCHE. DEDICAOS A\n CUANTA PERVERSION SE OS OCURRA.\n  SEMBRAD EL TERROR EN LAS CALLES!", "       GEMEINSAM SEID IHR DAS\n    ARMAGEDDON, DER ALPTRAUM F\x9a""R\n  DIE STADT DER NACHT! GEHT JETZT\n  UND LEBT EURE PERVERSIONEN AUS!\n   LA\xe1""T DEN TERROR IN DEN STRA\xe1""EN\n      REGIEREN UND DAS CHAOS\n        ALLES VERSCHLINGEN!" },
+};
+
+static struct ComicBlock block_p3_0 = { &poly_p3_b0, -1, -1, block_p3_b0_boxes, 1 };
+
+static struct Polygon poly_p3_b1 = { {
+    { 187, 186 },
+    { 451, 186 },
+    { 451, 399 },
+    { 187, 399 },
+} };
+
+static struct ComicBox block_p3_b1_boxes[] = {
+    { 0, 246, 221, 318, "THE DREALMER.", "DREALMER.", "MORFEICO.", "TR\x8e""UMLER." },
+    { 0, 246, 270, 267, "TOPHAT.", "TOPHAT.", "LA DIVA.", "MISS ZYLINDERCHEN." },
+    { 0, 246, 327, 289, "MASTER MACABRE.", "MAITRE MACABRE.", "MACABRO.", "DOKTOR MAKABER." },
+    { 0, 246, 362, 251, "GREENTHUMB.", "MAINVERTE.", "DEDOVERDE.", "GR\x9a""ND\x8e""UMLING." },
+    { 0, 246, 419, 278, "THE SUCCUBUS.", "LA SUCCUBE.", "LA SUCCUBUS.", "SUCCUBUS." },
+};
+
+static struct ComicBlock block_p3_1 = { &poly_p3_b1, -1, -1, block_p3_b1_boxes, 5 };
+
+static struct ComicBlock page_3_blocks[] = {
+    block_p3_0,
+    block_p3_1,
+};
+
+static struct ComicPage page_3 = { "DARK/COMDATA/SEPG03.SCN", 98, 56, 0, 0, page_3_blocks, 2 };
+
+static struct Polygon poly_p4_b0 = { {
+    { 187, 0 },
+    { 451, 0 },
+    { 451, 399 },
+    { 187, 399 },
+} };
+
+static struct ComicBox block_p4_b0_boxes[] = {
+    { 0, 246, 216, 189, "NOCTROPOLIS CITY STAGGERS UNDER THE VILLAINS'\nRUTHLESS ONSLAUGHT. WORKING IN CONCERT UNDER THE\nDIRECTION OF THE ENIGMATIC MASTERMIND, FLUX, THE\nINSIDIOUS QUINTET RELENTLESSLY DEVOUR THE CITY OF\nNIGHT A BITE AT A TIME....", "NOCTROPOLIS VACILLE SOUS LES ASSAUTS FAROUCHES\nDES MALEFIQUES. TRAVAILLANT DE CONCERT SOUS LA\nDIRECTION DE FLUX, LE MYSTERIEUX CERVEAU, LES\nCINQ EVADES DEVORENT SANS RELACHE LA CITE DE LA\nNUIT... BOUCHEE APRES BOUCHEE...", " NOCTROPOLIS SE ESTREMECE BAJO EL ASALTO DE\n LOS CRIMINALES. TRABAJANDO BAJO LA\n DIRECCION DEL MISTERIOSO FLUX, EL\n QUINTETO HACE CUNDIR EL PANICO EN LAS\n CALLES...", "NOCTROPOLIS ERBEBT UNTER DEM GNADENLOSEN ANSTURM\nDES B\x99""SEN. DANK DER KOORDINATION DES GEHEIMNISVOLLEN\nDRAHTZIEHERS FLUX VERSCHLINGT DAS QUINTETT DIE STADT\nDER NACHT BISSEN F\x9a""R BISSEN..." },
+};
+
+static struct ComicBlock block_p4_0 = { &poly_p4_b0, -1, -1, block_p4_b0_boxes, 1 };
+
+static struct ComicBlock page_4_blocks[] = {
+    block_p4_0,
+};
+
+static struct ComicPage page_4 = { "DARK/COMDATA/SEPG04.SCN", 98, 57, 1, 0, page_4_blocks, 1 };
+
+static struct Polygon poly_p5_b0 = { {
+    { 187, 0 },
+    { 451, 0 },
+    { 451, 78 },
+    { 187, 78 },
+} };
+
+static struct ComicBox block_p5_b0_boxes[] = {
+    { 0, 246, 216, 43, "NOCTROPOLIS CITY CATHEDRAL.", "CATHEDRALE DE NOCTROPOLIS.", "CATEDRAL DE NOCTROPOLIS.", "DOM VON NOCTROPOLIS." },
+};
+
+static struct ComicBlock block_p5_0 = { &poly_p5_b0, -1, -1, block_p5_b0_boxes, 1 };
+
+static struct Polygon poly_p5_b1 = { {
+    { 187, 78 },
+    { 343, 78 },
+    { 343, 185 },
+    { 187, 185 },
+} };
+
+static struct ComicBox block_p5_b1_boxes[] = {
+    { 4, 255, 29, 76, "      YO, FATHER, C'MON MAN,\n I KNOW THEY'RE TOUGH 'N ALL, BUT\nWE JUST GOTTA DO SOMETHIN'... THE\n     POLICE SURE AIN'T!", "      YO, PERE, ECOUTE, MEC.\n JE SAIS QUE C'EST DES DURS, TOUT\n  \x80""A... MAIS FAUT FAIRE QUELQUE\n   CHOSE... LA POLICE NE FAIT RIEN,\n           \x80""A C'EST SUR!", "    OIGA, PADRE, LA GENTE\n CREE QUE ESTO ES EL FIN, PERO\n NOSOTROS PODEMOS HACER ALGO...\n LA POLICIA ES INUTIL!", "      ALSO, VATER, KOMMEN SIE\n   SCHON, ICH WEI\xe1"", DA\xe1"" SIE EIN\n    HARTER BURSCHE SIND, ABER WIR\n M\x9a""SSEN WAS TUN, DENN DIE POLIZEI\n      TUT BESTIMMT NICHTS!" },
+    { 3, 255, 344, 87, "     YEAH, FATHER, JUST LET\n THE WARDS GIVE IT A TRY.", "     OUAIS, PERE, LAISSEZ\n     FAIRE LES PUPILLES!", "   SI, PADRE, DEJE QUE LOS\n GUARDIANES LO INTENTEMOS.", "     JAU, VATER, GEBEN SIE DER\n  WEHR DOCH EINMAL EINE CHANCE." },
+};
+
+static struct ComicBlock block_p5_1 = { &poly_p5_b1, -1, -1, block_p5_b1_boxes, 2 };
+
+static struct Polygon poly_p5_b2 = { {
+    { 343, 78 },
+    { 451, 78 },
+    { 451, 167 },
+    { 343, 167 },
+} };
+
+static struct ComicBox block_p5_b2_boxes[] = {
+    { 4, 255, 189, 50, "     ABSOLUTELY NOT! ALL FIVE\n   OF THEM ARE TWISTED, COLD-\nBLOODED KILLERS, RICO... THEY'D EAT\n THE WARDS ALIVE! MAYBE... MAYBE\n      STILETTO CAN HELP US.", "\n     CERTAINEMENT PAS! CE SONT\n     CINQ DEMENTS QUI TUENT DE\n SANG-FROID, RICO... ILS NE FERAIENT\nQU'UNE BOUCHEE DE VOUS! PEUT-ETRE\n    QUE... PEUT-ETRE QUE STILETTO\n             PEUT NOUS AIDER.", "     DE ESO NADA! SE TRATA\n  DE CINCO CRIMINALES SIN\n PIEDAD QUE OS DEVORARIAN VIVOS!\n QUIZAS STILETTO PUEDA AYUDARNOS.", "\n     BESTIMMT NICHT! DAS SIND\n   ALLE F\x9a""NF GEST\x99""RTE, KALTBL\x9a""TIGE\nKILLER, RICO...DIE W\x9a""RDEN DIE WEHR\n LEBENDIG ZERFLEISCHEN. VIELLEICHT...\n   VIELLEICHT KANN UNS STILETTO\n              HELFEN." },
+};
+
+static struct ComicBlock block_p5_2 = { &poly_p5_b2, -1, -1, block_p5_b2_boxes, 1 };
+
+static struct Polygon poly_p5_b3 = { {
+    { 187, 185 },
+    { 333, 185 },
+    { 333, 399 },
+    { 187, 399 },
+} };
+
+static struct ComicBox block_p5_b3_boxes[] = {
+    { 4, 255, 40, 250, "       IF STILETTO CAN'T HELP,\n  THEN IT'S OVER... ESPECIALLY FOR\n ME. THE SUCCUBUS HASN'T FORGOTTEN\n HER HATE, IT'S PROBABLY STRONGER\n    THAN EVER. GOD HELP ME WHEN\n            SHE COMES!", "         SI STILETTO NE PEUT\n    PAS NOUS AIDER, ALORS TOUT\n EST FINI... SURTOUT POUR MOI. LA\nSUCCUBE N'A PAS OUBLIE SA HAINE, ET\n  ELLE EST SUREMENT PLUS FORTE QUE\n   JAMAIS! QUE DIEU ME VIENNE EN\n      AIDE SI ELLE VIENT ICI!", "       SI STILETTO SE NIEGA, SE\n  ACABARA TODO... EN ESPECIAL\n PARA MI. LA SUCCUBUS NO OLVIDA.\n Y AHORA DEBE SER MAS FUERTE QUE\n NUNCA. QUE DIOS SE APIADE DE MI\n     SI ELLA VIENE!", "       WENN UNS STILETTO NICHT\n   HELFEN KANN, IST ALLES VORBEI...\n BESONDERS F\x9a""R MICH. SUCCUBUS HAT\n  IHREN HA\xe1"" BESTIMMT NICHT\n   VERGESSEN, WAHRSCHEINLICH\n    IST ER EHER NOCH GEWACHSEN.\n    GOTT STEH MIR BEI, WENN SIE\n               KOMMT!" },
+};
+
+static struct ComicBlock block_p5_3 = { &poly_p5_b3, -1, -1, block_p5_b3_boxes, 1 };
+
+static struct Polygon poly_p5_b4 = { {
+    { 333, 167 },
+    { 451, 167 },
+    { 451, 399 },
+    { 333, 399 },
+} };
+
+static struct ComicBox block_p5_b4_boxes[] = {
+    { 4, 255, 211, 173, "      WELL IF IT AIN'T FATHER\n  DESMOND! COME TO GIVE POOR\nSTILETTO MORE ADVICE, PRIEST? NOW,\n           LET'S SEE...", "       MAIS C'EST LE PERE\n  DESMOND! ON EST VENU DONNER\n DES CONSEILS A STILETTO, CURE?\n          BON, VOYONS VOIR...", "   QUE SORPRESA, PADRE\n  DESMOND! VIENE A DAR CONSEJOS\n A LA POBRE STILETTO?", "\n      NA, WENN DAS NICHT VATER\n  DESMOND IST! VORBEIGEKOMMEN, UM\nDER ARMEN STILETTO NOCH EIN PAAR\n  RATSCHL\x8e""GE ZU GEBEN, PRIESTER?\n    NA, DANN SCHAUEN WIR DOCH MAL..." },
+};
+
+static struct ComicBlock block_p5_4 = { &poly_p5_b4, -1, -1, block_p5_b4_boxes, 1 };
+
+static struct ComicBlock page_5_blocks[] = {
+    block_p5_0,
+    block_p5_1,
+    block_p5_2,
+    block_p5_3,
+    block_p5_4,
+};
+
+static struct ComicPage page_5 = { "DARK/COMDATA/SEPG05.SCN", 98, 58, 1, 0, page_5_blocks, 5 };
+
+static struct Polygon poly_p6_b0 = { {
+    { 188, 0 },
+    { 320, 0 },
+    { 320, 107 },
+    { 188, 107 },
+} };
+
+static struct ComicBox block_p6_b0_boxes[] = {
+    { 1, 255, 292, 98, "    ...\"GOD WANTS ME TO BE\n  HAPPY\",... \"DARKSHEER WILL\nRETURN MY LOVE\". THAT'S WHAT\n  YOU TOLD ME...\n      WHAT A LOAD OF BULL!", "       ...\"DIEU VEUT QUE TU\n                 SOIS HEUREUSE,\"... \n   \"DARKSHEER TE RENDRA \n                    TON AMOUR...\" \n     C'EST CE QUE VOUS DISIEZ...\n     RIEN QUE DES CONNERIES!", "    ...DIOS QUIERE QUE\n SEAS FELIZ... TENEBROSO\n ENTENDERA TU AMOR... ESO ME\n DIJO, RECUERDA?", "       ...\"GOTT WILL, DA\xe1""\n               ICH GL\x9a""CKLICH BIN.\"\n...\"DARKSHEER WIRD MEINE\n                       LIEBE ERWIDERN\",\n    DAS WAR'S DOCH, WAS SIE MIR\n    ERZ\x8e""HLST HABEN...WAS F\x9a""R EINE\n               SCHEI\xe1""E!" },
+};
+
+static struct ComicBlock block_p6_0 = { &poly_p6_b0, -1, -1, block_p6_b0_boxes, 1 };
+
+static struct Polygon poly_p6_b1 = { {
+    { 320, 0 },
+    { 451, 0 },
+    { 451, 107 },
+    { 320, 107 },
+} };
+
+static struct ComicBox block_p6_b1_boxes[] = {
+    { 2, 255, 195, 91, "    STILETTO, I UNDERSTAND\nYOUR PAIN, BUT I'VE COME TO\n  DISCUSS URGENT MATTERS.", "      STILETTO, JE COMPRENDS\n  TA PEINE, MAIS JE SUIS VENU TE\n      PARLER D'UNE AFFAIRE\n           IMPORTANTE...", "    STILETTO, COMPRENDO TU\n DOLOR, PERO ME TRAEN\n ASUNTOS MUY URGENTES.", "      STILETTO, ICH VERSTEHE\n  JA DEINEN SCHMERZ, ABER ICH\n     MU\xe1"" WICHTIGE DINGE MIT DIR\n            BESPRECHEN." },
+};
+
+static struct ComicBlock block_p6_1 = { &poly_p6_b1, -1, -1, block_p6_b1_boxes, 1 };
+
+static struct Polygon poly_p6_b2 = { {
+    { 188, 107 },
+    { 320, 107 },
+    { 320, 210 },
+    { 188, 210 },
+} };
+
+static struct ComicBox block_p6_b2_boxes[] = {
+    { 3, 255, 330, 78, "      THE ARCHVILLAINS HAVE\n  ESCAPED FROM PRISON! THEY'RE\nTEARING THIS CITY APART! NOW,\n YOU'VE GOT TO PULL YOURSELF\n           TOGETHER.", "      LES ARCHI-CRIMINELS SE\n  SONT EVADES! ILS SONT EN TRAIN\n DE RUINER NOTRE VILLE! TU DOIS\n     ABSOLUMENT TE SECOUER,\n          MAINTENANT!", "    LOS ARCHIVILLANOS HAN\n  ESCAPADO DE PRISION Y SIEMBRAN\n EL TERROR! SOLO TU PUEDES\n ENFRENTARTE A ELLOS.", "      DIE ERZSCHURKEN SIND\n  AUS DEM GEF\x8e""NGNIS ENTKOMMEN!\nSIE REI\xe1""EN DIESE STADT IN ST\x9a""CKE!\n     DU MU\xe1""T DICH ZUSAMMENNEHMEN!" },
+};
+
+static struct ComicBlock block_p6_2 = { &poly_p6_b2, -1, -1, block_p6_b2_boxes, 1 };
+
+static struct Polygon poly_p6_b3 = { {
+    { 320, 107 },
+    { 451, 107 },
+    { 451, 210 },
+    { 320, 210 },
+} };
+
+static struct ComicBox block_p6_b3_boxes[] = {
+    { 4, 255, 159, 77, "    WHO THE HELL DO YOU THINK\n  YOU ARE?! I DON'T HAVE TO DO\n A DAMN THING FOR YOU OR THIS\n             CITY!", "      MAIS VOUS VOUS PRENEZ\n  POUR QUI? JE NE SUIS PAS\n OBLIGEE DE FAIRE QUOIQUE CE SOIT,\n      NI POUR VOUS, NI POUR CETTE\n           FOUTUE VILLE!", "  QUIEN TE CREES QUE ERES?\n NO TE DEBO NADA NI A TI NI A\n ESTA MALDITA CIUDAD!", "      WER ZUR H\x99""LLE GLAUBEN\n  SIE, DA\xe1"" SIE SIND? ICH MU\xe1""\n\x9a""BERHAUPT NICHTS TUN, WEDER F\x9a""R\n      SIE NOCH F\x9a""R DIESE STADT!" },
+};
+
+static struct ComicBlock block_p6_3 = { &poly_p6_b3, -1, -1, block_p6_b3_boxes, 1 };
+
+static struct Polygon poly_p6_b4 = { {
+    { 188, 210 },
+    { 320, 210 },
+    { 320, 399 },
+    { 188, 399 },
+} };
+
+static struct ComicBox block_p6_b4_boxes[] = {
+    { 3, 255, 314, 280, "       IF I WANT TO SIT ON MY\n   ASS 'N DRINK MYSELF BLIND, THEN\n THAT'S MY OWN BUSINESS! FIND\n  ANOTHER SHOULDER TO CRY ON\n          PRIEST...\n     I DON'T CARE ANYMORE.", "            SI JE PREFERE\n       RESTER ASSISE A M'IMBIBER\n   CONSCIENCIEUSEMENT, C'EST MON\nTROUVEZ UNE AUTRE EPAULE PROBLEME!\n     POUR PLEURER, CURE... JE M'EN\n          FOUS, MAINTENANT.", "    SI HE DECIDIDO SENTARME A\n  BEBER, ESO ES ASUNTO\n MIO. BUSCA OTRO HOMBRO SOBRE\n EL QUE LLORAR, SACERDOTE.\n A MI NO ME IMPORTA NADA.", "        WENN ICH AUF MEINEM\n    HINTERN SITZEN UND MICH BLIND\n SAUFEN M\x99""CHTE, DANN IST DAS ALLEIN\n MEINE ANGELEGENHEIT! SUCHEN SIE SICH EINE\n    ANDERE SCHULTER ZUM AUSHEULEN,\n    PRIESTER, MIR IST DAS ALLES EGAL!" },
+};
+
+static struct ComicBlock block_p6_4 = { &poly_p6_b4, -1, -1, block_p6_b4_boxes, 1 };
+
+static struct Polygon poly_p6_b5 = { {
+    { 320, 210 },
+    { 451, 210 },
+    { 451, 399 },
+    { 320, 399 },
+} };
+
+static struct ComicBox block_p6_b5_boxes[] = {
+    { 4, 255, 194, 272, "     GOOD-BYE, STILETTO....", "\n       AU REVOIR, STILETTO....", "     ADIOS, STILETTO....", "\n    AUF WIEDERSEHEN, STILETTO...." },
+};
+
+static struct ComicBlock block_p6_5 = { &poly_p6_b5, -1, -1, block_p6_b5_boxes, 1 };
+
+static struct ComicBlock page_6_blocks[] = {
+    block_p6_0,
+    block_p6_1,
+    block_p6_2,
+    block_p6_3,
+    block_p6_4,
+    block_p6_5,
+};
+
+static struct ComicPage page_6 = { "DARK/COMDATA/SEPG06.SCN", 98, 58, 1, 0, page_6_blocks, 6 };
+
+static struct Polygon poly_p7_b0 = { {
+    { 354, 4 },
+    { 441, 4 },
+    { 441, 123 },
+    { 354, 123 },
+} };
+
+static struct ComicBox block_p7_b0_boxes[] = {
+    { 2, 255, 172, 71, "       I BESEECH THEE IN AN\n   HOUR OF GREAT NEED... SEND\nDARKSHEER BACK TO US... SEND\n         HIM BACK!", "       JE T'IMPLORE DANS UN\n     MOMENT DE GRAND BESOIN...\n  RAMENE DARKSHEER PARMI NOUS...\n    NOUS AVONS BESOIN DE LUI!", "    ACUDO A TI EN ESTA HORA\n  DE NECESIDAD... ENVIANOS\n A TENEBROSO... TRAELO\n   DE REGRESO!", "       ICH BESCHW\x99""RE DICH, IN\n   DIESER STUNDE DER NOT...SCHICKE\n   UNS DARKSHEER ZUR\x9a""CK...SCHICK'\n            IHN ZUR\x9a""CK!" },
+};
+
+static struct ComicBlock block_p7_0 = { &poly_p7_b0, -1, -1, block_p7_b0_boxes, 1 };
+
+static struct Polygon poly_p7_b1 = { {
+    { 187, 0 },
+    { 451, 0 },
+    { 451, 188 },
+    { 187, 188 },
+} };
+
+static struct ComicBox block_p7_b1_boxes[] = {
+    { 4, 255, 61, 66, "     OH, GOD IN HEAVEN...", "\n         OH, DIEU DES CIEUX...", "     OH, DIOS MIO...", "\n       OH, GOTT IM HIMMEL..." },
+};
+
+static struct ComicBlock block_p7_1 = { &poly_p7_b1, -1, -1, block_p7_b1_boxes, 1 };
+
+static struct ComicBlock page_7_blocks[] = {
+    block_p7_0,
+    block_p7_1,
+};
+
+static struct ComicPage page_7 = { "DARK/COMDATA/SEPG07.SCN", 98, 59, 1, 0, page_7_blocks, 2 };
+
+const struct ComicPage *SpecialComicPages[] = {
+    &page_1,
+    &page_2,
+    &page_3,
+    &page_4,
+    &page_5,
+    &page_6,
+    &page_7,
+    NULL
+};
+
+} // end namespace Noctropolis
+
+} // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_special_comic.h b/engines/access/noctropolis/noctropolis_special_comic.h
new file mode 100644
index 00000000000..db01e39a8d5
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_special_comic.h
@@ -0,0 +1,40 @@
+/* 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 ACCESS_NOCTROPOLIS_NOCTROPOLIS_SPECIAL_COMIC_H
+#define ACCESS_NOCTROPOLIS_NOCTROPOLIS_SPECIAL_COMIC_H
+
+#include "access/resources.h"
+#include "access/polygon.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+struct ComicPage;
+
+extern const struct ComicPage *SpecialComicPages[];
+
+} // end namespace Noctropolis
+
+} // end namespace Access
+
+#endif // ACCESS_NOCTROPOLIS_NOCTROPOLIS_SPECIAL_COMIC_H


Commit: ee1d4a7f952edeedf5fc17831378c3d53d6f9df3
    https://github.com/scummvm/scummvm/commit/ee1d4a7f952edeedf5fc17831378c3d53d6f9df3
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Begin implementing Noctropolis inventory

Changed paths:
  A engines/access/amazon/amazon_inventory.cpp
  A engines/access/amazon/amazon_inventory.h
  A engines/access/martian/martian_inventory.cpp
  A engines/access/martian/martian_inventory.h
  A engines/access/noctropolis/noctropolis_inventory.h
    engines/access/access.cpp
    engines/access/amazon/amazon_game.cpp
    engines/access/inventory.cpp
    engines/access/inventory.h
    engines/access/martian/martian_game.cpp
    engines/access/module.mk
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/noctropolis/noctropolis_inventory.cpp
    engines/access/room.cpp
    engines/access/scripts.cpp


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index e1681de9aea..ceb5275e69b 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -186,7 +186,6 @@ void AccessEngine::initialize() {
 	_char = new CharManager(this);
 	_events = new EventsManager(this);
 	_files = new FileManager(this);
-	_inventory = new InventoryManager(this);
 	_player = Player::init(this);
 	_screen = new Screen(this);
 	_sound = new SoundManager(this, _mixer);
diff --git a/engines/access/amazon/amazon_game.cpp b/engines/access/amazon/amazon_game.cpp
index e82c05af6a3..84e32856315 100644
--- a/engines/access/amazon/amazon_game.cpp
+++ b/engines/access/amazon/amazon_game.cpp
@@ -24,6 +24,7 @@
 #include "access/amazon/amazon_resources.h"
 #include "access/amazon/amazon_room.h"
 #include "access/amazon/amazon_scripts.h"
+#include "access/amazon/amazon_inventory.h"
 
 namespace Access {
 
@@ -97,6 +98,7 @@ void AmazonEngine::configSelect() {
 }
 
 void AmazonEngine::initObjects() {
+	_inventory = new AmazonInventory(this);
 	_room = new AmazonRoom(this);
 	_scripts = new AmazonScripts(this);
 
diff --git a/engines/access/amazon/amazon_inventory.cpp b/engines/access/amazon/amazon_inventory.cpp
new file mode 100644
index 00000000000..d2fca70b2ac
--- /dev/null
+++ b/engines/access/amazon/amazon_inventory.cpp
@@ -0,0 +1,134 @@
+/* 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 "access/amazon/amazon_inventory.h"
+#include "access/access.h"
+#include "access/resources.h"
+
+namespace Access {
+
+namespace Amazon {
+
+AmazonInventory::AmazonInventory(AccessEngine *vm) : InventoryManager(vm) {
+}
+
+
+int AmazonInventory::displayInv() {
+	Screen &screen = *_vm->_screen;
+	EventsManager &events = *_vm->_events;
+	Room &room = *_vm->_room;
+	FileManager &files = *_vm->_files;
+
+	_invModeFlag = true;
+	_vm->_timers.saveTimers();
+
+	if (!room._tile && !_invRefreshFlag) {
+		saveScreens();
+	}
+
+	savedFields();
+	screen.setPanel(1);
+	events._cursorExitFlag = false;
+	getList();
+	initFields();
+
+	files._setPaletteFlag = false;
+	files.loadScreen(&_vm->_buffer1, 99, 0);
+	_vm->_buffer1.copyTo(&_vm->_buffer2);
+	_vm->copyBF2Vid();
+
+	// Set cells
+	Common::Array<CellIdent> cells;
+	cells.push_back(CellIdent(99, 99, 1));
+	_vm->loadCells(cells);
+
+	showAllItems();
+
+	if (!_invRefreshFlag) {
+		chooseItem();
+		if (_vm->_useItem != -1) {
+			int savedScale = _vm->_scale;
+			_vm->_scale = 153;
+			_vm->_screen->setScaleTable(_vm->_scale);
+			_vm->_buffer1.clearBuffer();
+
+			SpriteResource *spr = _vm->_objectsTable[99];
+			const SpriteFrame *frame = spr->getFrame(_vm->_useItem);
+
+			int w = screen._scaleTable1[46];
+			int h = screen._scaleTable1[35];
+			_vm->_buffer1.sPlotF(frame, Common::Rect(0, 0, w, h));
+			events.setCursorData(&_vm->_buffer1, Common::Rect(0, 0, w, h));
+
+			_vm->_scale = savedScale;
+			screen.setScaleTable(_vm->_scale);
+		}
+	}
+
+	freeInvCells();
+	screen.setPanel(0);
+	events.debounceLeft();
+
+	restoreFields();
+	screen.restorePalette();
+	// The original was testing the vesa mode too.
+	// We removed this check as we don't use pre-rendering
+	if (!_invRefreshFlag) {
+		screen.clearScreen();
+		screen.setPalette();
+	}
+
+	if (!room._tile && !_invRefreshFlag) {
+		restoreScreens();
+	} else {
+		screen.setBufferScan();
+		room.buildScreen();
+
+		// The original was doing a check on the vesa mode at this point.
+		// We don't need it as we don't do inventory pre-rendering
+		screen.fadeOut();
+		_vm->copyBF2Vid();
+	}
+
+	events._cursorExitFlag = false;
+	screen._screenChangeFlag = false;
+	_invModeFlag = false;
+	events.debounceLeft();
+	_vm->_timers.restoreTimers();
+	_vm->_startup = 1;
+
+	int result = 0;
+	if (!_invRefreshFlag) {
+		if (_vm->_useItem == -1) {
+			result = 2;
+			events.forceSetCursor(CURSOR_CROSSHAIRS);
+		} else
+			events.forceSetCursor(CURSOR_INVENTORY);
+	}
+
+	_invRefreshFlag = false;
+	_invChangeFlag = false;
+	return result;
+}
+
+} // end namespace Amazon
+
+} // end namespace Access
diff --git a/engines/access/amazon/amazon_inventory.h b/engines/access/amazon/amazon_inventory.h
new file mode 100644
index 00000000000..5e42680efa0
--- /dev/null
+++ b/engines/access/amazon/amazon_inventory.h
@@ -0,0 +1,43 @@
+/* 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 ACCESS_AMAZON_AMAZON_INVENTORY_H
+#define ACCESS_AMAZON_AMAZON_INVENTORY_H
+
+#include "access/inventory.h"
+
+namespace Access {
+
+namespace Amazon {
+
+class AmazonInventory : public InventoryManager {
+public:
+	AmazonInventory(AccessEngine *vm);
+
+	int displayInv() override;
+
+};
+
+} // end namespace Amazon
+
+} // end namespace Access
+
+#endif // ACCESS_AMAZON_AMAZON_INVENTORY_H
diff --git a/engines/access/inventory.cpp b/engines/access/inventory.cpp
index 23d9a686010..58f9a6c4683 100644
--- a/engines/access/inventory.cpp
+++ b/engines/access/inventory.cpp
@@ -112,135 +112,6 @@ void InventoryManager::refreshInventory() {
 	// }
 }
 
-int InventoryManager::newDisplayInv() {
-	Screen &screen = *_vm->_screen;
-	EventsManager &events = *_vm->_events;
-	Room &room = *_vm->_room;
-	FileManager &files = *_vm->_files;
-
-	_invModeFlag = true;
-	_vm->_timers.saveTimers();
-
-	if (!room._tile && !_invRefreshFlag) {
-		saveScreens();
-	}
-
-	savedFields();
-	screen.setPanel(1);
-	events._cursorExitFlag = false;
-	getList();
-	initFields();
-
-	files._setPaletteFlag = false;
-	files.loadScreen(&_vm->_buffer1, 99, 0);
-	_vm->_buffer1.copyTo(&_vm->_buffer2);
-	_vm->copyBF2Vid();
-
-	// Set cells
-	Common::Array<CellIdent> cells;
-	cells.push_back(CellIdent(99, 99, 1));
-	_vm->loadCells(cells);
-
-	showAllItems();
-
-	if (!_invRefreshFlag) {
-		chooseItem();
-		if (_vm->_useItem != -1) {
-			int savedScale = _vm->_scale;
-			_vm->_scale = 153;
-			_vm->_screen->setScaleTable(_vm->_scale);
-			_vm->_buffer1.clearBuffer();
-
-			SpriteResource *spr = _vm->_objectsTable[99];
-			const SpriteFrame *frame = spr->getFrame(_vm->_useItem);
-
-			int w = screen._scaleTable1[46];
-			int h = screen._scaleTable1[35];
-			_vm->_buffer1.sPlotF(frame, Common::Rect(0, 0, w, h));
-			events.setCursorData(&_vm->_buffer1, Common::Rect(0, 0, w, h));
-
-			_vm->_scale = savedScale;
-			screen.setScaleTable(_vm->_scale);
-		}
-	}
-
-	freeInvCells();
-	screen.setPanel(0);
-	events.debounceLeft();
-
-	restoreFields();
-	screen.restorePalette();
-	// The original was testing the vesa mode too.
-	// We removed this check as we don't use pre-rendering
-	if (!_invRefreshFlag) {
-		screen.clearScreen();
-		screen.setPalette();
-	}
-
-	if (!room._tile && !_invRefreshFlag) {
-		restoreScreens();
-	} else {
-		screen.setBufferScan();
-		room.buildScreen();
-
-		// The original was doing a check on the vesa mode at this point.
-		// We don't need it as we don't do inventory pre-rendering
-		screen.fadeOut();
-		_vm->copyBF2Vid();
-	}
-
-	events._cursorExitFlag = false;
-	screen._screenChangeFlag = false;
-	_invModeFlag = false;
-	events.debounceLeft();
-	_vm->_timers.restoreTimers();
-	_vm->_startup = 1;
-
-	int result = 0;
-	if (!_invRefreshFlag) {
-		if (_vm->_useItem == -1) {
-			result = 2;
-			events.forceSetCursor(CURSOR_CROSSHAIRS);
-		} else
-			events.forceSetCursor(CURSOR_INVENTORY);
-	}
-
-	_invRefreshFlag = false;
-	_invChangeFlag = false;
-	return result;
-}
-
-int InventoryManager::displayInv() {
-	size_t invSize = _vm->_res->INVENTORY.size();
-
-	Common::Array<byte> invFlags(invSize + 1);
-	Common::Array<const char *> invNames(invSize + 1);
-
-	// Only show items that are in the inventory, skip "used".
-	for (size_t i = 0; i < invSize; i++) {
-		byte flag = (_inv[i]._value == ITEM_IN_INVENTORY) ? 1 : 0;
-		invFlags[i] = flag;
-		invNames[i] = _inv[i]._name.c_str();
-	}
-	_vm->_events->forceSetCursor(CURSOR_CROSSHAIRS);
-	_vm->_invBox->getList(invNames.data(), invFlags.data());
-
-	int btnSelected = 0;
-	int boxX = _vm->_invBox->doBox_v1(_startInvItem, _startInvBox, btnSelected);
-	_startInvItem = _vm->_boxDataStart;
-	_startInvBox = _vm->_boxSelectY;
-
-	if (boxX == -1)
-		btnSelected = 2;
-
-	if (btnSelected != 2)
-		_vm->_useItem = _vm->_invBox->_tempListIdx[boxX];
-	else
-		_vm->_useItem = -1;
-
-	return 0;
-}
-
 void InventoryManager::savedFields() {
 	Screen &screen = *_vm->_screen;
 	Room &room = *_vm->_room;
diff --git a/engines/access/inventory.h b/engines/access/inventory.h
index d62e8c0c1f1..48bcc8d31a8 100644
--- a/engines/access/inventory.h
+++ b/engines/access/inventory.h
@@ -82,33 +82,27 @@ private:
 	Common::StringArray _tempLOff;
 	int _boxNum;
 
-	void savedFields();
-
-	void restoreFields();
+	int coordIndexOf() const;
 
-	void initFields();
+	void outlineIcon(int itemIndex);
 
-	void getList();
+	void combineItems();
 
-	void showAllItems();
+	void zoomIcon(int zoomItem, int backItem, int zoomBox, bool shrink);
 
 	void putInvIcon(int itemIndex, int itemId);
 
+protected:
+	void initFields();
+	void getList();
+	void saveScreens();
+	void savedFields();
+	void showAllItems();
+	void restoreFields();
 	void chooseItem();
-
 	void freeInvCells();
-
-	int coordIndexOf() const;
-
-	void saveScreens();
-
 	void restoreScreens();
 
-	void outlineIcon(int itemIndex);
-
-	void combineItems();
-
-	void zoomIcon(int zoomItem, int backItem, int zoomBox, bool shrink);
 public:
 	Common::Array<InventoryEntry> _inv;
 	int _startInvItem;
@@ -128,8 +122,7 @@ public:
 
 	void refreshInventory();
 
-	int newDisplayInv();
-	int displayInv();
+	virtual int displayInv() = 0;
 
 	/**
 	* Synchronize savegame data
diff --git a/engines/access/martian/martian_game.cpp b/engines/access/martian/martian_game.cpp
index 2eb3c2ef619..eed12924df9 100644
--- a/engines/access/martian/martian_game.cpp
+++ b/engines/access/martian/martian_game.cpp
@@ -24,6 +24,7 @@
 #include "access/martian/martian_resources.h"
 #include "access/martian/martian_room.h"
 #include "access/martian/martian_scripts.h"
+#include "access/martian/martian_inventory.h"
 #include "access/amazon/amazon_resources.h"
 
 namespace Access {
@@ -42,6 +43,7 @@ MartianEngine::~MartianEngine() {
 }
 
 void MartianEngine::initObjects() {
+	_inventory = new MartianInventory(this);
 	_room = new MartianRoom(this);
 	_scripts = new MartianScripts(this);
 }
diff --git a/engines/access/martian/martian_inventory.cpp b/engines/access/martian/martian_inventory.cpp
new file mode 100644
index 00000000000..5c2d88a4c0b
--- /dev/null
+++ b/engines/access/martian/martian_inventory.cpp
@@ -0,0 +1,66 @@
+/* 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 "access/martian/martian_inventory.h"
+#include "access/access.h"
+#include "access/resources.h"
+
+namespace Access {
+
+namespace Martian {
+
+MartianInventory::MartianInventory(AccessEngine *vm) : InventoryManager(vm) {
+}
+
+int MartianInventory::displayInv() {
+	size_t invSize = _vm->_res->INVENTORY.size();
+
+	Common::Array<byte> invFlags(invSize + 1);
+	Common::Array<const char *> invNames(invSize + 1);
+
+	// Only show items that are in the inventory, skip "used".
+	for (size_t i = 0; i < invSize; i++) {
+		byte flag = (_inv[i]._value == ITEM_IN_INVENTORY) ? 1 : 0;
+		invFlags[i] = flag;
+		invNames[i] = _inv[i]._name.c_str();
+	}
+	_vm->_events->forceSetCursor(CURSOR_CROSSHAIRS);
+	_vm->_invBox->getList(invNames.data(), invFlags.data());
+
+	int btnSelected = 0;
+	int boxX = _vm->_invBox->doBox_v1(_startInvItem, _startInvBox, btnSelected);
+	_startInvItem = _vm->_boxDataStart;
+	_startInvBox = _vm->_boxSelectY;
+
+	if (boxX == -1)
+		btnSelected = 2;
+
+	if (btnSelected != 2)
+		_vm->_useItem = _vm->_invBox->_tempListIdx[boxX];
+	else
+		_vm->_useItem = -1;
+
+	return 0;
+}
+
+} // end namespace Martian
+
+} // end namespace Access
diff --git a/engines/access/martian/martian_inventory.h b/engines/access/martian/martian_inventory.h
new file mode 100644
index 00000000000..4ac99d22afa
--- /dev/null
+++ b/engines/access/martian/martian_inventory.h
@@ -0,0 +1,43 @@
+/* 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 ACCESS_MARTIAN_MARTIAN_INVENTORY_H
+#define ACCESS_MARTIAN_MARTIAN_INVENTORY_H
+
+#include "access/inventory.h"
+
+namespace Access {
+
+namespace Martian {
+
+class MartianInventory : public InventoryManager {
+public:
+	MartianInventory(AccessEngine *vm);
+
+	int displayInv() override;
+
+};
+
+} // end namespace Martian
+
+} // end namespace Access
+
+#endif // ACCESS_MARTIAN_MARTIAN_INVENTORY_H
diff --git a/engines/access/module.mk b/engines/access/module.mk
index 7ca7924f999..e045846f7a9 100644
--- a/engines/access/module.mk
+++ b/engines/access/module.mk
@@ -23,6 +23,7 @@ MODULE_OBJS := \
 	sound.o \
 	video.o \
 	amazon/amazon_game.o \
+	amazon/amazon_inventory.o \
 	amazon/amazon_logic.o \
 	amazon/amazon_player.o \
 	amazon/amazon_resources.o \
@@ -30,6 +31,7 @@ MODULE_OBJS := \
 	amazon/amazon_scripts.o \
 	martian/martian_duct.o \
 	martian/martian_game.o \
+	martian/martian_inventory.o \
 	martian/martian_player.o \
 	martian/martian_resources.o \
 	martian/martian_room.o \
@@ -37,8 +39,9 @@ MODULE_OBJS := \
 	noctropolis/noctropolis_comicviewer.o \
 	noctropolis/noctropolis_font.o \
 	noctropolis/noctropolis_game.o \
-	noctropolis/noctropolis_player.o \
+	noctropolis/noctropolis_inventory.o \
 	noctropolis/noctropolis_last_comic.o \
+	noctropolis/noctropolis_player.o \
 	noctropolis/noctropolis_resources.o \
 	noctropolis/noctropolis_room.o \
 	noctropolis/noctropolis_scripts.o \
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 73419e39ff0..d130cae086e 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -720,7 +720,6 @@ void NoctropolisEngine::doSpecialComic() {
 }
 
 
-
 } // end namespace Noctropolis
 
 } // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index a7f7a466580..6a1cef4e0bc 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -65,6 +65,8 @@ public:
 	bool _loadFlag;
 	byte _minigameCurrentConfig[9];
 
+	Scripts *_invScript;
+
 	void doTravel();
 	void setStilettoPos();
 
@@ -93,8 +95,6 @@ private:
 	void doFlashLogo();
 	void doPublisherLogo();
 	void initVariables();
-
-	Scripts *_invScript;
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_inventory.cpp b/engines/access/noctropolis/noctropolis_inventory.cpp
index 86d6e0a40b7..1178a6caa95 100644
--- a/engines/access/noctropolis/noctropolis_inventory.cpp
+++ b/engines/access/noctropolis/noctropolis_inventory.cpp
@@ -1,51 +1,74 @@
-#include "common/array.h"
-#include "common/endian.h"
-#include "common/file.h"
-#include "common/func.h"
-#include "common/util.h"
-
-#include "access/access_noctropolis.h"
-#include "access/graphics.h"
-#include "access/resource.h"
+/* 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 "access/noctropolis/noctropolis_inventory.h"
+#include "access/access.h"
+#include "access/resources.h"
 
 namespace Access {
 
-void AccessEngine_Noctropolis::runInventory() {
+namespace Noctropolis {
+
+NoctropolisInventory::NoctropolisInventory(AccessEngine *vm) : InventoryManager(vm) {
+}
 
-	const byte kDownArrow	= 1;
-	const byte kUpArrow		= 2;
+
+int NoctropolisInventory::displayInv() {
+	int selectedItem = -1;
+	warning("TODO: finish NoctropolisInventory::displayInv");
+	/*
+	const byte kDownArrow   = 1;
+	const byte kUpArrow     = 2;
 
 	int hoveredItem = -1;
 	byte slotItems[20];
 	Common::Array<byte> items;
 	SpriteResource *inventorySprites;
 	StringResource *inventoryItemNames;
-	int selectedItem = -1;
 	GrabRect savedRect;
 	bool upArrow, downArrow;
 	uint prevInventoryTopItemIndex = -1;
 
 	if (!_keepInventoryPosition) {
 		int16 warpMouseX, warpMouseY;
-		_inventoryBaseX = clipMouseCenter(_mouseX, 252, 640, warpMouseX);
-		_inventoryBaseY = clipMouseCenter(_mouseY, 220, 400, warpMouseY);
+		_inventoryBaseX = clipMouseCenter(_vm->_events->_mousePos.x, 252, 640, warpMouseX);
+		_inventoryBaseY = clipMouseCenter(_vm->_events->_mousePos.y, 220, 400, warpMouseY);
 		_keepInventoryPosition = true;
-		if (warpMouseX != _mouseX || warpMouseY != _mouseY)
+		if (warpMouseX != _vm->_events->_mousePos.x || warpMouseY != _vm->_events->_mousePos.y)
 			_system->warpMouse(warpMouseX, warpMouseY);
 	}
 
 	// TODO: Maybe move/load these globally?
 
 	inventorySprites = new SpriteResource();
-	_res->load(inventorySprites, "INV.AP");
-	
+	_vm->_res->load(inventorySprites, "INV.AP");
+
 	inventoryItemNames = new StringResource();
-	_res->load(inventoryItemNames, GID_NOCTROPOLIS, kResStringTable, 3);
-	
+	_vm->_res->load(inventoryItemNames, GID_NOCTROPOLIS, kResStringTable, 3);
+
 	// Build the list of available inventory items
-	for (int i = 0; i < 256; i++)
+	for (int i = 0; i < 256; i++) {
 		if (getInventoryItem(i) == 1)
 			items.push_back(i);
+	}
 
 	_vgaScreen->lock();
 	// Grab screen background
@@ -58,15 +81,15 @@ void AccessEngine_Noctropolis::runInventory() {
 
 	while (selectedItem == -1) {
 
-		int x = _mouseX - _inventoryBaseX - 23;
-		int y = _mouseY - _inventoryBaseY - 26;
+		int x = _events->_mousePos.x - _inventoryBaseX - 23;
+		int y = _events->_mousePos.y - _inventoryBaseY - 26;
 
 		if (prevInventoryTopItemIndex != _inventoryTopItemIndex) {
 
 			int slotIndex = 0, slotCount = 20, skipIndex = 0;
 
 			memset(slotItems, 0, 20);
-			
+
 			prevInventoryTopItemIndex = _inventoryTopItemIndex;
 			upArrow = false;
 			downArrow = false;
@@ -105,14 +128,14 @@ void AccessEngine_Noctropolis::runInventory() {
 			_vgaScreen->unlock();
 
 		}
-		
+
 		// Support the mouse wheel for scrolling through the inventory items
 		if (upArrow && _mouseWheelDelta < 0) {
 			_inventoryTopItemIndex = MAX<int>(_inventoryTopItemIndex - 1, 0);
 		} else if (downArrow && _mouseWheelDelta > 0) {
 			_inventoryTopItemIndex = MIN<int>(_inventoryTopItemIndex + 1, items.size());
 		}
-		
+
 		if (x >= 0 && x < 205 && y >= 0 && y < 152) {
 			int slotIndex = (x / 41) + (y / 38) * 5;
 			int item = slotItems[slotIndex];
@@ -130,9 +153,9 @@ void AccessEngine_Noctropolis::runInventory() {
 
 			if (leftMouseButton()) {
 				if (item == kDownArrow)
-	 				_inventoryTopItemIndex = MIN<int>(_inventoryTopItemIndex + 1, items.size());
+					_inventoryTopItemIndex = MIN<int>(_inventoryTopItemIndex + 1, items.size());
 				else if (item == kUpArrow)
-	 				_inventoryTopItemIndex = MAX<int>(_inventoryTopItemIndex - 1, 0);
+					_inventoryTopItemIndex = MAX<int>(_inventoryTopItemIndex - 1, 0);
 				else
 					selectedItem = item;
 				waitUntilLeftButtonIsReleased();
@@ -150,8 +173,8 @@ void AccessEngine_Noctropolis::runInventory() {
 		updateScreen();
 
 	}
-	
-	setVariable(99, selectedItem);
+
+	_flags[99] = selectedItem;
 
 	// Restore screen background
 	_vgaScreen->lock();
@@ -160,7 +183,12 @@ void AccessEngine_Noctropolis::runInventory() {
 
 	delete inventorySprites;
 	delete inventoryItemNames;
-	
-}
+	*/
 
+	return selectedItem;
 }
+
+
+} // end namespace Noctropolis
+
+} // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_inventory.h b/engines/access/noctropolis/noctropolis_inventory.h
new file mode 100644
index 00000000000..88b98e5d392
--- /dev/null
+++ b/engines/access/noctropolis/noctropolis_inventory.h
@@ -0,0 +1,42 @@
+/* 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 ACCESS_NOCTROPOLIS_NOCTROPOLIS_INVENTORY_H
+#define ACCESS_NOCTROPOLIS_NOCTROPOLIS_INVENTORY_H
+
+#include "access/inventory.h"
+
+namespace Access {
+
+namespace Noctropolis {
+
+class NoctropolisInventory : public InventoryManager {
+public:
+	NoctropolisInventory(AccessEngine *vm);
+
+	int displayInv() override;
+};
+
+} // end namespace Noctropolis
+
+} // end namespace Access
+
+#endif // ACCESS_NOCTROPOLIS_NOCTROPOLIS_INVENTORY_H
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 6eb513fb4dc..08a47eda2f2 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -796,7 +796,7 @@ void Room::executeCommand(int commandId) {
 			break;
 		case 4:
 			events.setCursor(CURSOR_ARROW);
-			if (_vm->_inventory->newDisplayInv() == 2) {
+			if (_vm->_inventory->displayInv() == 2) {
 				commandOff();
 				return;
 			}
@@ -820,17 +820,19 @@ void Room::executeCommand(int commandId) {
 		assert(_vm->getGameID() == kGameNoctropolis);
 		// See the code in NoctRoomEngine::afterDoCommandsTick
 		if (commandId == Noctropolis::kNoctCmdInventory) {
-			/*
 			while (!_vm->shouldQuitOrRestart()) {
-				runInventory();
+				Noctropolis::NoctropolisEngine *vm = (Noctropolis::NoctropolisEngine *)_vm;
+				vm->_inventory->displayInv();
 				//debug("getVariable(99) = %d", getVariable(99));
-				if (getVariable(99) == 62) {
-					runComicSpecialIssue();
-				} else if (getVariable(99) != 255) {
-					_inventoryScript->runLabel(getVariable(99));
+				if (_vm->_flags[99] == 62) {
+					vm->doSpecialComic();
+				} else if (_vm->_flags[99] != 255) {
+					vm->_invScript->_sequence = _vm->_flags[99];
+					vm->_invScript->searchForSequence();
+					vm->_invScript->executeScript();
 				} else
 					break;
-			}*/
+			}
 			warning("TODO: Implement Noctropolis inventory");
 		} else {
 			if (_vm->_exitBox)
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index ddad15167c7..75415712625 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -760,7 +760,7 @@ void Scripts::cmdDispInv_v1() {
 
 void Scripts::cmdDispInv_v2() {
 	debugC(1, kDebugScripts, "cmdDispInv_v2()");
-	_vm->_inventory->newDisplayInv();
+	_vm->_inventory->displayInv();
 	_vm->_events->forceSetCursor(CURSOR_ARROW);
 }
 


Commit: dba98d86d5319f0f79efa976bdcd039ae1ce1903
    https://github.com/scummvm/scummvm/commit/dba98d86d5319f0f79efa976bdcd039ae1ce1903
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Implement Noctropolis inventory

Changed paths:
    engines/access/amazon/amazon_inventory.cpp
    engines/access/events.cpp
    engines/access/events.h
    engines/access/inventory.cpp
    engines/access/inventory.h
    engines/access/martian/martian_inventory.cpp
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_inventory.cpp
    engines/access/noctropolis/noctropolis_inventory.h
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/room.cpp


diff --git a/engines/access/amazon/amazon_inventory.cpp b/engines/access/amazon/amazon_inventory.cpp
index d2fca70b2ac..b5e47238a5c 100644
--- a/engines/access/amazon/amazon_inventory.cpp
+++ b/engines/access/amazon/amazon_inventory.cpp
@@ -64,7 +64,7 @@ int AmazonInventory::displayInv() {
 
 	if (!_invRefreshFlag) {
 		chooseItem();
-		if (_vm->_useItem != -1) {
+		if (useItem() != -1) {
 			int savedScale = _vm->_scale;
 			_vm->_scale = 153;
 			_vm->_screen->setScaleTable(_vm->_scale);
@@ -117,7 +117,7 @@ int AmazonInventory::displayInv() {
 
 	int result = 0;
 	if (!_invRefreshFlag) {
-		if (_vm->_useItem == -1) {
+		if (useItem() == -1) {
 			result = 2;
 			events.forceSetCursor(CURSOR_CROSSHAIRS);
 		} else
diff --git a/engines/access/events.cpp b/engines/access/events.cpp
index 1e6d08bfcca..d8445b562b4 100644
--- a/engines/access/events.cpp
+++ b/engines/access/events.cpp
@@ -401,4 +401,21 @@ void EventsManager::restrictMouse() {
 	// No implementation in ScummVM
 }
 
+/*static*/
+int16 EventsManager::clipMouseCenter(int16 mousePos, int16 length, int16 maxLength, int16 &warpMousePos) {
+	int16 basePos;
+	if (mousePos - (length / 2) < 0) {
+		basePos = 0;
+		warpMousePos = length / 2;
+	} else if (mousePos + length >= maxLength) {
+		basePos = maxLength - length;
+		warpMousePos = maxLength - (length / 2);
+	} else {
+		basePos = mousePos - (length / 2);
+		warpMousePos = mousePos;
+	}
+	return basePos;
+}
+
+
 } // End of namespace Access
diff --git a/engines/access/events.h b/engines/access/events.h
index 8166afb8593..eba6f724c11 100644
--- a/engines/access/events.h
+++ b/engines/access/events.h
@@ -173,6 +173,8 @@ public:
 	void centerMousePos();
 	void restrictMouse();
 
+	static int16 clipMouseCenter(int16 mousePos, int16 length, int16 maxLength, int16 &warpMousePos);
+
 	/* get ms delay before considering something a double-click */
 	uint32 getDoubleClickTime() const;
 };
diff --git a/engines/access/inventory.cpp b/engines/access/inventory.cpp
index 58f9a6c4683..a5cdef8cbfd 100644
--- a/engines/access/inventory.cpp
+++ b/engines/access/inventory.cpp
@@ -94,7 +94,7 @@ int &InventoryManager::operator[](int idx) {
 	return (idx >= (int)_inv.size()) ? invalid : _inv[idx]._value;
 }
 
-int InventoryManager::useItem() {
+int InventoryManager::useItem() const {
 	return _vm->_useItem;
 }
 
@@ -218,7 +218,7 @@ void InventoryManager::putInvIcon(int itemIndex, int itemId) {
 
 void InventoryManager::chooseItem() {
 	EventsManager &events = *_vm->_events;
-	_vm->_useItem = -1;
+	setUseItem(-1);
 
 	while (!_vm->shouldQuit()) {
 		// Check for events
@@ -231,7 +231,7 @@ void InventoryManager::chooseItem() {
 
 		if (selIndex > 23) {
 			if (selIndex == 25)
-				_vm->_useItem = -1;
+				setUseItem(-1);
 			break;
 		} else if (selIndex < (int)_items.size() && _items[selIndex] != -1) {
 			_boxNum = selIndex;
@@ -239,7 +239,7 @@ void InventoryManager::chooseItem() {
 			combineItems();
 			_vm->copyBF2Vid();
 			outlineIcon(_boxNum);
-			_vm->_useItem = _items[_boxNum];
+			setUseItem(_items[_boxNum]);
 		}
 	}
 }
diff --git a/engines/access/inventory.h b/engines/access/inventory.h
index 48bcc8d31a8..43302e4476e 100644
--- a/engines/access/inventory.h
+++ b/engines/access/inventory.h
@@ -72,7 +72,6 @@ class InventoryManager : public Manager {
 		SavedFields();
 	};
 private:
-	Common::Array<int> _items;
 	Common::Array<Common::Rect> _invCoords;
 	ASurface _savedBuffer1;
 	ASurface _savedScreen;
@@ -103,6 +102,8 @@ protected:
 	void freeInvCells();
 	void restoreScreens();
 
+	Common::Array<int> _items;
+
 public:
 	Common::Array<InventoryEntry> _inv;
 	int _startInvItem;
@@ -117,7 +118,7 @@ public:
 
 	int &operator[](int idx);
 
-	int useItem();
+	int useItem() const;
 	void setUseItem(int itemId);
 
 	void refreshInventory();
diff --git a/engines/access/martian/martian_inventory.cpp b/engines/access/martian/martian_inventory.cpp
index 5c2d88a4c0b..f5af4517734 100644
--- a/engines/access/martian/martian_inventory.cpp
+++ b/engines/access/martian/martian_inventory.cpp
@@ -54,9 +54,9 @@ int MartianInventory::displayInv() {
 		btnSelected = 2;
 
 	if (btnSelected != 2)
-		_vm->_useItem = _vm->_invBox->_tempListIdx[boxX];
+		setUseItem(_vm->_invBox->_tempListIdx[boxX]);
 	else
-		_vm->_useItem = -1;
+		setUseItem(-1);
 
 	return 0;
 }
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index c642a10e206..d62059ec40d 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -151,7 +151,7 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 
 		if (_vm->_events->_rightButton) {
 			result = kPageResultExit;
-			_vm->_events->debounceLeft();
+			_vm->_events->debounceRight();
 		}
 
 		_vm->_events->delay();
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index d130cae086e..84a703db6e4 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -24,6 +24,7 @@
 #include "access/noctropolis/noctropolis_scripts.h"
 #include "access/noctropolis/noctropolis_resources.h"
 #include "access/noctropolis/noctropolis_comicviewer.h"
+#include "access/noctropolis/noctropolis_inventory.h"
 #include "image/png.h"
 #include "graphics/color_quantizer.h"
 #include "common/config-manager.h"
@@ -47,6 +48,7 @@ void NoctropolisEngine::initObjects() {
 	_room = new NoctropolisRoom(this);
 	_scripts = new NoctropolisScripts(this);
 	_invScript = new NoctropolisScripts(this);
+	_inventory = new NoctropolisInventory(this);
 	_stil = new Player(this);
 
 	const Common::FSNode gameDataDir(ConfMan.getPath("path"));
diff --git a/engines/access/noctropolis/noctropolis_inventory.cpp b/engines/access/noctropolis/noctropolis_inventory.cpp
index 1178a6caa95..1334b2a5e4d 100644
--- a/engines/access/noctropolis/noctropolis_inventory.cpp
+++ b/engines/access/noctropolis/noctropolis_inventory.cpp
@@ -22,118 +22,117 @@
 #include "access/noctropolis/noctropolis_inventory.h"
 #include "access/access.h"
 #include "access/resources.h"
+#include "access/asurface.h"
 
 namespace Access {
 
 namespace Noctropolis {
 
-NoctropolisInventory::NoctropolisInventory(AccessEngine *vm) : InventoryManager(vm) {
+NoctropolisInventory::NoctropolisInventory(AccessEngine *vm) : InventoryManager(vm),
+_keepInventoryPosition(false), _topItemIndex(0) {
 }
 
 
 int NoctropolisInventory::displayInv() {
 	int selectedItem = -1;
-	warning("TODO: finish NoctropolisInventory::displayInv");
-	/*
+
 	const byte kDownArrow   = 1;
 	const byte kUpArrow     = 2;
 
 	int hoveredItem = -1;
 	byte slotItems[20];
-	Common::Array<byte> items;
 	SpriteResource *inventorySprites;
-	StringResource *inventoryItemNames;
-	GrabRect savedRect;
 	bool upArrow, downArrow;
-	uint prevInventoryTopItemIndex = -1;
+	int prevTopItemIndex = -1;
+
+	Screen *screen = _vm->_screen;
+
+	setUseItem(-1);
 
 	if (!_keepInventoryPosition) {
 		int16 warpMouseX, warpMouseY;
-		_inventoryBaseX = clipMouseCenter(_vm->_events->_mousePos.x, 252, 640, warpMouseX);
-		_inventoryBaseY = clipMouseCenter(_vm->_events->_mousePos.y, 220, 400, warpMouseY);
+		_inventoryBase.x = _vm->_events->clipMouseCenter(_vm->_events->_mousePos.x, 252, 640, warpMouseX);
+		_inventoryBase.y = _vm->_events->clipMouseCenter(_vm->_events->_mousePos.y, 220, 400, warpMouseY);
 		_keepInventoryPosition = true;
 		if (warpMouseX != _vm->_events->_mousePos.x || warpMouseY != _vm->_events->_mousePos.y)
-			_system->warpMouse(warpMouseX, warpMouseY);
+			g_system->warpMouse(warpMouseX, warpMouseY);
 	}
 
 	// TODO: Maybe move/load these globally?
-
-	inventorySprites = new SpriteResource();
-	_vm->_res->load(inventorySprites, "INV.AP");
-
-	inventoryItemNames = new StringResource();
-	_vm->_res->load(inventoryItemNames, GID_NOCTROPOLIS, kResStringTable, 3);
+	Resource *iconData = _vm->_files->loadRawFile("INV.AP");
+	inventorySprites = new SpriteResource(_vm, iconData);
+	delete iconData;
 
 	// Build the list of available inventory items
-	for (int i = 0; i < 256; i++) {
-		if (getInventoryItem(i) == 1)
-			items.push_back(i);
-	}
+	getList();
 
-	_vgaScreen->lock();
 	// Grab screen background
-	_vgaScreen->saveRect(savedRect, _inventoryBaseX, _inventoryBaseY, 252, 220);
+	screen->saveBlock(Common::Rect(_inventoryBase, 252, 220));
+
 	// Draw inventory panel
-	_vgaScreen->drawSprite(_icons, 0, _inventoryBaseX, _inventoryBaseY);
-	_vgaScreen->unlock();
+	screen->plotImage(_vm->getIcons(), 0, _inventoryBase);
+
+	const Font *font = _vm->_fonts.getFont(1);
 
-	prevInventoryTopItemIndex = -1;
+	const int itemXOff = (_vm->getLanguage() == Common::DE_DEU ? 60 : 66);
 
-	while (selectedItem == -1) {
+	// TODO: Check these colours.
+	Font::_fontColors[0] = 246;
+	Font::_fontColors[1] = 238;
 
-		int x = _events->_mousePos.x - _inventoryBaseX - 23;
-		int y = _events->_mousePos.y - _inventoryBaseY - 26;
+	while (selectedItem == -1 && !_vm->shouldQuitOrRestart()) {
+		int x = _vm->_events->_mousePos.x - _inventoryBase.x - 23;
+		int y = _vm->_events->_mousePos.y - _inventoryBase.y - 26;
 
-		if (prevInventoryTopItemIndex != _inventoryTopItemIndex) {
+		if (prevTopItemIndex != _topItemIndex) {
 
 			int slotIndex = 0, slotCount = 20, skipIndex = 0;
 
 			memset(slotItems, 0, 20);
 
-			prevInventoryTopItemIndex = _inventoryTopItemIndex;
+			prevTopItemIndex = _topItemIndex;
 			upArrow = false;
 			downArrow = false;
 
-			if (_inventoryTopItemIndex > 0) {
+			if (_startInvItem > 0) {
 				upArrow = true;
 				slotItems[slotIndex++] = kUpArrow;
 				slotCount--;
 				skipIndex = 1;
 			}
 
-			if (_inventoryTopItemIndex + slotCount + skipIndex < items.size()) {
+			if (_topItemIndex + slotCount + skipIndex < (int)_items.size()) {
 				downArrow = true;
 				slotItems[19] = kDownArrow;
 				slotCount--;
 			} else {
-				slotCount = items.size() - _inventoryTopItemIndex - skipIndex;
+				slotCount = _items.size() - _topItemIndex - skipIndex;
 			}
 
 			for (int i = 0; i < slotCount; i++)
-				slotItems[slotIndex++] = items[skipIndex + _inventoryTopItemIndex + i];
+				slotItems[slotIndex++] = _items[skipIndex + _topItemIndex + i];
 
-			_vgaScreen->lock();
 			for (int slotNum = 0; slotNum < 20; slotNum++) {
 				int spriteIndex = slotItems[slotNum];
 				if (spriteIndex > 2)
 					spriteIndex++;
-				uint16 slotX = _inventoryBaseX + 23 + (slotNum % 5) * 41;
-				uint16 slotY = _inventoryBaseY + 26 + (slotNum / 5) * 38;
-				_vgaScreen->drawSprite(inventorySprites, 3, slotX, slotY); // draw empty slot
-				slotX += 20 - inventorySprites->getSprite(spriteIndex)->width / 2;
-				slotY += MAX(0, 38 - inventorySprites->getSprite(spriteIndex)->height) / 2;
-				_vgaScreen->drawSprite(inventorySprites, spriteIndex, slotX, slotY);
-				//_vgaScreen->drawText(_fonts[1], (const byte*)Common::String::format("%d", spriteIndex).c_str(), slotX, slotY, 238, 246, kFontBackground);
+				uint16 slotX = _inventoryBase.x + 23 + (slotNum % 5) * 41;
+				uint16 slotY = _inventoryBase.y + 26 + (slotNum / 5) * 38;
+				screen->plotImage(inventorySprites, 3, Common::Point(slotX, slotY)); // draw empty slot
+				slotX += 20 - inventorySprites->getFrame(spriteIndex)->w / 2;
+				slotY += MAX(0, 38 - inventorySprites->getFrame(spriteIndex)->h) / 2;
+				const Common::Point slotPt(slotX, slotY);
+				screen->plotImage(inventorySprites, spriteIndex, slotPt);
+				font->drawString(screen, Common::String::format("%d", spriteIndex), slotPt);
 			}
-			_vgaScreen->unlock();
 
 		}
 
 		// Support the mouse wheel for scrolling through the inventory items
-		if (upArrow && _mouseWheelDelta < 0) {
-			_inventoryTopItemIndex = MAX<int>(_inventoryTopItemIndex - 1, 0);
-		} else if (downArrow && _mouseWheelDelta > 0) {
-			_inventoryTopItemIndex = MIN<int>(_inventoryTopItemIndex + 1, items.size());
+		if (upArrow && _vm->_events->_wheelUp) {
+			_startInvItem = MAX<int>(_topItemIndex - 1, 0);
+		} else if (downArrow && _vm->_events->_wheelDown) {
+			_startInvItem = MIN<int>(_topItemIndex + 1, _items.size());
 		}
 
 		if (x >= 0 && x < 205 && y >= 0 && y < 152) {
@@ -143,47 +142,44 @@ int NoctropolisInventory::displayInv() {
 			if (hoveredItem != item) {
 				//debug("slotIndex = %d; item = %d", slotIndex, item);
 				hoveredItem = item;
-				_vgaScreen->lock();
-				_vgaScreen->fillRect(_inventoryBaseX + 66, _inventoryBaseY + 184, _inventoryBaseX + 66 + 146, _inventoryBaseY + 184 + 8, 246);
+				const Common::Point itemBase = Common::Point(_inventoryBase.x + itemXOff, _inventoryBase.y + 184);
+				screen->fillRect(Common::Rect(itemBase, 146, 8), 246);
 				if (item != 0) {
-					_vgaScreen->drawText(_fonts[1], inventoryItemNames->getString(item), _inventoryBaseX + 66, _inventoryBaseY + 184, 238, 246, kFontBackground);
+					font->drawString(screen, _inv[item]._name, itemBase);
 				}
-				_vgaScreen->unlock();
 			}
 
-			if (leftMouseButton()) {
+			if (_vm->_events->_leftButton) {
 				if (item == kDownArrow)
-					_inventoryTopItemIndex = MIN<int>(_inventoryTopItemIndex + 1, items.size());
+					_topItemIndex = MIN<int>(_topItemIndex + 1, _items.size());
 				else if (item == kUpArrow)
-					_inventoryTopItemIndex = MAX<int>(_inventoryTopItemIndex - 1, 0);
-				else
+					_topItemIndex = MAX<int>(_topItemIndex - 1, 0);
+				else if (item)
 					selectedItem = item;
-				waitUntilLeftButtonIsReleased();
+				_vm->_events->debounceLeft();
 			}
 
 		}
 
-		if (rightMouseButton()) {
-			selectedItem = 255;
-			waitUntilRightButtonIsReleased();
+		if (_vm->_events->_rightButton) {
+			selectedItem = -1;
+			_vm->_events->debounceRight();
 			_keepInventoryPosition = false;
+			break;
 		}
 
-		updateEvents();
-		updateScreen();
-
+		_vm->_events->pollEventsAndWait();
 	}
 
-	_flags[99] = selectedItem;
+	if (selectedItem == 0)
+		selectedItem = -1;
+
+	setUseItem(selectedItem);
 
 	// Restore screen background
-	_vgaScreen->lock();
-	_vgaScreen->restoreRect(savedRect);
-	_vgaScreen->unlock();
+	_vm->_screen->restoreBlock();
 
 	delete inventorySprites;
-	delete inventoryItemNames;
-	*/
 
 	return selectedItem;
 }
diff --git a/engines/access/noctropolis/noctropolis_inventory.h b/engines/access/noctropolis/noctropolis_inventory.h
index 88b98e5d392..fe3fc3bd765 100644
--- a/engines/access/noctropolis/noctropolis_inventory.h
+++ b/engines/access/noctropolis/noctropolis_inventory.h
@@ -33,6 +33,13 @@ public:
 	NoctropolisInventory(AccessEngine *vm);
 
 	int displayInv() override;
+
+private:
+	bool _keepInventoryPosition;
+
+	Common::Point _inventoryBase;
+
+	int _topItemIndex;
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 35b77cfddad..f1f98b7be5a 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -1781,6 +1781,18 @@ static const byte CURSOR_10_DATA[] = {
 };
 
 
+static const char *INVNAMES[4][76] = {
+{" ", "      MORE ITEMS", "      MORE ITEMS", "      FENCE SPIRE", "     SILVER TOKEN", "      GOLD TOKEN", "       NOTICES", "     TICKET STUB", "    DIVORCE PAPERS", "       POSTCARD", "    BANK STATEMENT", "    LOTTERY LETTER", "       NEWSPAPER", "     BUTTER KNIFE", "         WIRE", "       DETONATOR", "PLASTIC EXPLOSIVE STATUE", "        CHALICE", "       COFFIN KEY", "         BILLS", "     SCRAP OF LACE", "         NOTE", "         DIARY", "   LIQUIDARK GRENADE", "       NEWSPAPERS", "   DARKSHEER HISTORY", "      GLASS CUTTER", "     SHARD OF GLASS", "       CLIPBOARD", "     ELEVATOR PASS", "         CLOCK", "  QUICKGROW SOLUTION", "         BONE", "     SACK OF SEEDS", "    THROWING KNIVES", "      MAGIC WAND", "      SCREWDRIVER", "       LOG BOOK", "        OIL CAN", "          LENS", "       MAKEUP KIT", "        JEWELRY", "        HAMMER", "        CHISEL", "    BUTCHER KNIFE", "      MEAT HOOK", "        BEAKER", "         ACID", "     VALVE WHEEL", "         ROPE", "        RE-BAR", "         NET", "         RAT", "         FORK", "         MATCH", "         PAINT", "      PAINT BRUSH", "        PEPPER", "      DENTAL PICK", "         SPEAR", "       EGG SACK", "       DIAMOND", "        COMIC", "          WEB", "   WROUGHT IRON SHAFT", "   CHALICE WITH WATER", "      BROKEN CHAIR", "       SAUSAGE", "        POSTER", "        BRICK", "      NOCTROGLYPH", "       DUCT TAPE", "         BROOM", "        OIL LAMP", "     BROOM AND HOOK", "    ROPE AND SAUSAGE"},
+{" ", "      AUTRES OBJETS", "      AUTRES OBJETS", "      MONTANT DE GRILLE", "     PIECE D'ARGENT", "      PIECE D'OR", "       AVERTISSEMENTS", "     SOUCHE DE TICKET", "    PAPIERS DE DIVORCE", "    CARTE POSTALE", "    RELEVE BANCAIRE", "    LETTRE DU CONCOURS", "       JOURNAL", "     COUTEAU A BEURRE", "         CABLE", "       DETONATEUR", "STATUETTE EXPLOSIVE", "        CALICE", "   CLEF DE CERCUEIL", "      FACTURES", " MORCEAU DE DENTELLE", "       MESSAGE", "      JOURNAL", "  GRENADE DE LIQUIDARK", "       JOURNAL", " HISTOIRE DE DARKSHEER", "      DIAMANT A VITRES", "     ECLAT DE VERRE", "       BLOC-NOTES", "  CARTE MAGNETIQUE", "         REVEIL", "  ENGRAIS MIRACLE", "         MACHOIRE", "     SAC DE GRAINES", "    COUTEAUX", "  BAGUETTE MAGIQUE", "     TOURNEVIS", "     JOURNAL", "       HUILE", "       LENTILLE", " TROUSSE DE MAQUILLAGE", "      BIJOUX", "      MARTEAU", "       BURIN", "   COUTEAU DE BOUCHER", "     CROCHET A VIANDE", "        FIOLE", "         ACIDE", "     VANNE", "         CORDE", "      FER A BETON", "        FILET", "         RAT", "      FOURCHETTE", "      ALLUMETTE", "         PEINTURE", "      PINCEAU", "        POIVRE", "      CURE-DENTS", "        LANCE", "       OEUFS", "       DIAMANT", "   BANDE DESSINEE", "        TOILE", "   TIGE D'ACIER ROUILLEE", "   CALICE PLEIN D'EAU", "      CHAISE CASSEE", "       SAUCISSE", "       AFFICHE", "        BRIQUE", "      NOCTROGLYPHE", "       TEFLON", "         BALAI", "      LAMPE A HUILE", "     BALAI ET CROCHET", "    CORDE ET SAUCISSE"},
+{" ", "      MAS OBJETOS", "      MAS OBJETOS", "  HIERRO DE VERJA", "  MONEDA PLATEADA", "   MONEDA DORADA", "         NOTAS", "     COMPROBANTE", " DEMANDA DE DIVORCIO", "         POSTAL", "   CARTA DEL BANCO", " CARTA DE LA LOTERIA", "      PERIODICO", " CUCHILLO MANTEQUILLA", "      ALAMBRE", "       DETONADOR", "ESTATUA EXPLOSIVA", "        CALIZ", "   LLAVE DE ATAUD", "      FACTURAS", "  TIRA DE ENCAJE", "         NOTA", "         DIARIO", "  GRANADA DE LIQUIOSCURO", "      PERIODICOS", "  TRATADO DE TINIEBLAS", "  CORTADOR DE CRISTAL", "   PEDAZO DE CRISTAL", "     PORTAPAPELES", "  PASE DE ELEVADOR", "         RELOJ", " SOLUCION DE CRECIMIENTO", "        HUESO", "        SEMILLAS", " CUCHILLOS ARROJADIZOS", "     VARA MAGICA", "    DESTORNILLADOR", "       REGISTRO", "  LATA DE ACEITE", "         LENTE", "      MAQUILLAJE", "          JOYAS", "      MARTILLO", "        CINCEL", " CUCHILLO DE CARNE", "  GANCHO DE CARNE", "         JARRA", "        ACIDO", " RUEDA DE VALVULA", "         SOGA", "      PALANCA", "         RED", "        RATA", "      TENEDOR", "       CERILLA", "      PINTURA", "        BROCHA", "      PIMIENTA", "     PICO DENTAL", "         LANZA", "  SACO DE HUEVOS", "       DIAMANTE", "        COMIC", "         TELA", "   ASTA DE HIERRO", "   CALIZ CON AGUA", "     SILLA ROTA", "    SALCHICHA", "        CARTEL", "     LADRILLO", "      NOCTROGLIFO", " CINTA ADHESIVA", "        ESCOBA", " LAMPARA DE ACEITE", "  ESCOBA CON GANCHO", "  SOGA CON SALCHICHA"},
+{" ", "  WEITERE GEGENST\x8E""NDE", "  WEITERE GEGENST\x8E""NDE", "      ZAUNSTREBE", "   SILBERNES SYMBOL", "   GOLDENES SYMBOL", "       MAHNUNGEN", "     LOSABSCHNITT", "  SCHEIDUNGSPAPIERE", "      POSTKARTE", "     KONTOAUSZUG", "   WETTBEWERBSBRIEF", "       ZEITUNG", "    BUTTERMESSER", "        KABEL", "       Z\x9A""NDER", "STATUE AUS PLASTIKSPRENGSTOFF", "       KELCH", "   SARGSCHL\x9A""SSEL", "     RECHNUNGEN", "       SPITZE", "       ZETTEL", "      TAGEBUCH", "   DUSTER\x99""L-GRANATE", "      ZEITUNG", "DIE GESCHICHTE VON DARKSHEER", "   GLASSCHNEIDER", "      SCHERBE", "     KLEMMBRETT", "     MAGNETKARTE", "       WECKER", "  WUCHSBESCHLEUNIGER", "       KNOCHEN", "     SAMENBEUTEL", "      WURFMESSER", "      ZAUBERSTAB", "   SCHRAUBENDREHER", "       LOGBUCH", "      \x99""LK\x8E""NNCHEN", "        LINSE", "     SCHMINKSET", "        SCHMUCK", "        HAMMER", "        MEISSEL", "        MESSER", "    FLEISCHERHAKEN", "       MESSBECHER", "        S\x8E""URE", "    VENTILSTELLRAD", "         SEIL", "     MONIEREISEN", "         NETZ", "        RATTE", "        GABEL", "     STREICHHOLZ", "         LACK", "        PINSEL", "        PFEFFER", "      ZAHNSTOCHER", "         SPEER", "       EIERSACK", "        DIAMANT", "        COMIC", "         NETZ", "  SCHMIEDEEISERNE STANGE", "    KELCH MIT WASSER", "      STUHLTR\x9A""MMER", "       W\x9A""RSTCHEN", "        PLAKAT", "        ZIEGEL", "      NOCTROGLYPH", "      ISOLIERBAND", "         BESEN", "        \x99""LLAMPE", "     STIEL MIT HAKEN", "    SEIL MIT W\x9A""RSTCHEN"},
+};
+
+
+
+
+
+
 ///////////////////////////////////////////////////////////////
 
 NoctropolisResources::NoctropolisResources(AccessEngine *_vm) : Resources(_vm), _fontChaleteu(nullptr), _fontSystemeu(nullptr),
@@ -1843,17 +1855,17 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	_vm->_fonts._font2 = _fontSystemeu;
 
 	// Set up the room data
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_02, ARRAYSIZE(ROOMDATA_02))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_03, ARRAYSIZE(ROOMDATA_03))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_04, ARRAYSIZE(ROOMDATA_04))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_11, ARRAYSIZE(ROOMDATA_11))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_12, ARRAYSIZE(ROOMDATA_12))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_13, ARRAYSIZE(ROOMDATA_13))}));
@@ -1862,13 +1874,13 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_16, ARRAYSIZE(ROOMDATA_16))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_17, ARRAYSIZE(ROOMDATA_17))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_18, ARRAYSIZE(ROOMDATA_18))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_20, ARRAYSIZE(ROOMDATA_20))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_22, ARRAYSIZE(ROOMDATA_22))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_24, ARRAYSIZE(ROOMDATA_24))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_26, ARRAYSIZE(ROOMDATA_26))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_27, ARRAYSIZE(ROOMDATA_27))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_28, ARRAYSIZE(ROOMDATA_28))}));
@@ -1879,18 +1891,18 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_33, ARRAYSIZE(ROOMDATA_33))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_34, ARRAYSIZE(ROOMDATA_34))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_35, ARRAYSIZE(ROOMDATA_35))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_37, ARRAYSIZE(ROOMDATA_37))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_38, ARRAYSIZE(ROOMDATA_38))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_39, ARRAYSIZE(ROOMDATA_39))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_41, ARRAYSIZE(ROOMDATA_41))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_42, ARRAYSIZE(ROOMDATA_42))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_43, ARRAYSIZE(ROOMDATA_43))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_44, ARRAYSIZE(ROOMDATA_44))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_45, ARRAYSIZE(ROOMDATA_45))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_46, ARRAYSIZE(ROOMDATA_46))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_48, ARRAYSIZE(ROOMDATA_48))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_49, ARRAYSIZE(ROOMDATA_49))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_50, ARRAYSIZE(ROOMDATA_50))}));
@@ -1899,7 +1911,7 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_53, ARRAYSIZE(ROOMDATA_53))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_54, ARRAYSIZE(ROOMDATA_54))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_55, ARRAYSIZE(ROOMDATA_55))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_57, ARRAYSIZE(ROOMDATA_57))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_58, ARRAYSIZE(ROOMDATA_58))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_59, ARRAYSIZE(ROOMDATA_59))}));
@@ -1909,7 +1921,7 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_63, ARRAYSIZE(ROOMDATA_63))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_64, ARRAYSIZE(ROOMDATA_64))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_65, ARRAYSIZE(ROOMDATA_65))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_67, ARRAYSIZE(ROOMDATA_67))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_68, ARRAYSIZE(ROOMDATA_68))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_69, ARRAYSIZE(ROOMDATA_69))}));
@@ -1918,20 +1930,20 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_72, ARRAYSIZE(ROOMDATA_72))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_73, ARRAYSIZE(ROOMDATA_73))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_74, ARRAYSIZE(ROOMDATA_74))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_81, ARRAYSIZE(ROOMDATA_81))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_82, ARRAYSIZE(ROOMDATA_82))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_85, ARRAYSIZE(ROOMDATA_85))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_86, ARRAYSIZE(ROOMDATA_86))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_87, ARRAYSIZE(ROOMDATA_87))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_89, ARRAYSIZE(ROOMDATA_89))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_90, ARRAYSIZE(ROOMDATA_90))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_91, ARRAYSIZE(ROOMDATA_91))}));
@@ -1941,8 +1953,8 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_95, ARRAYSIZE(ROOMDATA_95))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_96, ARRAYSIZE(ROOMDATA_96))}));
 	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>(ROOMDATA_97, ARRAYSIZE(ROOMDATA_97))}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
-	ROOMTBL.push_back(RoomEntry({"", Common::Point(), Common::Array<byte>()}));
+	ROOMTBL.push_back(RoomEntry());
+	ROOMTBL.push_back(RoomEntry());
 
 	// Load the menu polys
 	int i = 0;
@@ -1957,6 +1969,20 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 		}
 		_menus.push_back(poly);
 	}
+
+	// Fill out the inventory
+	const Common::Language lang = _vm->getLanguage();
+	INVENTORY.resize(ARRAYSIZE(INVNAMES[0]));
+	for (int i = 0; i < ARRAYSIZE(INVNAMES[0]); i++) {
+		switch (lang) {
+		case Common::EN_ANY: INVENTORY[i]._desc = INVNAMES[0][i]; break;
+		case Common::FR_FRA: INVENTORY[i]._desc = INVNAMES[1][i]; break;
+		case Common::ES_ESP: INVENTORY[i]._desc = INVNAMES[2][i]; break;
+		case Common::DE_DEU: INVENTORY[i]._desc = INVNAMES[3][i]; break;
+		default: error("Unsupported language for response title");
+		}
+		memset(INVENTORY[i]._combo, 0, sizeof(INVENTORY[i]._combo));
+	}
 }
 
 int NoctropolisResources::menuAt(int16 x, int16 y) const {
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 08a47eda2f2..178089a313c 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -824,10 +824,10 @@ void Room::executeCommand(int commandId) {
 				Noctropolis::NoctropolisEngine *vm = (Noctropolis::NoctropolisEngine *)_vm;
 				vm->_inventory->displayInv();
 				//debug("getVariable(99) = %d", getVariable(99));
-				if (_vm->_flags[99] == 62) {
+				if (_vm->_useItem == 62) {
 					vm->doSpecialComic();
-				} else if (_vm->_flags[99] != 255) {
-					vm->_invScript->_sequence = _vm->_flags[99];
+				} else if (_vm->_useItem != -1) {
+					vm->_invScript->_sequence = _vm->_inventory->useItem();
 					vm->_invScript->searchForSequence();
 					vm->_invScript->executeScript();
 				} else


Commit: b3c3e6773c4862cb871f16b634bf50d824fa7e49
    https://github.com/scummvm/scummvm/commit/b3c3e6773c4862cb871f16b634bf50d824fa7e49
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix wrapping in comics

Changed paths:
    engines/access/noctropolis/noctropolis_comicviewer.cpp


diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index d62059ec40d..46c03818231 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -163,6 +163,19 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 
 }
 
+static void drawString(const char *str, const Font *font, Screen *screen, int x, int y) {
+	Common::Point pt(x, y);
+	bool lastLine = false;
+	Common::String remainder = str;
+	while (!lastLine) {
+		Common::String line;
+		int width = 640;
+		lastLine = font->getLine(remainder, 640, line, width, Font::kWidthInPixels);
+		font->drawString(screen, line, pt);
+		pt.y += font->stringHeight(line);
+	}
+}
+
 void ComicViewer::drawBubble(const ComicBox &bubble) {
 
 	static const struct {
@@ -203,7 +216,7 @@ void ComicViewer::drawBubble(const ComicBox &bubble) {
 		_vm->_screen->frameRect(Common::Rect(bubble.x - 4, bubble.y - 4, bubble.x + 4 + textWidth, bubble.y + 4 + textHeight), 244);
 		// TODO: is this color the one to set?
 		Font::_fontColors[0] = bubble.textColor;
-		font->drawString(_vm->_screen, text, Common::Point(bubble.x, bubble.y));
+		drawString(text, font, _vm->_screen, bubble.x, bubble.y);
 	} else {
 
 		int spriteIndex1, spriteIndex2, style, defIndex;
@@ -245,8 +258,7 @@ void ComicViewer::drawBubble(const ComicBox &bubble) {
 		_vm->_screen->plotImage(_bubbleSprites, spriteIndex2, Common::Point(bubble.x, bubble.y));
 		_vm->_screen->plotImage(_bubbleSprites, spriteIndex1, Common::Point(bubbleX, bubbleY));
 		Font::_fontColors[0] = textColor;
-		font->drawString(_vm->_screen, text, Common::Point(bubble.x + 7, bubble.y + 10));
-
+		drawString(text, font, _vm->_screen, bubble.x + 7, bubble.y + 10);
 	}
 
 }


Commit: d822d5e67a18c2c97450dcfaebe02f42cd85b34f
    https://github.com/scummvm/scummvm/commit/d822d5e67a18c2c97450dcfaebe02f42cd85b34f
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Start support for Noctropolis videos

Based on work by johndoe.

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/access/amazon/amazon_game.cpp
    engines/access/animation.cpp
    engines/access/events.cpp
    engines/access/inventory.h
    engines/access/martian/martian_game.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/polygon.h
    engines/access/room.cpp
    engines/access/scripts.cpp
    engines/access/video.cpp
    engines/access/video.h


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index ceb5275e69b..3e3afd8adaf 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -56,7 +56,7 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_video = nullptr;
 
 	_destIn = nullptr;
-	_current = nullptr;
+	_current = &_buffer2;
 	_mouseMode = 0;
 	_playerDataCount = 0;
 	_currentMan = 0;
@@ -190,7 +190,6 @@ void AccessEngine::initialize() {
 	_screen = new Screen(this);
 	_sound = new SoundManager(this, _mixer);
 	_midi = new MusicManager(this);
-	_video = new VideoPlayer(this);
 
 	syncSoundSettings();
 	setTotalPlayTime(0);
@@ -424,6 +423,23 @@ void AccessEngine::plotList1() {
 	}
 }
 
+void AccessEngine::clearPlotImagesIn(int16 x, int16 y, int16 w, int16 h) {
+	const Common::Rect toClear = Common::Rect(Common::Point(x, y), w, h);
+	for (uint idx = 0; idx < _images.size(); idx++) {
+		const SpriteFrame *frame = _images[idx]._spritesPtr->getFrame(_images[idx]._frameNumber);
+		Common::Point topLeft = _images[idx]._position;
+		Common::Rect imgRect(topLeft, frame->w, frame->h);
+		if (toClear.intersects(imgRect)) {
+			_images.remove_at(idx);
+			idx--;
+		}
+	}
+}
+
+void AccessEngine::clearPlotVidsIn(int16 x, int16 y, int16 w, int16 h) {
+	warning("TODO: Implement AccessEngine::clearPlotVidsIn");
+}
+
 void AccessEngine::copyBlocks() {
 	// Copy the block list from the previous frame
 	for (const auto &rect : _oldRects) {
diff --git a/engines/access/access.h b/engines/access/access.h
index 81b3c30eaad..ee42243f7fe 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -327,6 +327,8 @@ public:
 
 	void plotList();
 	void plotList1();
+	void clearPlotImagesIn(int16 x, int16 y, int16 w, int16 h);
+	void clearPlotVidsIn(int16 x, int16 y, int16 w, int16 h);
 
 	void copyBlocks();
 
diff --git a/engines/access/amazon/amazon_game.cpp b/engines/access/amazon/amazon_game.cpp
index 84e32856315..86bd0c99706 100644
--- a/engines/access/amazon/amazon_game.cpp
+++ b/engines/access/amazon/amazon_game.cpp
@@ -101,6 +101,7 @@ void AmazonEngine::initObjects() {
 	_inventory = new AmazonInventory(this);
 	_room = new AmazonRoom(this);
 	_scripts = new AmazonScripts(this);
+	_video = new VideoPlayer_v1(this);
 
 	_ant = new Ant(this);
 	_cast = new Cast(this);
diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index cc79a9d32e4..3082f427bbe 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -246,7 +246,7 @@ void Animation::anim10() {
 }
 
 void Animation::anim11() {
-     // Actor idle
+	// Actor idle
 	const AnimationFrame *frame = calcFrame();
 	_countdownTicks += frame->_frameDelay;
 	_scaling = _vm->_scale;
diff --git a/engines/access/events.cpp b/engines/access/events.cpp
index d8445b562b4..e25ace1e374 100644
--- a/engines/access/events.cpp
+++ b/engines/access/events.cpp
@@ -222,8 +222,8 @@ void EventsManager::keyControl(Common::KeyCode keycode, bool isKeyDown) {
 }
 
 uint32 EventsManager::getDoubleClickTime() const {
-    uint32 timeout = g_system->getDoubleClickTime();
-    return timeout > 0 ? timeout : 400;
+	uint32 timeout = g_system->getDoubleClickTime();
+	return timeout > 0 ? timeout : 400;
 }
 
 void EventsManager::actionControl(Common::CustomEventType action, bool isKeyDown) {
@@ -236,7 +236,7 @@ void EventsManager::actionControl(Common::CustomEventType action, bool isKeyDown
 		}
 		return;
 	}
-	
+
 	if (_interfaceOff)
 		return;
 
diff --git a/engines/access/inventory.h b/engines/access/inventory.h
index 43302e4476e..c9a3ce08f87 100644
--- a/engines/access/inventory.h
+++ b/engines/access/inventory.h
@@ -116,6 +116,8 @@ public:
 public:
 	InventoryManager(AccessEngine *vm);
 
+	virtual ~InventoryManager() {};
+
 	int &operator[](int idx);
 
 	int useItem() const;
diff --git a/engines/access/martian/martian_game.cpp b/engines/access/martian/martian_game.cpp
index eed12924df9..b41ef8af4fa 100644
--- a/engines/access/martian/martian_game.cpp
+++ b/engines/access/martian/martian_game.cpp
@@ -46,6 +46,7 @@ void MartianEngine::initObjects() {
 	_inventory = new MartianInventory(this);
 	_room = new MartianRoom(this);
 	_scripts = new MartianScripts(this);
+	_video = new VideoPlayer_v1(this);
 }
 
 void MartianEngine::configSelect() {
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 84a703db6e4..152e1235af8 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -49,6 +49,7 @@ void NoctropolisEngine::initObjects() {
 	_scripts = new NoctropolisScripts(this);
 	_invScript = new NoctropolisScripts(this);
 	_inventory = new NoctropolisInventory(this);
+	_video = new VideoPlayer_v2(this);
 	_stil = new Player(this);
 
 	const Common::FSNode gameDataDir(ConfMan.getPath("path"));
diff --git a/engines/access/polygon.h b/engines/access/polygon.h
index 2825559fbc6..399e473bc0e 100644
--- a/engines/access/polygon.h
+++ b/engines/access/polygon.h
@@ -29,8 +29,8 @@
 namespace Access {
 
 struct Polygon {
-    Common::Array<Common::Point> points;
-    bool pointInside(int16 x, int16 y) const;
+	Common::Array<Common::Point> points;
+	bool pointInside(int16 x, int16 y) const;
 };
 
 typedef Common::Array<Polygon> PolygonArray;
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 178089a313c..5249dcd4de3 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -100,7 +100,7 @@ void Room::takePicture() {
 	for (int i = 0; Martian::PICTURE_RANGE[i][0] != -1; i += 2) {
 		// PICTURE_RANGE is min/max X, min/max Y
 		pictureCoords.push_back(Common::Rect(Martian::PICTURE_RANGE[i][0], Martian::PICTURE_RANGE[i + 1][0],
-			                                 Martian::PICTURE_RANGE[i][1], Martian::PICTURE_RANGE[i + 1][1]));
+									Martian::PICTURE_RANGE[i][1], Martian::PICTURE_RANGE[i + 1][1]));
 	}
 
 	int result = _vm->_events->checkMouseBox1(pictureCoords);
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 75415712625..a057370a8a0 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -358,7 +358,7 @@ void Scripts::cmdEndObject_v3() {
 
 		_vm->_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctCenter);
 		if (_vm->_player->_roomNumber <= 4)
-          _vm->_bubbleBox->_type = (BoxType)(_vm->_bubbleBox->_type | kTextBoxNoctPlain);
+			_vm->_bubbleBox->_type = (BoxType)(_vm->_bubbleBox->_type | kTextBoxNoctPlain);
 
 		printString(msg);
 	}
@@ -886,8 +886,10 @@ void Scripts::cmdSetVideo_v3() {
 		pt.x = rawx;
 
 	debugC(1, kDebugScripts, "cmdSetVideo_v3(x=%d, y=%d, cellIndex=%d, rate=%d)", pt.x, pt.y, cellIndex, rate);
-	warning("TODO: cmdSetVideo_v3: Use loop flag");
-	_vm->_video->setVideo(_vm->_screen, pt, _vm->_extraCells[cellIndex]._vid, rate);
+	warning("TODO: cmdSetVideo_v3: Use flag");
+	// Hack: Skip the "DARK/"
+	Common::Path vidpath(_vm->_extraCells[cellIndex]._vidFilename.substr(5));
+	_vm->_video->setVideo(_vm->_screen, pt, vidpath, rate);
 
 	if (cellIndex == 1 && roomNum == 0x36)
 		_vm->_screen->setIconPalette();
@@ -1185,7 +1187,7 @@ void Scripts::cmdPlayerChoice() {
 	debugC(1, kDebugScripts, "cmdPlayerChoice(%d, %d, ..(%d choices)..)", x, startY, choiceStrs.size());
 
 	_vm->_events->setCursor(CURSOR_ARROW);
-	const char *respTitle = ((Noctropolis::NoctropolisResources *)_resource)->getResponseTitle();
+	const char *respTitle = ((Noctropolis::NoctropolisResources *)_vm->_res)->getResponseTitle();
 	Common::Array<Common::Rect> responseCoords;
 
 	for (uint i = 0; i < choiceStrs.size(); i++) {
@@ -1656,11 +1658,19 @@ void Scripts::cmdPlayerScale() {
 }
 
 void Scripts::cmdRestoreBlock() {
+	int16 x = _data->readSint16LE();
+	int16 y = _data->readSint16LE();
+	int16 w = _data->readSint16LE();
+	int16 h = _data->readSint16LE();
+	debugCN(1, kDebugScripts, "cmdRestoreBlock(%d, %d, %d, %d)", x, y, w, h);
+	_vm->clearPlotImagesIn(x, y, w, h);
+	_vm->clearPlotVidsIn(x, y, w, h);
 	error("TODO: Implement Scripts::cmdRestoreBlock");
 }
 
 void Scripts::cmdCopyScnBuf() {
-	error("TODO: Implement Scripts::cmdCopyScnBuf");
+	debugCN(1, kDebugScripts, "cmdCopyScnBuf()");
+	_vm->_screen->update();
 }
 
 void Scripts::cmdStilWalkTo() {
diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index d3e8403c7dc..d6453e52eac 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -19,38 +19,62 @@
  *
  */
 
+#include "audio/decoders/raw.h"
+
 #include "access/video.h"
 #include "access/access.h"
 
 namespace Access {
 
-VideoPlayer::VideoPlayer(AccessEngine *vm) : Manager(vm) {
-	_vidSurface = nullptr;
+VideoPlayer::VideoPlayer(AccessEngine *vm) : Manager(vm), _videoData(nullptr),
+_videoFrame(0), _soundFrame(0), _videoEnd(false), _soundFlag(false), _vidSurface(nullptr) {
+}
+
+VideoPlayer::~VideoPlayer() {
+	closeVideo();
+}
+
+void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, const Common::Path &filename, int rate) {
+	// Open up video stream
+	_videoData = _vm->_files->loadRawFile(filename);
+
+	_vidSurface = vidSurface;
+	setVideo(pt, rate);
+}
+
+void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, const FileIdent &videoFile, int rate) {
+	// Open up video stream
+	_videoData = _vm->_files->loadFile(videoFile);
+
+	_vidSurface = vidSurface;
+	setVideo(pt, rate);
+}
+
+void VideoPlayer::closeVideo() {
+	delete _videoData;
 	_videoData = nullptr;
+}
+
+////////////////////////////////////
+
+VideoPlayer_v1::VideoPlayer_v1(AccessEngine *vm) : VideoPlayer(vm) {
+	_vidSurface = nullptr;
 	_startCoord = nullptr;
 
 	_frameCount = 0;
 	_xCount = 0;
 	_scanCount = 0;
 	_frameSize = 0;
-	_videoFrame = 0;
-	_soundFlag = false;
-	_soundFrame = 0;
-	_videoEnd = false;
 
 	_header._frameCount = 0;
 	_header._width = _header._height = 0;
 	_header._flags = VIDEOFLAG_NONE;
 }
 
-VideoPlayer::~VideoPlayer() {
-	closeVideo();
-}
 
-void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, int rate) {
-	_vidSurface = vidSurface;
-	vidSurface->_orgX1 = pt.x;
-	vidSurface->_orgY1 = pt.y;
+void VideoPlayer_v1::setVideo(const Common::Point &pt, int rate) {
+	_vidSurface->_orgX1 = pt.x;
+	_vidSurface->_orgY1 = pt.y;
 	_vm->_timers[31]._timer = rate;
 	_vm->_timers[31]._initTm = rate;
 
@@ -61,7 +85,7 @@ void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, int
 	_videoData->_stream->skip(1);
 	_header._flags = (VideoFlags)_videoData->_stream->readByte();
 
-	_startCoord = (byte *)vidSurface->getBasePtr(pt.x, pt.y);
+	_startCoord = (byte *)_vidSurface->getBasePtr(pt.x, pt.y);
 	_frameCount = _header._frameCount - 2;
 	_xCount = _header._width;
 	_scanCount = _header._height;
@@ -73,11 +97,11 @@ void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, int
 	if (_header._flags == VIDEOFLAG_BG) {
 		// Draw the background
 		for (int y = 0; y < _scanCount; ++y) {
-			byte *pDest = (byte *)vidSurface->getBasePtr(pt.x, pt.y + y);
+			byte *pDest = (byte *)_vidSurface->getBasePtr(pt.x, pt.y + y);
 			_videoData->_stream->read(pDest, _xCount);
 		}
 
-		if (vidSurface == _vm->_screen) {
+		if (_vidSurface == _vm->_screen) {
 			assert(pt.x >= 0 && pt.y >= 0 && pt.x < _vm->_screen->w && pt.y < _vm->_screen->h &&
 				_xCount > 0 && _xCount <= _vm->_screen->w && _scanCount > 0 && _scanCount <= _vm->_screen->h);
 			_vm->_newRects.push_back(Common::Rect(pt.x, pt.y, pt.x + _xCount, pt.y + _scanCount));
@@ -89,30 +113,12 @@ void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, int
 	_videoEnd = false;
 }
 
-void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, const Common::Path &filename, int rate) {
-	// Open up video stream
-	_videoData = _vm->_files->loadRawFile(filename);
-
-	setVideo(vidSurface, pt, rate);
-}
-
-void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, const FileIdent &videoFile, int rate) {
-	// Open up video stream
-	_videoData = _vm->_files->loadFile(videoFile);
 
-	setVideo(vidSurface, pt, rate);
-}
-
-void VideoPlayer::closeVideo() {
-	delete _videoData;
-	_videoData = nullptr;
-}
-
-void VideoPlayer::getFrame() {
+void VideoPlayer_v1::getFrame() {
 	_frameSize = _videoData->_stream->readUint16LE();
 }
 
-void VideoPlayer::playVideo() {
+void VideoPlayer_v1::playVideo() {
 	if (_vm->_timers[31]._flag)
 		return;
 	_vm->_timers[31]._flag = 1;
@@ -173,7 +179,7 @@ void VideoPlayer::playVideo() {
 	}
 }
 
-void VideoPlayer::copyVideo() {
+void VideoPlayer_v1::copyVideo() {
 	// aka drawTalkVideoFrame
 	_vm->_player->calcPlayer();
 
@@ -206,4 +212,166 @@ void VideoPlayer::copyVideo() {
 	}
 }
 
+//////////////////////////////////////////////////
+
+VideoPlayer_v2::VideoPlayer_v2(AccessEngine *vm) : VideoPlayer(vm), _audioStream(nullptr), _frame(nullptr) {
+}
+
+void VideoPlayer_v2::setVideo(const Common::Point &pt, int rate) {
+	_header._id = _videoData->_stream->readUint32LE();
+	_header._version = _videoData->_stream->readByte();
+	_header._frameCount = _videoData->_stream->readUint16LE();
+	_header._width = _videoData->_stream->readUint16LE();
+	_header._height = _videoData->_stream->readUint16LE();
+	_header._frameIncr = _videoData->_stream->readUint16LE();
+	_header._unk = _videoData->_stream->readUint16LE();
+
+	_videoFrame = 0;
+	_audioStream = NULL;
+	_videoEnd = false;
+	_vidSurface->_orgX1 = pt.x;
+	_vidSurface->_orgY1 = pt.y;
+
+	_frame = new BaseSurface();
+	_frame->create(_header._width, _header._height, Graphics::PixelFormat::createFormatCLUT8());
+
+	debugC(kDebugGraphics, "Load video V2: id = %d, version = %d, frameCount = %d, width = %d, height = %d, frameIncr = %d, unk = %d",
+	  _header._id, _header._version, _header._frameCount, _header._width, _header._height, _header._frameIncr, _header._unk);
+
+	playVideo();
+}
+
+void VideoPlayer_v2::playVideo() {
+	debugC(kDebugGraphics, "VideoPlayer_v2::handleChunk() %08X", (int)_videoData->_stream->pos());
+
+	byte type = _videoData->_stream->readByte();
+
+	debugC(kDebugGraphics, "VideoPlayer_v2::handleChunk() type = %d; _currFrame = %d; frameCount = %d", type, _videoFrame, _header._frameCount);
+
+	switch (type) {
+		case 1:
+			handleFrameChunk(true, false);
+			break;
+		case 2:
+			handlePaletteChunk();
+			break;
+		case 3:
+			handleFrameChunk(false, false);
+			break;
+		case 4:
+			handleFrameChunk(true, true);
+			break;
+		case 0x7C:
+			handleSoundChunk(true);
+			break;
+		case 0x7D:
+			handleSoundChunk(false);
+			break;
+		case 0x14:
+			closeVideo();
+			break;
+		default:
+			warning("VideoPlayer_v2::handleChunk() Unknown chunk type %d at %08X", type, (int)_videoData->_stream->pos() - 1);
+			closeVideo();
+	}
+
+}
+
+void VideoPlayer_v2::handlePaletteChunk() {
+	debugC(kDebugGraphics, "VideoPlayer_v2::handlePaletteChunk()");
+	_videoData->_stream->read(_palette, 768);
+}
+
+void VideoPlayer_v2::handleFrameChunk(bool delta, bool skipLines) {
+	debugC(kDebugGraphics, "VideoPlayer_v2::handleFrameChunk(%d, %d)", delta, skipLines);
+
+	uint32 frameDelay;
+	uint32 frameSize = _header._width * _header._height;
+	byte *dest;
+
+	frameDelay = _videoData->_stream->readUint16LE();
+	debugC(kDebugGraphics, "frameDelay = %d", frameDelay);
+
+	const Common::Rect frameBounds(Common::Point(_vidSurface->_orgX1, _vidSurface->_orgY1), _frame->w, _frame->h);
+	if (_videoFrame == 0 && delta) {
+		// If it's the first frame, grab the background
+		// (in case the first video frame happens to be a delta frame)
+		_frame->copyBlock(_vidSurface, frameBounds);
+	}
+
+	if (skipLines) {
+		uint16 lineStart = _videoData->_stream->readUint16LE();
+		debugC(kDebugGraphics, "lineStart = %d", lineStart);
+		dest = (byte*)_frame->getBasePtr(0, lineStart);
+		frameSize -= lineStart * _frame->pitch;
+	} else {
+		dest = (byte*)_frame->getBasePtr(0, 0);
+	}
+
+	while (frameSize > 0) {
+		byte count = _videoData->_stream->readByte();
+		if (delta && count == 0)
+			break;
+		if (count & 0x80) {
+			count &= 0x7F;
+			if (!delta) {
+				// repeat next byte 'count & 0x7F' times
+				byte value = _videoData->_stream->readByte();
+				memset(dest, value, count);
+			} // else skip 'count & 0x7F' bytes in output buffer
+		} else {
+			// copy next 'count' bytes
+			_videoData->_stream->read(dest, count);
+		}
+		dest += count;
+		frameSize -= count;
+	}
+
+	// Draw the video frame
+	_vidSurface->copyBlock(_frame, frameBounds);
+
+	_videoFrame++;
+	if (_videoFrame >= _header._frameCount)
+		closeVideo();
+}
+
+void VideoPlayer_v2::handleSoundChunk(bool init) {
+	debugC(kDebugGraphics, "VideoPlayer_v2::handleSoundChunk(%d)", init);
+
+	if (init) {
+		uint16 time = _videoData->_stream->readUint16LE();
+		byte frequencyDivisor = _videoData->_stream->readByte();
+		int frequency = 1000000 / (256 - frequencyDivisor);
+		debugC(kDebugGraphics, "time = %d; freqencyDivisor = %d; freqency = %d", time, frequencyDivisor, frequency);
+
+		_audioStream = Audio::makeQueuingAudioStream(frequency, false);
+		_vm->_mixer->playStream(Audio::Mixer::kPlainSoundType, &_audioStreamHandle, _audioStream);
+
+	}
+
+	uint16 soundSize = _videoData->_stream->readUint16LE();
+	byte *soundData = new byte[soundSize];
+
+	_videoData->_stream->read(soundData, soundSize);
+
+	_audioStream->queueBuffer(soundData, soundSize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
+
+	debugC(kDebugGraphics, "soundSize = %d", soundSize);
+
+}
+
+
+void VideoPlayer_v2::closeVideo() {
+	if (_audioStream) {
+		_audioStream->finish();
+		_vm->_mixer->stopHandle(_audioStreamHandle);
+	}
+	delete _frame;
+	_frame = nullptr;
+	VideoPlayer::closeVideo();
+}
+
+
+
+
 } // End of namespace Access
diff --git a/engines/access/video.h b/engines/access/video.h
index d5825c25e9c..175473a3ade 100644
--- a/engines/access/video.h
+++ b/engines/access/video.h
@@ -24,6 +24,9 @@
 
 #include "common/scummsys.h"
 #include "common/memstream.h"
+#include "audio/audiostream.h"
+#include "audio/mixer.h"
+
 #include "access/data.h"
 #include "access/asurface.h"
 #include "access/files.h"
@@ -33,14 +36,49 @@ namespace Access {
 enum VideoFlags { VIDEOFLAG_NONE = 0, VIDEOFLAG_BG = 1 };
 
 class VideoPlayer : public Manager {
+public:
+	VideoPlayer(AccessEngine *vm);
+	virtual ~VideoPlayer();
+
+	/**
+	 * Start up a video
+	 */
+	void setVideo(BaseSurface *vidSurface, const Common::Point &pt, const FileIdent &videoFile, int rate);
+	void setVideo(BaseSurface *vidSurface, const Common::Point &pt, const Common::Path &filename, int rate);
+
+	/**
+	 * Decodes a frame of the video
+	 */
+	virtual void playVideo() = 0;
+
+	virtual void copyVideo() = 0;
+	/**
+	 * Frees the data for a previously loaded video
+	 */
+	virtual void closeVideo();
+
+protected:
+	virtual void setVideo(const Common::Point &pt, int rate) = 0;
+
+	Resource *_videoData;
+	BaseSurface *_vidSurface;
+
+public:
+	int _videoFrame;
+	bool _soundFlag;
+	int _soundFrame;
+	bool _videoEnd;
+
+};
+
+
+class VideoPlayer_v1 : public VideoPlayer {
 	struct VideoHeader {
 		int _frameCount;
 		int _width, _height;
 		VideoFlags _flags;
 	};
 private:
-	BaseSurface *_vidSurface;
-	Resource *_videoData;
 	VideoHeader _header;
 	byte *_startCoord;
 	int _frameCount;
@@ -50,34 +88,53 @@ private:
 	Common::Rect _videoBounds;
 
 	void getFrame();
-	void setVideo(BaseSurface *vidSurface, const Common::Point &pt, int rate);
+protected:
+	void setVideo(const Common::Point &pt, int rate) override;
+
 public:
-	int _videoFrame;
-	bool _soundFlag;
-	int _soundFrame;
-	bool _videoEnd;
+	VideoPlayer_v1(AccessEngine *vm);
+
+	void playVideo() override;
+
+	void copyVideo() override;
+};
+
+class VideoPlayer_v2 : public VideoPlayer {
+	struct VideoHeader {
+		uint32 _id;
+		byte _version;
+		int _frameCount;
+		int _width, _height;
+		int _frameIncr;
+		uint16 _unk;
+		VideoFlags _flags;
+	};
+private:
+	VideoHeader _header;
+	BaseSurface *_frame;
+	byte _palette[768];
+
+	Audio::QueuingAudioStream *_audioStream;
+	Audio::SoundHandle _audioStreamHandle;
+
+	void handlePaletteChunk();
+	void handleFrameChunk(bool delta, bool skipLines);
+	void handleSoundChunk(bool init);
+
+protected:
+	void setVideo(const Common::Point &pt, int rate) override;
+
 public:
-	VideoPlayer(AccessEngine *vm);
-	~VideoPlayer();
+	VideoPlayer_v2(AccessEngine *vm);
 
-	/**
-	 * Start up a video
-	 */
-	void setVideo(BaseSurface *vidSurface, const Common::Point &pt, const FileIdent &videoFile, int rate);
-	void setVideo(BaseSurface *vidSurface, const Common::Point &pt, const Common::Path &filename, int rate);
+	void playVideo() override;
 
-	/**
-	 * Decodes a frame of the video
-	 */
-	void playVideo();
+	void copyVideo() override {};
 
-	void copyVideo();
-	/**
-	 * Frees the data for a previously loaded video
-	 */
-	void closeVideo();
+	void closeVideo() override;
 };
 
+
 } // End of namespace Access
 
 #endif /* ACCESS_VIDEO_H */


Commit: 40999e394a3a9893f8ab6b902c2d38b367671ca4
    https://github.com/scummvm/scummvm/commit/40999e394a3a9893f8ab6b902c2d38b367671ca4
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fixes for comic rendering. Now matches original

Changed paths:
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_comicviewer.h
    engines/access/noctropolis/noctropolis_last_comic.cpp


diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index 46c03818231..626e43fdad1 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -140,9 +140,16 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 				// TODO: Play hotspot sound
 				for (int bubbleIndex = 0; bubbleIndex < hotspot.numBoxes; bubbleIndex++) {
 					const ComicBox &bubble = hotspot.boxes[bubbleIndex];
-					drawBubble(bubble);
+					// Slightly lazy, just save/restore whole screen when
+					// drawing the comic bubble rather than trying to
+					// calculate the size here.
+					_vm->_screen->saveBlock(Common::Rect(640, 400));
+					if (!drawBubble(bubble))
+						continue;
+					_vm->_events->setCursor(CURSOR_NONE);
 					_vm->_events->waitKeyActionMouse();
-					//_vm->drawScreen(pagePicture, 640, 400);
+					_vm->_events->setCursor(CURSOR_CROSSHAIRS);
+					_vm->_screen->restoreBlock();
 				}
 			}
 		} else {
@@ -176,8 +183,7 @@ static void drawString(const char *str, const Font *font, Screen *screen, int x,
 	}
 }
 
-void ComicViewer::drawBubble(const ComicBox &bubble) {
-
+bool ComicViewer::drawBubble(const ComicBox &bubble) {
 	static const struct {
 		struct { int16 px, py; } positions[4];
 		int16 sprites[3];
@@ -208,6 +214,10 @@ void ComicViewer::drawBubble(const ComicBox &bubble) {
 	default: error("Unsupported language in drawBubble");
 	}
 
+	// Some translations have more bubbles to fit the text.
+	if (text == nullptr)
+		return false;
+
 	textWidth = font->stringWidth(text);
 	textHeight = font->stringHeight(text);
 
@@ -215,7 +225,7 @@ void ComicViewer::drawBubble(const ComicBox &bubble) {
 		_vm->_screen->fillRect(Common::Rect(bubble.x - 4, bubble.y - 4, bubble.x + 4 + textWidth, bubble.y + 4 + textHeight), 243);
 		_vm->_screen->frameRect(Common::Rect(bubble.x - 4, bubble.y - 4, bubble.x + 4 + textWidth, bubble.y + 4 + textHeight), 244);
 		// TODO: is this color the one to set?
-		Font::_fontColors[0] = bubble.textColor;
+		Font::_fontColors[1] = bubble.textColor;
 		drawString(text, font, _vm->_screen, bubble.x, bubble.y);
 	} else {
 
@@ -257,12 +267,13 @@ void ComicViewer::drawBubble(const ComicBox &bubble) {
 
 		_vm->_screen->plotImage(_bubbleSprites, spriteIndex2, Common::Point(bubble.x, bubble.y));
 		_vm->_screen->plotImage(_bubbleSprites, spriteIndex1, Common::Point(bubbleX, bubbleY));
-		Font::_fontColors[0] = textColor;
+		Font::_fontColors[1] = textColor;
 		drawString(text, font, _vm->_screen, bubble.x + 7, bubble.y + 10);
 	}
 
+	return true;
 }
 
-}
+} // end namespace Noctropolis
 
-}
+} // end namespace Access
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.h b/engines/access/noctropolis/noctropolis_comicviewer.h
index 15f0835ed7a..178171a4220 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.h
+++ b/engines/access/noctropolis/noctropolis_comicviewer.h
@@ -102,7 +102,7 @@ protected:
 	SpriteResource *_bubbleSprites;
 	int _currPage;
 	PageResult runPage(const ComicPage *page);
-	void drawBubble(const ComicBox &bubble);
+	bool drawBubble(const ComicBox &bubble);
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_last_comic.cpp b/engines/access/noctropolis/noctropolis_last_comic.cpp
index 245080278b7..ffd54570484 100644
--- a/engines/access/noctropolis/noctropolis_last_comic.cpp
+++ b/engines/access/noctropolis/noctropolis_last_comic.cpp
@@ -154,7 +154,7 @@ static struct Polygon poly_p2_b8 = { {
 
 static struct ComicBox block_p2_b8_boxes[] = {
     { 3, 244, 459, 168, "        THAT'S VERY POSSIBLE,\n   DESPERADO. LATELY, DARKSHEER'S\n BEEN QUITE INTENT UPON ELIMINATING\nHIS ENEMIES, AND I DARE SAY WE THREE\nARE THE LAST LEFT. BUT CONSIDER THE\n GORGEOUS POSSIBILITIES IF THE\n    THREE OF US ELECTED TO JOIN\n           AGAINST HIM!", "         C'EST TRES POSSIBLE,\n   DESPERADO. DERNIEREMENT,\n  DARKSHEER A MIS TOUTE SON\n ENERGIE DANS LA DESTRUCTION DE SES\n   ENNEMIS, ET J'OSE DIRE QUE NOUS\n         SOMMES LES DERNIERS.", "             ES MUY PROBABLE,\n  DESESPERADO. TENEBROSO QUIERE\n INTENTAR ELIMINAR A SUS ENEMIGOS\nY ME PARECE QUE SOLO QUEDAMOS \nNOSOTROS TRES. PERO TE IMAGINAS QUE\n PASARIA SI UNIERAMOS NUESTRAS\n    FUERZAS PARA ACABAR CON\n           EL?", "               DAS IST GUT\n        M\x99""GLICH, SHOWDOWN. IN\n     LETZTER ZEIT LEGT DARKSHEER\n   ES DARAUF AN, ALLE SEINE FEINDE\n  AUSZUSCHALTEN. UND ICH WAGE MAL\n    ZU BEHAUPTEN, WIR DREI SIND DIE\n         LETZTEN \x9a""BERLEBENDEN." },
-    { 3, 244, 459, 168, "NULL", "          MAIS PENSEZ AUX\n   POSSIBILITES FASCINANTES QUI\n   S'OFFRENT A NOUS SI NOUS NOUS\n        UNISSONS CONTRE LUI!", "NULL", "       ABER MALT EUCH BLO\xe1""\n   MAL DIE M\x99""GLICHKEITEN AUS,\n    WENN WIR DREI UNS GEGEN IHN\n          VERB\x9a""NDETEN!" },
+    { 3, 244, 459, 168, nullptr, "          MAIS PENSEZ AUX\n   POSSIBILITES FASCINANTES QUI\n   S'OFFRENT A NOUS SI NOUS NOUS\n        UNISSONS CONTRE LUI!", nullptr, "       ABER MALT EUCH BLO\xe1""\n   MAL DIE M\x99""GLICHKEITEN AUS,\n    WENN WIR DREI UNS GEGEN IHN\n          VERB\x9a""NDETEN!" },
     { 4, 244, 137, 260, "     THREE AGAINST ONE... LADY,\nI LIKE THEM ODDS.", "      TROIS CONTRE UN...\n  JE PREFERE L'EQUILIBRE.", "     TRES CONTRA UNO... ME\n GUSTA COMO SUENA.", "       DREI GEGEN EINEN...\nLADY, DAS VERH\x8e""LTNIS GEF\x8e""LLT MIR." },
 };
 
@@ -1064,7 +1064,7 @@ static struct Polygon poly_p8_b4 = { {
 
 static struct ComicBox block_p8_b4_boxes[] = {
     { 3, 244, 196, 298, "        I WATCHED YOU TAKE\n   OUT DESPERADO AND WIDOWMARK...\n    YOU WERE MARVY! BUT I CAN'T\n  IMAGINE WHY YOU'RE WORKING SO\n  HARD TO REMOVE THE COMPETITION.\n       WE NEED EACH OTHER...", "        JE VOUS AI OBSERVE\n     PENDANT QUE VOUS VOUS\n    OCCUPIEZ DE DESPERADO ET DE\n      WIDOWMARK... VOUS ETIEZ\n           MERVEILLEUX!", "    FUISTE MUY HABIL PARA\n  MATAR A DESESPERADO Y VIUDA\n  NEGRA. PERO NO CONTASTE CON\n  MI ASTUCIA.\n   RECUERDA QUE SOMOS UNO...", "        ICH HABE ZUGESCHAUT,\n     WIE DU SHOWDOWN UND DIESE\n SPINNE AUSGESCHALTET HAST...DU BIST\n SUPERSUPERSUPER, BABIIIEE! ABER ICH\n  WEI\xe1"" GAR NICHT, WARUM DU DICH SO\n     ANSTRENGST MIT MIR. WIR\n     BRAUCHEN EINANDER DOCH..." },
-    { 3, 244, 196, 298, "NULL", "\n      MAIS JE NE COMPRENDS\n   PAS POURQUOI VOUS FAITES\n  TOUS CES EFFORTS POUR VOUS\n DEBARRASSER DE VOS ADVERSAIRES.\n   NOUS AVONS BESOIN DE CETTE\n           RIVALITE...", "NULL", "NULL" },
+    { 3, 244, 196, 298, nullptr, "\n      MAIS JE NE COMPRENDS\n   PAS POURQUOI VOUS FAITES\n  TOUS CES EFFORTS POUR VOUS\n DEBARRASSER DE VOS ADVERSAIRES.\n   NOUS AVONS BESOIN DE CETTE\n           RIVALITE...", nullptr, nullptr },
 };
 
 static struct ComicBlock block_p8_4 = { &poly_p8_b4, -1, -1, block_p8_b4_boxes, 2 };
@@ -1195,7 +1195,7 @@ static struct Polygon poly_p9_b1 = { {
 
 static struct ComicBox block_p9_b1_boxes[] = {
     { 2, 255, 10, 150, "        TOPHAT'S OUT FOR THE\n   COUNT. I FOUND DESPERADO AND I\n ASSUME THAT MOUND OF HAIR AND\nBLOOD IS WHAT'S LEFT OF WIDOWMARK.\n YOU SURE AS HELL WERE THOROUGH...\n         ARE YOU O.K.?", "\n        TOPHAT EST ELIMINEE.\n   J'AI TROUVE DESPERADO ET JE\nSUPPOSE QU'IL NE RESTE DE WIDOWMARK\nQUE CES TAS DE CHEVEUX COUVERTS DE\n     SANG. TU AS FAIT DU BEAU\n         TRAVAIL... \x80""A VA?", "      LA DIVA ESTA FUERA DE\n   COMBATE. VI A DESESPERADO Y\n SUPONGO QUE AQUELLOS RESTOS\n ES LO QUE QUEDA DE VIUDA NEGRA.\n PARECE QUE TE HAS DIVERTIDO...\n        ESTAS BIEN?", "        MISS ZYLINDERCHEN IST\n   AUSGEZ\x8e""HLT. ICH HABE SHOWDOWN\n   GEFUNDEN, UND ICH VERMUTE MAL,\n  DIESER HAUFEN BLUTIGER HAARE IST\n   ALLES, WAS VON DER SCHWARZEN\n   WITWE \x9a""BRIGGEBLIEBEN IST." },
-    { 2, 255, 10, 150, "NULL", "NULL", "NULL", "      ALSO DU ARBEITEST\n    SCHON VERDAMMT GR\x9a""NDLICH.\n       HE, BIST DU OK?" },
+    { 2, 255, 10, 150, nullptr, nullptr, nullptr, "      ALSO DU ARBEITEST\n    SCHON VERDAMMT GR\x9a""NDLICH.\n       HE, BIST DU OK?" },
     { 4, 246, 44, 208, "    I'M FINE! YOU'VE GOT A\nLOT OF NERVE, STILETTO, BUTTING\n  IN WHERE YOU DON'T BELONG!", "\n    JE VAIS TRES BIEN! TU AS\nDU CRAN, STILETTO D'INTERVENIR DANS\n   DES AFFAIRES QUI NE TE\n        REGARDENT PAS!", "   PERFECTAMENTE! NO SE\n POR QUE TE METES DONDE NO TE\n LLAMAN, STILETTO!", "\n    MIR GEHT'S GUT. DU HAST\nVIELLEICHT NERVEN, STILETTO, HIER\n  EINFACH REINZUPLATZEN, WO DU\n    GAR NICHTS VERLOREN HAST!" },
 };
 
@@ -1212,7 +1212,7 @@ static struct Polygon poly_p9_b2 = { {
 
 static struct ComicBox block_p9_b2_boxes[] = {
     { 1, 255, 443, 168, "        I'M YOUR PARTNER! I\n   DON'T KNOW WHAT YOUR PROBLEM\n IS LATELY. YOU'RE OBVIOUSLY ON\nSOME EGO TRIP, TAKING OUT ALL THE\n BUTTHEADS SINGLE-HANDEDLY, BUT IF\n  I HADN'T SHOWN, TOPHAT WOULD'VE\n    FINISHED YOU OFF, HERO!", "       JE SUIS TA PARTENAIRE!\n   JE NE SAIS PAS QUEL EST TON\n     PROBLEME DEPUIS QUELQUE\n              TEMPS.", "        SOMOS SOCIOS! NO\n   SE QUE TE PASA ULTIMAMENTE.\n TE HAS VUELTO EGOISTA, NO CUENTAS\n CONMIGO PARA NADA... PERO DE NO\n SER POR MI, LA DIVA TE HUBIERA\n    MATADO, HEROE!", "       ICH BIN DEINE PARTNERIN!\n    ICH WEI\xe1"" NICHT, WAS IN LETZTER\n        ZEIT MIT DIR LOS IST!" },
-    { 1, 255, 443, 168, "NULL", "\n     TU ES APPAREMMENT DANS\n  UN TRIP SOLITAIRE, TU ESSAYES\n  D'ELIMINER TOUS LES MALFRATS\n  DE LA VILLE D'UNE SEULE MAIN.\n   MAIS SANS MON INTERVENTION,\n     TOPHAT T'AURAIT REGLE TON\n           COMPTE, HEROS! ", "NULL", "           DU BIST WOHL AUF\n       EINEM EGO-TRIP, DA\xe1"" DU\n   ALLE MISTBACKEN GANZ ALLEINE\n AUSSCHALTEN WILLST, ABER WENN ICH\n    NICHT AUFGETAUCHT W\x8e""RE, H\x8e""TTE\n        MISS ZYLINDERCHEN DICH\n          HELDEN ABSERVIERT!" },
+    { 1, 255, 443, 168, nullptr, "\n     TU ES APPAREMMENT DANS\n  UN TRIP SOLITAIRE, TU ESSAYES\n  D'ELIMINER TOUS LES MALFRATS\n  DE LA VILLE D'UNE SEULE MAIN.\n   MAIS SANS MON INTERVENTION,\n     TOPHAT T'AURAIT REGLE TON\n           COMPTE, HEROS! ", nullptr, "           DU BIST WOHL AUF\n       EINEM EGO-TRIP, DA\xe1"" DU\n   ALLE MISTBACKEN GANZ ALLEINE\n AUSSCHALTEN WILLST, ABER WENN ICH\n    NICHT AUFGETAUCHT W\x8e""RE, H\x8e""TTE\n        MISS ZYLINDERCHEN DICH\n          HELDEN ABSERVIERT!" },
 };
 
 static struct ComicBlock block_p9_2 = { &poly_p9_b2, -1, -1, block_p9_b2_boxes, 2 };
@@ -1276,7 +1276,7 @@ static struct Polygon poly_p10_b1 = { {
 
 static struct ComicBox block_p10_b1_boxes[] = {
     { 7, 246, 153, 252, "        REMEMBERING... HOW IT\n   ALL STARTED. I WAS JUST A PUNK\n ORPHAN. FATHER DESMOND... WHAT A\nSALESMAN! HE HAD US ALL JUMPING TO\n BECOME WARDS... TO HELP CLEAN UP\n   THE STREETS OF NOCTROPOLIS.\n     BIRTH OF A VIGILANTE...", "          JE ME SOUVIENS...\n    COMMENT TOUT A COMMENCE.\n J'ETAIS ORPHELIN. LE PERE DESMOND...\nQUEL VENDEUR! NOUS VOULIONS TOUS\nDEVENIR DES PUPILLES... POUR L'AIDER\n     A NETTOYER LES RUES DE\n     NOCTROPOLIS. LA NAISSANCE\n          D'UN VIGILE....", "        RECUERDO COMO EMPEZO\n  TODO. YO ERA UN PILLUELO DE LAS\n CALLES. EL PADRE DESMOND... QUE\n TIO! NOS TENIA A TODOS SALTANDO\n PARA CONVERTIRNOS EN GUARDIANES Y\n   LIMPIAR LAS CALLES.\n     ASI ME HICE VIGILANTE...", "     ERINNERUNGEN...WIE ALLES\n     BEGANN. ICH WAR NUR EIN\n     STREUNENDER WAISENKNABE." },
-    { 7, 246, 153, 252, "NULL", "NULL", "NULL", "          VATER DESMOND...\n   WAS F\x9a""R EIN VERK\x8e""UFER! BRACHTE\n  UNS ALLE DAZU, NICHTS SEHNLICHER\n     ZU WOLLEN, ALS DER WEHR\nANZUGEH\x99""REN... DIE STRA\xe1""EN AUFR\x8e""UMEN.\n       GEBURT EINER B\x9a""RGERWEHR..." },
+    { 7, 246, 153, 252, nullptr, nullptr, nullptr, "          VATER DESMOND...\n   WAS F\x9a""R EIN VERK\x8e""UFER! BRACHTE\n  UNS ALLE DAZU, NICHTS SEHNLICHER\n     ZU WOLLEN, ALS DER WEHR\nANZUGEH\x99""REN... DIE STRA\xe1""EN AUFR\x8e""UMEN.\n       GEBURT EINER B\x9a""RGERWEHR..." },
 };
 
 static struct ComicBlock block_p10_1 = { &poly_p10_b1, -1, -1, block_p10_b1_boxes, 2 };
@@ -1390,7 +1390,7 @@ static struct Polygon poly_p10_b8 = { {
 
 static struct ComicBox block_p10_b8_boxes[] = {
     { 8, 246, 240, 282, "        I TOOK HER BACK TO\n  SHADOWLAIR WHERE SHE AGREED TO\n BECOME MY PARTNER. WE PROWLED\nTHE STREETS TOGETHER. UNARMED, SHE'S\n VICIOUS, BUT WITH THOSE BLADES,\n   SHE'S DOWNRIGHT LETHAL! WE\n    BECAME A FORMIDABLE TEAM...\n       DARKSHEER AND STILETTO.", "         JE L'AI RAMENEE A\n    L'ANTRE D'OMBRE, OU ELLE\n ACCEPTA DE DEVENIR MA PARTENAIRE.\n   NOUS AVONS ECUME LES RUES\nENSEMBLE... SANS ARME, ELLE EST\n   RUSEE, MAIS AVEC SES COUTEAUX,\n         ELLE EST MORTELLE!", "        LA TRAJE A LA CUEVA\n  SOMBRIA Y ACEPTO SER MI SOCIA.\n JUNTOS RECORRIMOS LAS CALLES.\n ES MORTAL CON SUS CUCHILLOS.\n ERAMOS UN GRAN EQUIPO...\n       TENEBROSO Y STILETTO.", "      ICH NAHM SIE MIT ZUR\x9a""CK\n  ZUM SCHATTENHORT, UND SIE WILLIGTE\n  EIN, MEINE PARTNERIN ZU WERDEN." },
-    { 8, 246, 240, 282, "NULL", "          NOUS FORMIONS\n        UNE EQUIPE UNIQUE...\n        DARKSHEER ET STILETTO.", "NULL", "            WIR TRIEBEN UNS\n    ZUSAMMEN RUM. UNBEWAFFNET\n  IST SIE SCHON GEF\x8e""HRLICH, ABER\n MIT DIESEN KLINGEN IST SIE EINFACH\n    T\x99""DLICH! WIR WURDEN EIN\n       UNSCHLAGBARES TEAM...\n       DARKSHEER UND STILETTO." },
+    { 8, 246, 240, 282, nullptr, "          NOUS FORMIONS\n        UNE EQUIPE UNIQUE...\n        DARKSHEER ET STILETTO.", nullptr, "            WIR TRIEBEN UNS\n    ZUSAMMEN RUM. UNBEWAFFNET\n  IST SIE SCHON GEF\x8e""HRLICH, ABER\n MIT DIESEN KLINGEN IST SIE EINFACH\n    T\x99""DLICH! WIR WURDEN EIN\n       UNSCHLAGBARES TEAM...\n       DARKSHEER UND STILETTO." },
 };
 
 static struct ComicBlock block_p10_8 = { &poly_p10_b8, -1, -1, block_p10_b8_boxes, 2 };
@@ -1405,7 +1405,7 @@ static struct Polygon poly_p10_b9 = { {
 
 static struct ComicBox block_p10_b9_boxes[] = {
     { 8, 246, 305, 212, "        WE'VE BEEN TOGETHER\n   EVER SINCE... WELL, EXCEPT\n LATELY... I GUESS SHE HAS A RIGHT\nTO BE TICKED THAT I'VE BEEN WORKING\n ALONE. THE VENOM'S GONE... AND THE\n   BULLET SCORE'S HEALED... LIKE I\n    SAID, IT WORKS EVERY TIME.", "\n       NOUS SOMMES ENSEMBLE\n   DEPUIS CE JOUR-LA.... EN FAIT,\nUN PEU MOINS DEPUIS QUELQUE TEMPS.\nJE PENSE QU'ELLE A LE DROIT\n  D'ETRE VEXEE PARCE QUE J'AI\n         TRAVAILLE SEUL.", "      DESDE ENTONCES\n   ESTAMOS JUNTOS... HASTA HACE\n POCO... SUPONGO QUE TIENE RAZON\n AL ENFADARSE PORQUE YO TRABAJE\n SOLO. BIEN. EL VENENO SE HA IDO Y\n  LA HERIDA DE BALA ESTA CURADA...\n       SIEMPRE FUNCIONA.", "         SEITDEM SIND WIR\n    ZUSAMMEN...NAJA, BIS AUF DIE\n LETZTE ZEIT. SCH\x8e""TZE, SIE HAT DAS\n RECHT, ETWAS SAUER ZU SEIN, DA\xe1"" ICH\nALLEIN GEARBEITET HABE. DAS GIFT IST\n   FORT...DIE WUNDE VERHEILT...WIE\n    GESAGT, FUNKTIONIERT\n             JEDESMAL." },
-    { 8, 246, 305, 212, "NULL", "       LE VENIN EST PARTI... \n  ET LES BLESSURES DES BALLES\nONT ETE GUERIES. COMME JE VOUS\n    L'AI DIT, \x80""A MARCHE A TOUS\n           LES COUPS.", "NULL", "NULL" },
+    { 8, 246, 305, 212, nullptr, "       LE VENIN EST PARTI... \n  ET LES BLESSURES DES BALLES\nONT ETE GUERIES. COMME JE VOUS\n    L'AI DIT, \x80""A MARCHE A TOUS\n           LES COUPS.", nullptr, nullptr },
 };
 
 static struct ComicBlock block_p10_9 = { &poly_p10_b9, -1, -1, block_p10_b9_boxes, 2 };
@@ -1474,7 +1474,7 @@ static struct Polygon poly_p11_b3 = { {
 
 static struct ComicBox block_p11_b3_boxes[] = {
     { 5, 246, 181, 280, "         I'VE WORKED HARD TO\n   BECOME WHAT I AM, BUT I'M SO\n DAMN TIRED! FIGHTING OFF EVERY\nCRACKPOT AND PSYCHO THAT WANTS TO\n   USE NOCTROPOLIS AS THEIR\n     PERSONAL PLAYGROUND...", "         J'AI TRAVAILLE DUR\n     POUR DEVENIR CE QUE JE SUIS\n AUJOU'D'HUI, MAIS JE SUIS VRAIMENT\nFATIGUE! JE ME SUIS BATTU CONTRE TOUS\n MALFAITEURS ET AUTRES PSYCHOPATHES\n  QUI DECIDAIENT UN JOUR D'ADOPTER\n        NOCTROPOLIS COMME\n          TERRAIN DE JEU...", "         TRABAJE MUCHO PARA\n  CONVERTIRME EN LO QUE SOY,\n PERO TODO TIENE UN FIN. PELEAR\n CONTRA CADA RATERO O SICOPATA\n QUE QUIERE HACER DE NOCTROPOLIS\n        SUS DOMINIOS...", "         ICH HABE HART\n   GEARBEITET, UM DAS ZU WERDEN,\n       WAS ICH HEUTE BIN." },
-    { 5, 246, 181, 280, "NULL", "NULL", "NULL", "         ABER ICH BIN ES SO\n    VERDAMMT LEID, GEGEN JEDEN\n  VERR\x9a""CKTEN UND PSYCHOPATHEN ZU\n   K\x8e""MPFEN, DER NOCTROPOLIS ALS\n   SEINEN PERS\x99""NLICHEN SPIELPLATZ\n             BETRACHTET..." },
+    { 5, 246, 181, 280, nullptr, nullptr, nullptr, "         ABER ICH BIN ES SO\n    VERDAMMT LEID, GEGEN JEDEN\n  VERR\x9a""CKTEN UND PSYCHOPATHEN ZU\n   K\x8e""MPFEN, DER NOCTROPOLIS ALS\n   SEINEN PERS\x99""NLICHEN SPIELPLATZ\n             BETRACHTET..." },
 };
 
 static struct ComicBlock block_p11_3 = { &poly_p11_b3, -1, -1, block_p11_b3_boxes, 2 };


Commit: 9bf4b170bafe8446f757ef74d867cf981914146d
    https://github.com/scummvm/scummvm/commit/9bf4b170bafe8446f757ef74d867cf981914146d
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: More progress on Noctropolis scripts and videos

Changed paths:
    engines/access/amazon/amazon_scripts.cpp
    engines/access/amazon/amazon_scripts.h
    engines/access/animation.cpp
    engines/access/asurface.h
    engines/access/events.h
    engines/access/martian/martian_scripts.cpp
    engines/access/martian/martian_scripts.h
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/noctropolis/noctropolis_scripts.cpp
    engines/access/noctropolis/noctropolis_scripts.h
    engines/access/room.cpp
    engines/access/room.h
    engines/access/screen.cpp
    engines/access/screen.h
    engines/access/scripts.cpp
    engines/access/scripts.h
    engines/access/video.cpp
    engines/access/video.h


diff --git a/engines/access/amazon/amazon_scripts.cpp b/engines/access/amazon/amazon_scripts.cpp
index 738c10134e6..c187a26f39f 100644
--- a/engines/access/amazon/amazon_scripts.cpp
+++ b/engines/access/amazon/amazon_scripts.cpp
@@ -318,7 +318,7 @@ void AmazonScripts::plotInactive() {
 	_vm->_images.addToList(_game->_inactive);
 }
 
-void AmazonScripts::executeSpecial(int commandIndex, int param1, int param2) {
+bool AmazonScripts::executeSpecial(int commandIndex, int param1, int param2) {
 	switch (commandIndex) {
 	case 0:
 		warning("TODO: DEMO - RESETAN");
@@ -374,6 +374,7 @@ void AmazonScripts::executeSpecial(int commandIndex, int param1, int param2) {
 	default:
 		warning("Unexpected Special code %d - Skipped", commandIndex);
 	}
+	return false;
 }
 
 typedef void(AmazonScripts::*AmazonScriptMethodPtr)();
diff --git a/engines/access/amazon/amazon_scripts.h b/engines/access/amazon/amazon_scripts.h
index 031c06f8109..1f794fd1d31 100644
--- a/engines/access/amazon/amazon_scripts.h
+++ b/engines/access/amazon/amazon_scripts.h
@@ -35,7 +35,7 @@ class AmazonScripts : public Scripts {
 private:
 	AmazonEngine *_game;
 protected:
-	void executeSpecial(int commandIndex, int param1, int param2) override;
+	bool executeSpecial(int commandIndex, int param1, int param2) override;
 	void executeCommand(int commandIndex) override;
 
 	void cLoop();
diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index 3082f427bbe..c373e389ae0 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -250,7 +250,7 @@ void Animation::anim11() {
 	const AnimationFrame *frame = calcFrame();
 	_countdownTicks += frame->_frameDelay;
 	_scaling = _vm->_scale;
-	setFrame1(frame, _vm->_player->_rawPlayer.x, _vm->_player->_rawPlayer.y - _vm->_player->_playerOffset.y);
+	setFrame1(frame, _vm->_player->_playerX, _vm->_player->_playerY - _vm->_player->_playerOffset.y);
 }
 
 void Animation::anim12() {
@@ -302,8 +302,8 @@ void Animation::setFrame(const AnimationFrame *frame) {
 }
 
 void Animation::setFrame1(const AnimationFrame *frame, int16 xoff, int16 yoff) {
-	_vm->_animation->_base.x = frame->_baseX + xoff;
-	_vm->_animation->_base.y = frame->_baseY + yoff;
+	_vm->_animation->_base.x = frame->_baseX;
+	_vm->_animation->_base.y = frame->_baseY;
 
 	// Loop to add image draw requests for the parts of the frame
 	for (const AnimationFramePart &part: frame->_parts) {
@@ -321,8 +321,8 @@ void Animation::setFrame1(const AnimationFrame *frame, int16 xoff, int16 yoff) {
 		ie._position.y = yoff ? yoff : (part._position.y + _vm->_animation->_base.y);
 		if (xoff && _scaling != -1) {
 			// If xoff is set, the animation is for an actor so we need to apply scale factor
-			// to frame height
-			ie._offsetY = part._offsetY * _scaling / 256 - ie._position.y;
+			// to frame height for priority.
+			ie._offsetY = (part._offsetY - frame->_baseY - part._position.y) * _scaling / 256;
 		} else {
 			ie._offsetY = part._offsetY - ie._position.y;
 		}
diff --git a/engines/access/asurface.h b/engines/access/asurface.h
index d11e7c936a8..984b0ef3a7c 100644
--- a/engines/access/asurface.h
+++ b/engines/access/asurface.h
@@ -160,7 +160,7 @@ class ImageEntry {
 public:
 	int _frameNumber;
 	SpriteResource *_spritesPtr;
-	int _offsetY;
+	int _offsetY; // offset to apply to y position when sorting draw order
 	Common::Point _position;
 	int _flags;
 public:
diff --git a/engines/access/events.h b/engines/access/events.h
index eba6f724c11..45ed7c2de8b 100644
--- a/engines/access/events.h
+++ b/engines/access/events.h
@@ -177,6 +177,8 @@ public:
 
 	/* get ms delay before considering something a double-click */
 	uint32 getDoubleClickTime() const;
+
+	uint32 getPriorFrameTime() const { return _priorFrameTime; }
 };
 
 } // End of namespace Access
diff --git a/engines/access/martian/martian_scripts.cpp b/engines/access/martian/martian_scripts.cpp
index e9fab6b6da7..d16e72c0830 100644
--- a/engines/access/martian/martian_scripts.cpp
+++ b/engines/access/martian/martian_scripts.cpp
@@ -341,7 +341,7 @@ void MartianScripts::cmdSpecial7() {
 	_vm->_events->pollEvents();
 }
 
-void MartianScripts::executeSpecial(int commandIndex, int param1, int param2) {
+bool MartianScripts::executeSpecial(int commandIndex, int param1, int param2) {
 	switch (commandIndex) {
 	case 0:
 		cmdSpecial0();
@@ -370,6 +370,7 @@ void MartianScripts::executeSpecial(int commandIndex, int param1, int param2) {
 	default:
 		warning("Unexpected Special code %d - Skipped", commandIndex);
 	}
+	return false;
 }
 
 typedef void(MartianScripts::*MartianScriptMethodPtr)();
diff --git a/engines/access/martian/martian_scripts.h b/engines/access/martian/martian_scripts.h
index a1f9f495db5..b172a4dadf3 100644
--- a/engines/access/martian/martian_scripts.h
+++ b/engines/access/martian/martian_scripts.h
@@ -47,7 +47,7 @@ private:
 	void cmdSpecial7();
 
 protected:
-	void executeSpecial(int commandIndex, int param1, int param2) override;
+	bool executeSpecial(int commandIndex, int param1, int param2) override;
 	void executeCommand(int commandIndex) override;
 
 public:
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 152e1235af8..87526b1d11a 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -615,7 +615,7 @@ void NoctropolisEngine::playStilMorph() {
 	_screen->fadeOut();
 	_screen->clearScreen();
 	warning("TODO: Implement Noctropolis type video player");
-	//playVideo("VID1\\DRLM00.VID", 118, 118, true, true, true);
+	//playVideo("VID1/DRLM00.VID", 118, 118, true, true, true);
 }
 
 void NoctropolisEngine::flashPaletteEffect() {
@@ -646,15 +646,15 @@ void NoctropolisEngine::shotoMeanwhile() {
 	_bubbleBox->_bubbleTitle = ((NoctropolisResources *)_res)->getShotoTitle();
 	_bubbleBox->placeBubble(((NoctropolisResources *)_res)->getShotoText());
 	_events->waitKeyActionMouse();
-	warning("TODO: Implement Noctropolis type video player");
-	//playVideo("VID1\\B126MEAN.VID", 120, 30, false, true, true);
+	warning("TODO: Implement Noctropolis type video player (shotoMeanwhile)");
+	//_video->setVideo(_screen, Common::Point(120, 30), "VID1/B126MEAN.VID", 10); //, , false, true, true);
 	_midi->stopSong();
 	_screen->fadeOut();
 	_system->showMouse(true);
 }
 
 void NoctropolisEngine::makeVidPaletteCurrent() {
-	warning("TODO: Implement Noctropolis type video player");
+	warning("TODO: Implement Noctropolis type video player (makeVidPaletteCurrent)");
 	//copyPaletteRange(_video->getPalette(), 0, 256);
 	_screen->setPalette();
 }
@@ -668,8 +668,7 @@ void NoctropolisEngine::showComicCover() {
 	_system->updateScreen();
 	_system->delayMillis(300 * 17);
 	_midi->stopSong();
-	_screen->fadeOut();
-	_screen->clearScreen();
+	_screen->fadeOutThenClearAndSetPal();
 }
 
 void NoctropolisEngine::playSuccubusSplit() {
@@ -677,10 +676,10 @@ void NoctropolisEngine::playSuccubusSplit() {
 	_midi->loadMusic(98, 25);
 	_midi->midiPlay();
 	_screen->clearScreen();
-	warning("TODO: Implement Noctropolis type video player");
-	//playVideo("VID1\\SUCSPLT1.VID", 116, 2, false, true);
+	warning("TODO: Implement Noctropolis type video player (playSuccubusSplit)");
+	//playVideo("VID1/SUCSPLT1.VID", 116, 2, false, true);
 	_midi->stopSong();
-	_screen->fadeOut();
+	_screen->fadeOutThenClearAndSetPal();
 }
 
 void NoctropolisEngine::playSuccubusAttack() {
@@ -688,18 +687,24 @@ void NoctropolisEngine::playSuccubusAttack() {
 	_midi->loadMusic(98, 4);
 	_midi->midiPlay();
 	_screen->fadeOut();
-	_files->loadScreen(Common::Path("scene06.scn")); // "\\DARK\\SCENE06.SCN"
+	_files->loadScreen(Common::Path("scene06.scn")); // "DARK/SCENE06.SCN"
 	_screen->fadeIn();
 	_system->updateScreen();
 	_system->delayMillis(60 * 17);
-	warning("TODO: Implement Noctropolis type video player");
-	//playVideo("VID1\\SUCATT1.VID", 118, 118, false, false);
+	VideoPlayer_v2 vidPlayer(this);
+
+	warning("FIXME: NoctropolisEngine::playSuccubusAttack - fix video playback speed.");
+	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(118, 118), Common::Path("VID1/SUCATT1.VID"), 15);
+	vidPlayer.playToEnd();
+
 	_screen->clearScreen();
-	warning("TODO: Implement Noctropolis type video player");
+	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(196, 96), Common::Path ("VID1/SUCATT2.VID"), 15);
+	vidPlayer.playToEnd();
+
 	//playVideo("VID1\\SUCATT2.VID", 196, 96, false, false);
 	_sound->playSound(1);
 	_midi->stopSong();
-	_screen->fadeOut();
+	_screen->fadeOutThenClearAndSetPal();
 }
 
 void NoctropolisEngine::doLastComic() {
@@ -709,7 +714,7 @@ void NoctropolisEngine::doLastComic() {
 	viewer->run(comic);
 	delete viewer;
 	delete comic;
-	_screen->fadeOut();
+	_screen->fadeOutThenClearAndSetPal();
 }
 
 void NoctropolisEngine::doSpecialComic() {
@@ -719,7 +724,7 @@ void NoctropolisEngine::doSpecialComic() {
 	viewer->run(comic);
 	delete viewer;
 	delete comic;
-	_screen->fadeOut();
+	_screen->fadeOutThenClearAndSetPal();
 }
 
 
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index ad67db391bc..3baa4f2c8e4 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -105,10 +105,12 @@ void NoctropolisRoom::reloadRoom1() {
 	buildScreen();
 	_vm->copyBF2Vid();
 
-	if (_roomFlag) {
+	// TODO: Work out if this is right - the second room has roomflag 0 so maybe not??
+	if (_roomFlag >= 0) {
 		if (_roomFlag & kRoomFlagStiletto)
 			_vm->_screen->setStilPalette();
 		_vm->_screen->setManPalette();
+		_vm->_screen->setPalette();
 	}
 	_vm->_player->_frame = 0;
 	_vm->_oldRects.clear();
@@ -207,7 +209,7 @@ void NoctropolisRoom::doCommands() {
 		}
 
 		if (_vm->_player->_roomNumber == 59 && _selectCommand == kNoctCmdGetTake && hotspotIndex == 3) {
-			_conFlag = true;
+			_vm->_scripts->_continuenceFlag = true;
 			_vm->_scripts->_continuenceType = 3;
 			error("TODO: Implement room 59 hack from original?");
 		}
@@ -242,7 +244,6 @@ void NoctropolisRoom::doCommands() {
 					_selectCommand = kNoctCmdGoto;
 				_vm->_events->debounceLeft();
 				if (_selectCommand != -1) {
-					_conFlag = true;
 					_vm->_scripts->executeScript();
 				}
 			}
@@ -259,24 +260,23 @@ int NoctropolisRoom::checkPlayerBox(const Common::Point &pt) {
 	if (!_vm->_player->_playerOff) {
 		_vm->_player->calcManScale();
 		if (_vm->_player->_rawPlayer.x <= pt.x) {
-			byte bVar1 = _roomFlag >> 2 & 1;
-			long lVar3 = 200;
-			if (bVar1 != 0) {
-				lVar3 = 6;
-			}
-			long lVar2 = 0x3c;
-			if (bVar1 != 0) {
-				lVar2 = 6;
-			}
-			if (((pt.y <= _vm->_player->_rawPlayer.y) && ((_vm->_player->_rawPlayer.y - _vm->_screen->_scaleTable1[lVar3]) <= pt.y)) &&
-				(pt.x <= (_vm->_player->_rawPlayer.x + _vm->_screen->_scaleTable1[lVar2]))) {
+			int scaleY = 200;
+			if (_roomFlag & kRoomFlagTopView)
+				scaleY = 6;
+
+			int scaleX = 60;
+			if (_roomFlag & kRoomFlagTopView)
+				scaleX = 6;
+
+			if (((pt.y <= _vm->_player->_rawPlayer.y) && ((_vm->_player->_rawPlayer.y - _vm->_screen->_scaleTable1[scaleY]) <= pt.y)) &&
+				(pt.x <= (_vm->_player->_rawPlayer.x + _vm->_screen->_scaleTable1[scaleX]))) {
 				_plotter._blockIn = 99;
 				return 0;
 			}
 		}
 	}
 
-	if (_vm->_flags[0xcd] == 1 || (_roomFlag & 2) == 0 || _vm->_flags[0xea] != 2)
+	if (_vm->_flags[0xcd] == 1 || (_roomFlag & kRoomFlagStiletto) == 0 || _vm->_flags[0xea] != 2)
 		return 1;
 
 	Player *stil = ((NoctropolisEngine *)_vm)->_stil;
@@ -331,6 +331,9 @@ void NoctropolisRoom::mainAreaLClick() {
 }
 
 int NoctropolisRoom::validateBox(int boxId) {
+	_vm->_scripts->_continuenceFlag = false;
+	_vm->_scripts->_continuenceType = 0;
+
 	int result = Room::validateBox(boxId);
 
 	//debug("NoctRoom::validateBox(%d) -> %d", boxId, result);
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index d9219f7cb20..20d797d1fbd 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -97,11 +97,24 @@ void NoctropolisScripts::searchForSequence() {
 }
 
 
-void NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2) {
+bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2) {
 	NoctropolisEngine *vm = ((NoctropolisEngine *)_vm);
+	bool result = false;
 	switch (commandIndex) {
 	case 1:
-		vm->_screen->fadeOut();
+		// Clear screen and restore pal here??
+		vm->_screen->fadeOutThenClearAndSetPal();
+		result = true;
+		if (_vm->_player->_roomNumber == 0x36) {
+			error("TODO: Implement special pal hack for fade in room 0x36?");
+			/*
+			NoctPal_ClearRawPalette();
+			pbVar4 = GetRawPalette();
+			uVar3 = GetRawPaletteHash();
+			RB_GetPlayfieldTexture(pbVar4,uVar3);
+			NoctRoomEngine::clearPlotVids(&_gNoctRoomEngine);
+			*/
+		}
 		break;
 	case 3:
 		vm->displayPegsTick();
@@ -154,13 +167,16 @@ void NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 		_vm->_screen->flashPalette(20);
 	case 20:
 		vm->doLastComic();
+		result = true;
 		break;
 	case 21:
 		vm->doSpecialComic();
+		result = true;
 		break;
 	default:
 		error("TODO: Unknown special %d in NoctropolisScripts::executeSpecial", commandIndex);
 	}
+	return result;
 }
 
 
diff --git a/engines/access/noctropolis/noctropolis_scripts.h b/engines/access/noctropolis/noctropolis_scripts.h
index 5959b272a1f..a8386265a9c 100644
--- a/engines/access/noctropolis/noctropolis_scripts.h
+++ b/engines/access/noctropolis/noctropolis_scripts.h
@@ -34,7 +34,7 @@ class NoctropolisScripts : public Scripts {
 public:
 	NoctropolisScripts(NoctropolisEngine *vm);
 
-	void executeSpecial(int commandIndex, int param1, int param2) override;
+	bool executeSpecial(int commandIndex, int param1, int param2) override;
 
 	void searchForSequence() override;
 
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 5249dcd4de3..c5ef2b001db 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -161,6 +161,7 @@ void Room::takePicture() {
 }
 
 void Room::doRoom() {
+	// In noctropolis the main loop here is called NoctRoomEngine::roomMainLoop()
 	bool reloadFlag = false;
 
 	// Noctropolis doesn't have an icon bar at the bottom, so never set arrow cursor
@@ -182,6 +183,7 @@ void Room::doRoom() {
 		_vm->_screen->_fadeIn = false;
 
 		while (!_vm->shouldQuit()) {
+			// NoctRoomEngine::ticker in Noctropolis
 			_vm->_images.clear();
 			if (_vm->_screen->_fadeIn) {
 				_vm->_events->showCursor();
@@ -194,59 +196,83 @@ void Room::doRoom() {
 			_vm->_events->pollEventsAndWait();
 			_vm->_canSaveLoad = false;
 
-			if ((_vm->getGameID() == kGameMartianMemorandum) && (_vm->_player->_roomNumber == 47)) {
-				takePicture();
-			} else {
-				_vm->_player->walk();
-				_vm->_midi->midiRepeat();
-				_vm->_player->checkScroll();
-			}
+			// FIXME: cont flag usage..
+			/*if (_vm->_scripts->_continuenceFlag) {
+				if (_vm->_scripts->_continuenceType == 3)
+					cmdExitContinuance();
+				else if (_vm->_scripts->_continuenceType == 1)
+					roomLoopContinuance();
+				else if (_vm->_scripts->_continuenceType != 2)
+					error("Room state error: unhandled script continuance type");
+				_vm->_scripts->_continuenceFlag = false;
+			} else*/
+			{
+				if ((_vm->getGameID() == kGameMartianMemorandum) && (_vm->_player->_roomNumber == 47)) {
+					takePicture();
+				} else {
+					_vm->_player->walk();
+					if (_vm->getGameID() == kGameNoctropolis)
+						((Noctropolis::NoctropolisEngine *)_vm)->_stil->walk();
+					_vm->_midi->midiRepeat();
+					_vm->_player->checkScroll();
+				}
 
-			_vm->_canSaveLoad = true;
-			doCommands();
-			_vm->_canSaveLoad = false;
-			if (_vm->shouldQuitOrRestart())
-				return;
+				_vm->_canSaveLoad = true;
+				doCommands();
+				_vm->_canSaveLoad = false;
+				if (_vm->shouldQuitOrRestart())
+					return;
+
+				// The code after this point is:
+				// DOROOMFLASHBACK jump point in Amazon
+				// NoctRoomEngine::afterDoCommandsTick in Noctropolis
 
-			// DOROOMFLASHBACK jump point in Amazon
-			// afterDoCommandsTick in Noctropolis
-			if (_vm->getGameID() == kGameNoctropolis) {
-				// TODO: Need to check the
-				if (_vm->_flags[200] && !_vm->_timers[0x12]._flag) {
-					warning("TODO: Work out when to call DeadMeat1");
+				if (_vm->getGameID() == kGameNoctropolis) {
+					// TODO: Need to check the
+					if (_vm->_flags[200] && !_vm->_timers[0x12]._flag) {
+						warning("TODO: Work out when to call DeadMeat1");
+					}
 				}
-			}
 
-			if (_function == FN_CLEAR1) {
-				if (_vm->getGameID() == kGameNoctropolis)
-					_vm->_screen->fadeOut();
-				clearRoom();
-				break;
-			} else if (_function == FN_CLEAR2) {
-				clearRoom();
-				if (_vm->getGameID() == kGameNoctropolis)
-					((Noctropolis::NoctropolisEngine *)_vm)->doTravel();
-				return;
-			} else if (_function == FN_RELOAD) {
-				reloadRoom1();
-				// WORKAROUND: This doesn't seem to restore the palette
-				// correctly in MM abduction scene (special 0)
-				if (_vm->getGameID() == kGameMartianMemorandum)
-					_vm->_screen->setPalette();
-				reloadFlag = true;
-				break;
-			} else if (_function == FN_BREAK) {
-				break;
+				if (_function == FN_CLEAR1) {
+					if (_vm->getGameID() == kGameNoctropolis)
+						_vm->_screen->fadeOut();
+					clearRoom();
+					break;
+				} else if (_function == FN_CLEAR2) {
+					clearRoom();
+					if (_vm->getGameID() == kGameNoctropolis)
+						((Noctropolis::NoctropolisEngine *)_vm)->doTravel();
+					return;
+				} else if (_function == FN_RELOAD) {
+					reloadRoom1();
+					// WORKAROUND: This doesn't seem to restore the palette
+					// correctly in MM abduction scene (special 0)
+					if (_vm->getGameID() == kGameMartianMemorandum)
+						_vm->_screen->setPalette();
+					reloadFlag = true;
+					break;
+				} else if (_function == FN_BREAK) {
+					break;
+				}
+
+
+				_vm->copyBF1BF2();
+				_vm->_newRects.clear();
+				_function = FN_NONE;
+				roomLoop();
 			}
+			
+			// Back to NoctRoomEngine::roomMainLoop in Noctropolis..
+			//if (_vm->_scripts->_continuenceFlag)
+			//	continue;
+				
+			_vm->_scripts->_continuenceType = 0;
 
 			if (_vm->_player->_scrollFlag) {
 				// TODO: Refactor a bit - the first 8 lines here are identical
 				// in both branches, but for now maintain original logic for
 				// ease of RE comparison
-				_vm->copyBF1BF2();
-				_vm->_newRects.clear();
-				_function = FN_NONE;
-				roomLoop();
 
 				if (_function == FN_CLEAR1) {
 					clearRoom();
@@ -263,10 +289,6 @@ void Room::doRoom() {
 					_vm->copyBF2Vid();
 				}
 			} else {
-				_vm->copyBF1BF2();
-				_vm->_newRects.clear();
-				_function = FN_NONE;
-				roomLoop();
 				if (_vm->shouldQuitOrRestart())
 					return;
 
@@ -290,7 +312,7 @@ void Room::doRoom() {
 
 void Room::roomInit() {
 	_vm->_animation->clearTimers();
-	_conFlag = false;
+	_vm->_scripts->_continuenceFlag = false;
 	_vm->_scripts->_continuenceType = 0;
 	_vm->_scripts->_sequence = INIT_ROOM_SCRIPT;
 	_vm->_scripts->searchForSequence();
@@ -402,12 +424,38 @@ void Room::loadRoomData(const byte *roomData) {
 
 void Room::roomLoop() {
 	_vm->_scripts->_continuenceType = 1;
-	_conFlag = false;
+	_vm->_scripts->_continuenceFlag = false;
 	_vm->_scripts->_sequence = ROOM_SCRIPT;
 	_vm->_scripts->searchForSequence();
 	_vm->_scripts->executeScript();
 }
 
+void Room::cmdExitContinuance() {
+	_vm->_scripts->_continuenceType = 3;
+	_vm->_scripts->_continuenceFlag = false;
+	_vm->_scripts->executeScript();
+	if (!_vm->_scripts->_continuenceFlag) {
+		_vm->_boxSelect = -1;
+		warning("TODO: Room::cmdExitContinuance: check and clear double click.");
+		/*
+		if (DidDblClick) {
+			if (PrevSelectCommand != 0xff)
+				_SelectCommand = PrevSelectCommand;
+			DidDblClick = false;
+		}
+		*/
+		_vm->_scripts->_continuenceType = 2;
+		_vm->_scripts->_continuenceFlag = true;
+	}
+}
+
+void Room::roomLoopContinuance() {
+	_vm->_scripts->_continuenceType = 1;
+	_vm->_scripts->_continuenceFlag = false;
+	if (!_vm->_scripts->_endFlag)
+		_vm->_scripts->executeScript();
+}
+
 void Room::setupRoom() {
 	Screen &screen = *_vm->_screen;
 	screen.setScaleTable(_vm->_scale);
@@ -818,7 +866,7 @@ void Room::executeCommand(int commandId) {
 		}
 	} else {
 		assert(_vm->getGameID() == kGameNoctropolis);
-		// See the code in NoctRoomEngine::afterDoCommandsTick
+		// See the code in NoctRoomEngine::afterDoCommandsTick / CheckCommand
 		if (commandId == Noctropolis::kNoctCmdInventory) {
 			while (!_vm->shouldQuitOrRestart()) {
 				Noctropolis::NoctropolisEngine *vm = (Noctropolis::NoctropolisEngine *)_vm;
@@ -833,7 +881,8 @@ void Room::executeCommand(int commandId) {
 				} else
 					break;
 			}
-			warning("TODO: Implement Noctropolis inventory");
+			_conFlag = false;
+			_vm->_scripts->_continuenceType = 0;
 		} else {
 			if (_vm->_exitBox)
 				_vm->_events->setCursor(CURSOR_NOCT_EXIT);
@@ -842,26 +891,32 @@ void Room::executeCommand(int commandId) {
 			else
 				_vm->_events->setCursor(CURSOR_ARROW);
 
+			_vm->_scripts->_continuenceFlag = false;
+			_vm->_scripts->_continuenceType = 0;
+
 			if (_selectCommand == Noctropolis::kNoctCmdTravel) {
 				_selectCommand = Noctropolis::kNoctCmdLook;
 				_vm->_scripts->_sequence = 5000;
 				_vm->_scripts->searchForSequence();
+				_vm->_scripts->_endFlag = false;
+				_vm->_scripts->_returnCode = 0;
 
-				_conFlag = true;
-				while (_conFlag && !_vm->shouldQuitOrRestart()) {
-					_conFlag = false;
+				while (!_vm->_scripts->_continuenceFlag && !_vm->_scripts->_endFlag && !_vm->shouldQuitOrRestart()) {
 					_vm->_scripts->executeScript();
 				}
 			} else if (_selectCommand == Noctropolis::kNoctCmdUse) {
 				_selectCommand = Noctropolis::kNoctCmdLook;
 				_vm->_scripts->_sequence = 10000;
 				_vm->_scripts->searchForSequence();
+				_vm->_scripts->_endFlag = false;
+				_vm->_scripts->_returnCode = 0;
 
-				_conFlag = true;
-				while (_conFlag && !_vm->shouldQuitOrRestart()) {
-					_conFlag = false;
+				while (!_vm->_scripts->_continuenceFlag && !_vm->_scripts->_endFlag && !_vm->shouldQuitOrRestart()) {
 					_vm->_scripts->executeScript();
 				}
+			} else {
+				_conFlag = false;
+				_vm->_scripts->_continuenceType = 0;
 			}
 		}
 	}
diff --git a/engines/access/room.h b/engines/access/room.h
index db001948278..61f2e1ccf1a 100644
--- a/engines/access/room.h
+++ b/engines/access/room.h
@@ -71,6 +71,9 @@ enum RoomFlag {
 class Room : public Manager {
 private:
 	void roomLoop();
+	
+	void cmdExitContinuance();
+	void roomLoopContinuance();
 
 	void commandOff();
 
@@ -140,7 +143,7 @@ public:
 	int _playFieldHeight;
 	byte *_tile;
 	int _selectCommand;
-	bool _conFlag; // aka _continuenceFlag
+	bool _conFlag; // not the same as script->_continuenceFlag which is used in Noctropolis
 	int _rMouse[10][2];
 public:
 	Room(AccessEngine *vm);
diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp
index 0abae446ae6..dd9b7faa6ce 100644
--- a/engines/access/screen.cpp
+++ b/engines/access/screen.cpp
@@ -266,6 +266,13 @@ void Screen::forceFadeIn() {
 	} while (repeatFlag);
 }
 
+void Screen::fadeOutThenClearAndSetPal() {
+	fadeOut();
+	clearScreen();
+	setPalette();
+}
+
+
 void Screen::copyBuffer(const byte *data) {
 	byte *destP = (byte *)getPixels();
 	Common::copy(data, data + (h * w), destP);
diff --git a/engines/access/screen.h b/engines/access/screen.h
index 2277a385b00..2300eee61fe 100644
--- a/engines/access/screen.h
+++ b/engines/access/screen.h
@@ -118,6 +118,11 @@ public:
 	void fadeOut() { forceFadeOut(); }
 	void fadeIn() { forceFadeIn(); }
 	void clearScreen();
+	
+	/**
+	 * Fade out, clear the screen, then restore the palette (Noctropolis)
+	 */
+	void fadeOutThenClearAndSetPal();
 
 	/**
 	 * Set the initial palette
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index a057370a8a0..5433e804f30 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -157,6 +157,7 @@ void Scripts::setOpcodes_v3() {
 	COMMAND_LIST[61] = &Scripts::cmdBD;
 	COMMAND_LIST[62] = &Scripts::cmdPlayVid1;
 	COMMAND_LIST[63] = &Scripts::cmdNull; // empty function CmdPRINTWITHOUT
+	COMMAND_LIST[71] = &Scripts::cmdFadeOut_v3;
 	COMMAND_LIST[74] = &Scripts::cmdCharWait;
 	COMMAND_LIST[75] = &Scripts::cmdUndoText;
 	COMMAND_LIST[76] = &Scripts::cmdResetAnim;
@@ -207,9 +208,11 @@ void Scripts::searchForSequence() {
 
 void Scripts::charLoop() {
 	bool endFlag = _endFlag;
+	_continuenceFlag = false;
+
 	int64 pos = _data->pos();
 
-	_sequence = 2000;
+	_sequence = ROOM_SCRIPT;
 	searchForSequence();
 	_vm->_images.clear();
 	_vm->_buffer2.copyBlock(&_vm->_buffer1, Common::Rect(0, 0, _vm->_buffer2.w, _vm->_buffer2.h));
@@ -294,7 +297,8 @@ int Scripts::executeScript() {
 		debugCN(1, kDebugScripts, "%04X %02X ", (int)_data->pos(), _scriptCommand - 0x80);
 
 		executeCommand(_scriptCommand - 0x80);
-	} while (!_endFlag && !_vm->shouldQuitOrRestart());
+		// FIXME: _continuenceFlag not being used correctly in callers yet..
+	} while (!_endFlag /*&& !_continuenceFlag */&& !_vm->shouldQuitOrRestart());
 
 	if (_data)
 		debugC(1, kDebugScripts, "** End script execution (return %d, at %d/%d bytes) **", _returnCode, (int)_data->pos(), (int)_data->size());
@@ -362,7 +366,7 @@ void Scripts::cmdEndObject_v3() {
 
 		printString(msg);
 	}
-	_vm->_room->_conFlag = true;
+	_continuenceFlag = true;
 	_endFlag = true;
 	_returnCode = 0;
 }
@@ -477,6 +481,8 @@ void Scripts::cmdPrint_v2() {
 	Common::String msg = _data->readString();
 	debugC(1, kDebugScripts, "cmdPrint_v2(msg=\"%s\")", msg.c_str());
 	printString(msg);
+	//if (_vm->getGameID() == kGameNoctropolis) ??
+	//	_continuenceFlag = true;
 }
 
 void Scripts::doCmdPrint_v1(const Common::String &msg) {
@@ -756,6 +762,9 @@ void Scripts::cmdSetAnim() {
 void Scripts::cmdDispInv_v1() {
 	debugC(1, kDebugScripts, "cmdDispInv_v1()");
 	_vm->_inventory->displayInv();
+
+	if (_vm->getGameID() == kGameNoctropolis)
+		_continuenceFlag = true;
 }
 
 void Scripts::cmdDispInv_v2() {
@@ -898,6 +907,8 @@ void Scripts::cmdSetVideo_v3() {
 void Scripts::cmdPlayVideo() {
 	debugC(1, kDebugScripts, "cmdPlayVideo()");
 	_vm->_video->playVideo();
+	if (_vm->getGameID() == kGameNoctropolis)
+		_continuenceFlag = true;
 }
 
 void Scripts::cmdPlotImage() {
@@ -1087,17 +1098,19 @@ void Scripts::cmdSpecial() {
 	int p1 = _data->readUint16LE();
 	int p2 = _data->readUint16LE();
 	debugC(1, kDebugScripts, "cmdSpecial(specialFunction=%d, p1=%d, p2=%d)", _specialFunction, p1, p2);
+	
+	AccessGameType game = _vm->getGameID();
 
-	if (_specialFunction == 1 || _vm->getGameID() == kGameMartianMemorandum) {
+	if ((game == kGameAmazon && _specialFunction == 1) || game == kGameMartianMemorandum) {
 		if (_vm->getGameID() == kGameAmazon && _vm->_establishTable[p2])
 			return;
 
 		_vm->_screen->savePalette();
 	}
 
-	executeSpecial(_specialFunction, p1, p2);
+	_continuenceFlag = executeSpecial(_specialFunction, p1, p2);
 
-	if (_specialFunction == 1 || _vm->getGameID() == kGameMartianMemorandum) {
+	if ((game == kGameAmazon && _specialFunction == 1) || game == kGameMartianMemorandum) {
 		_vm->_screen->restorePalette();
 		_vm->_room->_function = FN_RELOAD;
 
@@ -1163,7 +1176,7 @@ void Scripts::cmdPlayerSpeak() {
 	_vm->_bubbleBox->_bubbleTitle = title;
 
 	_vm->_bubbleBox->placeBubble(str);
-	_vm->_room->_conFlag = true;
+	_continuenceFlag = true;
 	findNull();
 	warning("TODO: Check rendering for cmdPlayerSpeak() box");
 }
@@ -1223,7 +1236,7 @@ void Scripts::cmdPlayerChoice() {
 	_choice = choice + 1;
 	_vm->_bubbleBox->clearBubbles();
 
-	_vm->_room->_conFlag = true;
+	_continuenceFlag = true;
 }
 
 void Scripts::cmdTexSpeak() {
@@ -1343,6 +1356,8 @@ void Scripts::cmdWait() {
 
 	_vm->_events->debounceLeft();
 	_vm->_events->zeroKeysActions();
+	if (_vm->getGameID() == kGameNoctropolis)
+		_continuenceFlag = true;
 }
 
 void Scripts::cmdSetConPos() {
@@ -1448,7 +1463,10 @@ void Scripts::cmdPrintWatch() {
 
 void Scripts::cmdDispAbout() {
 	debugC(1, kDebugScripts, "cmdDispAbout()");
-	_vm->_aboutBox->getList(Martian::ASK_TBL, _vm->_ask);
+	if (_vm->getGameID() != kGameMartianMemorandum)
+		error("TODO: Implement cmdDispAbout for Noctropolis - need ask tbl.");
+	const char *const *askTbl = Martian::ASK_TBL;
+	_vm->_aboutBox->getList(askTbl, _vm->_ask);
 	int btnSelected = 0;
 	int boxX = _vm->_aboutBox->doBox_v1(_vm->_startAboutItem, _vm->_startAboutBox, btnSelected);
 	_vm->_startAboutItem = _vm->_boxDataStart;
@@ -1459,6 +1477,9 @@ void Scripts::cmdDispAbout() {
 		_vm->_useItem = -1;
 	else
 		_vm->_useItem = _vm->_aboutBox->_tempListIdx[boxX];
+
+	if (_vm->getGameID() == kGameNoctropolis)
+		_continuenceFlag = true;
 }
 
 void Scripts::cmdPushLocation_v1() {
@@ -1527,6 +1548,16 @@ void Scripts::cmdFadeOut() {
 	_vm->_screen->forceFadeOut();
 }
 
+void Scripts::cmdFadeOut_v3() {
+	byte flag = _data->readByte();
+	debugC(1, kDebugScripts, "cmdFadeOut_v3(%d)", flag);
+	if (flag)
+		_vm->_screen->forceFadeIn();
+	else
+		_vm->_screen->forceFadeOut();
+	_continuenceFlag = true;
+}
+
 void Scripts::cmdEndVideo() {
 	debugC(1, kDebugScripts, "cmdEndVideo()");
 	_vm->_video->closeVideo();
@@ -1536,7 +1567,7 @@ void Scripts::cmdEndVideo() {
 void Scripts::cmdDigitalPlay() {
 	// Wait until the current sound has finished playing, then
 	// if subtitles are enabled wait for input
-	debugCN(1, kDebugScripts, "cmdDigitalPlay()");
+	debugC(1, kDebugScripts, "cmdDigitalPlay()");
 	while (_vm->_sound->isSFXPlaying() && !_vm->shouldQuit()) {
 		_vm->_events->pollEventsAndWait();
 	}
@@ -1544,11 +1575,11 @@ void Scripts::cmdDigitalPlay() {
 	if (!_vm->_sound->isSFXPlaying() && !_vm->shouldQuit() && _vm->_textFlag)
 		_vm->_events->waitKeyActionMouse();
 
-	_vm->_room->_conFlag = true;
+	_continuenceFlag = true;
 }
 
 void Scripts::cmdFillSound() {
-	debugCN(1, kDebugScripts, "cmdFillSound()");
+	debugC(1, kDebugScripts, "cmdFillSound()");
 	while (_vm->_sound->isSFXPlaying() && !_vm->shouldQuit()) {
 		_vm->_events->pollEventsAndWait();
 		Common::CustomEventType action;
@@ -1558,27 +1589,26 @@ void Scripts::cmdFillSound() {
 			break;
 		}
 	}
-	_vm->_room->_conFlag = true;
+	_continuenceFlag = true;
 }
 
 void Scripts::cmdPlayVid1() {
 	error("TODO: Implement Scripts::cmdPlayVid1");
-	_vm->_room->_conFlag = true;
+	_continuenceFlag = true;
 }
 
 void Scripts::cmdCharWait() {
 	int x = _data->readSint16LE();
 	int y = _data->readUint16LE();
 	Common::String msg = _data->readString();
-	debugCN(1, kDebugScripts, "cmdCharWait(%d, %d, '%s')", x, y, msg.c_str());
+	debugC(1, kDebugScripts, "cmdCharWait(%d, %d, '%s')", x, y, msg.c_str());
 
 	printString(msg);
-	_vm->_room->_conFlag = true;
-	error("TODO: Implement Scripts::cmdCharWait");
+	_continuenceFlag = true;
 }
 
 void Scripts::cmdUndoText() {
-	debugCN(1, kDebugScripts, "cmdUndoText()");
+	debugC(1, kDebugScripts, "cmdUndoText()");
 
 	// TODO: Restore music volume to 100%
 
@@ -1588,7 +1618,7 @@ void Scripts::cmdUndoText() {
 
 void Scripts::cmdResetAnim() {
 	byte animNum = _data->readByte();
-	debugCN(1, kDebugScripts, "cmdResetAnim(%d)", animNum);
+	debugC(1, kDebugScripts, "cmdResetAnim(%d)", animNum);
 	Animation *anim = _vm->_animation->findAnimation(animNum);
 	if (!anim)
 		error("cmdResetAnim: Invalid anim num %d", animNum);
@@ -1606,7 +1636,7 @@ void Scripts::cmdWalkTo() {
 	int16 x = _data->readSint16LE();
 	int16 y = _data->readSint16LE();
 	int16 dir = _data->readSint16LE();
-	debugCN(1, kDebugScripts, "cmdWalkTo(%d, %d, %d)", x, y, dir);
+	debugC(1, kDebugScripts, "cmdWalkTo(%d, %d, %d)", x, y, dir);
 
 	_vm->_player->_moveTo.x = x;
 	_vm->_player->_moveTo.y = y;
@@ -1640,12 +1670,13 @@ void Scripts::cmdSoundEnd() {
 
 void Scripts::cmdFadeWhite() {
 	error("TODO: Implement Scripts::cmdFadeWhite");
+	_continuenceFlag = true;
 }
 
 void Scripts::cmdGotoFrame() {
 	uint16 animNum = _data->readUint16LE();
 	uint16 frameNum = _data->readUint16LE();
-	debugCN(1, kDebugScripts, "cmdGotoFrame(%d, %d)", animNum, frameNum);
+	debugC(1, kDebugScripts, "cmdGotoFrame(%d, %d)", animNum, frameNum);
 	Animation *anim = _vm->_animation->findAnimation(animNum);
 	if (!anim)
 		error("cmdGotoFrame: Invalid anim num %d", animNum);
@@ -1654,7 +1685,7 @@ void Scripts::cmdGotoFrame() {
 
 void Scripts::cmdPlayerScale() {
 	_vm->_manScaleOff = _data->readUint16LE();
-	debugCN(1, kDebugScripts, "cmdPlayerScale(%d)", _vm->_manScaleOff);
+	debugC(1, kDebugScripts, "cmdPlayerScale(%d)", _vm->_manScaleOff);
 }
 
 void Scripts::cmdRestoreBlock() {
@@ -1662,14 +1693,14 @@ void Scripts::cmdRestoreBlock() {
 	int16 y = _data->readSint16LE();
 	int16 w = _data->readSint16LE();
 	int16 h = _data->readSint16LE();
-	debugCN(1, kDebugScripts, "cmdRestoreBlock(%d, %d, %d, %d)", x, y, w, h);
+	debugC(1, kDebugScripts, "cmdRestoreBlock(%d, %d, %d, %d)", x, y, w, h);
 	_vm->clearPlotImagesIn(x, y, w, h);
 	_vm->clearPlotVidsIn(x, y, w, h);
 	error("TODO: Implement Scripts::cmdRestoreBlock");
 }
 
 void Scripts::cmdCopyScnBuf() {
-	debugCN(1, kDebugScripts, "cmdCopyScnBuf()");
+	debugC(1, kDebugScripts, "cmdCopyScnBuf()");
 	_vm->_screen->update();
 }
 
@@ -1677,7 +1708,7 @@ void Scripts::cmdStilWalkTo() {
 	int16 x = _data->readSint16LE();
 	int16 y = _data->readSint16LE();
 	int16 dir = _data->readSint16LE();
-	debugCN(1, kDebugScripts, "cmdStilWalkTo(%d, %d, %d)", x, y, dir);
+	debugC(1, kDebugScripts, "cmdStilWalkTo(%d, %d, %d)", x, y, dir);
 
 	((Noctropolis::NoctropolisEngine*)_vm)->_stil->_moveTo.x = x;
 	((Noctropolis::NoctropolisEngine*)_vm)->_stil->_moveTo.y = y;
@@ -1697,17 +1728,17 @@ void Scripts::cmdStilWalkCheck() {
 }
 
 void Scripts::cmdStilOff() {
-	debugCN(1, kDebugScripts, "cmdStilOff()");
+	debugC(1, kDebugScripts, "cmdStilOff()");
 	((Noctropolis::NoctropolisEngine *)_vm)->_stil->_playerOff = true;
 }
 
 void Scripts::cmdStilOn() {
-	debugCN(1, kDebugScripts, "cmdStilOn()");
+	debugC(1, kDebugScripts, "cmdStilOn()");
 	((Noctropolis::NoctropolisEngine *)_vm)->_stil->_playerOff = false;
 }
 
 void Scripts::cmdReturnExit() {
-	debugCN(1, kDebugScripts, "cmdReturnExit()");
+	debugC(1, kDebugScripts, "cmdReturnExit()");
 	_vm->_exitBox = true;
 	_endFlag = true;
 	_returnCode = 0;
@@ -1733,28 +1764,28 @@ void Scripts::cmdSetStilCoords() {
 }
 
 void Scripts::cmdSetPlayerDir() {
-	debugCN(1, kDebugScripts, "cmdSetPlayerDir()");
+	debugC(1, kDebugScripts, "cmdSetPlayerDir()");
 	_vm->_player->_playerDirection = (Direction)_data->readByte();
 }
 
 void Scripts::cmdSetStilDir() {
-	debugCN(1, kDebugScripts, "cmdSetStilDir()");
+	debugC(1, kDebugScripts, "cmdSetStilDir()");
 	((Noctropolis::NoctropolisEngine *)_vm)->_stil->_playerDirection = (Direction)_data->readByte();
 }
 
 void Scripts::cmdStilScale() {
-	debugCN(1, kDebugScripts, "cmdStilScale()");
+	debugC(1, kDebugScripts, "cmdStilScale()");
 	_vm->_stilScale = _data->readUint16LE();
 }
 
 void Scripts::cmdLockInterface() {
-	debugCN(1, kDebugScripts, "cmdLockInterface()");
+	debugC(1, kDebugScripts, "cmdLockInterface()");
 	_vm->_events->_interfaceOff = true;
 	_vm->_events->setCursor(CURSOR_DARK_ANKH);
 }
 
 void Scripts::cmdUnlockInterface() {
-	debugCN(1, kDebugScripts, "cmdUnlockInterface()");
+	debugC(1, kDebugScripts, "cmdUnlockInterface()");
 	_vm->_events->_interfaceOff = false;
 	warning("TODO: cmdUnlockInterface - restore cursor");
 	_vm->_events->setCursor(CURSOR_ARROW);
diff --git a/engines/access/scripts.h b/engines/access/scripts.h
index 2d85c65438f..11b12a043fe 100644
--- a/engines/access/scripts.h
+++ b/engines/access/scripts.h
@@ -32,8 +32,8 @@ class AccessEngine;
 class Scripts;
 
 #define SCRIPT_START_BYTE 0xE0
-#define ROOM_SCRIPT 2000
 #define INIT_ROOM_SCRIPT 1000
+#define ROOM_SCRIPT 2000
 
 typedef void(Scripts::*ScriptMethodPtr)();
 
@@ -51,7 +51,7 @@ protected:
 	Common::SeekableReadStream *_data;
 	ScriptMethodPtr COMMAND_LIST[100];
 
-	virtual void executeSpecial(int commandIndex, int param1, int param2) = 0;
+	virtual bool executeSpecial(int commandIndex, int param1, int param2) = 0;
 	virtual void executeCommand(int commandIndex);
 
 	void charLoop();
@@ -140,6 +140,7 @@ protected:
 	void cmdPlayerOn();
 	void cmdDead();
 	void cmdFadeOut();
+	void cmdFadeOut_v3();
 	void cmdEndVideo();
 	void cmdHelp_v1();
 	//void cmdHelp_v2(); // only in AmazonScripts
@@ -185,7 +186,8 @@ public:
 	int32 _choiceStart;
 	Common::Point _charsOrg, _texsOrg;
 
-	int _continuenceType;  // only used in Noctropolis
+	int _continuenceType;  // Only used in Noctropolis
+	bool _continuenceFlag; // Only set in Noctropolis (always false otherwise). See also room->_conFlag which is used in earlier games.
 
 public:
 	Scripts(AccessEngine *vm);
diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index d6453e52eac..2e2a53c35ba 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -27,7 +27,8 @@
 namespace Access {
 
 VideoPlayer::VideoPlayer(AccessEngine *vm) : Manager(vm), _videoData(nullptr),
-_videoFrame(0), _soundFrame(0), _videoEnd(false), _soundFlag(false), _vidSurface(nullptr) {
+_videoFrame(0), _soundFrame(0), _videoEnd(false), _soundFlag(false), _vidSurface(nullptr),
+_rate(0) {
 }
 
 VideoPlayer::~VideoPlayer() {
@@ -39,7 +40,8 @@ void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, con
 	_videoData = _vm->_files->loadRawFile(filename);
 
 	_vidSurface = vidSurface;
-	setVideo(pt, rate);
+	_rate = rate;
+	setVideo(pt);
 }
 
 void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, const FileIdent &videoFile, int rate) {
@@ -47,7 +49,8 @@ void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, con
 	_videoData = _vm->_files->loadFile(videoFile);
 
 	_vidSurface = vidSurface;
-	setVideo(pt, rate);
+	_rate = rate;
+	setVideo(pt);
 }
 
 void VideoPlayer::closeVideo() {
@@ -55,6 +58,15 @@ void VideoPlayer::closeVideo() {
 	_videoData = nullptr;
 }
 
+void VideoPlayer::playToEnd() {
+	while (!_vm->shouldQuit() && _videoData && !_videoEnd) {
+		playVideo();
+		_vm->_events->pollEvents();
+		// TODO: This is not very exact, should calculate expected frame time etc.
+		_vm->_events->delay(1000 / _rate - 20);
+	}
+}
+
 ////////////////////////////////////
 
 VideoPlayer_v1::VideoPlayer_v1(AccessEngine *vm) : VideoPlayer(vm) {
@@ -72,11 +84,11 @@ VideoPlayer_v1::VideoPlayer_v1(AccessEngine *vm) : VideoPlayer(vm) {
 }
 
 
-void VideoPlayer_v1::setVideo(const Common::Point &pt, int rate) {
+void VideoPlayer_v1::setVideo(const Common::Point &pt) {
 	_vidSurface->_orgX1 = pt.x;
 	_vidSurface->_orgY1 = pt.y;
-	_vm->_timers[31]._timer = rate;
-	_vm->_timers[31]._initTm = rate;
+	_vm->_timers[31]._timer = _rate;
+	_vm->_timers[31]._initTm = _rate;
 
 	// Load in header
 	_header._frameCount = _videoData->_stream->readUint16LE();
@@ -214,10 +226,11 @@ void VideoPlayer_v1::copyVideo() {
 
 //////////////////////////////////////////////////
 
-VideoPlayer_v2::VideoPlayer_v2(AccessEngine *vm) : VideoPlayer(vm), _audioStream(nullptr), _frame(nullptr) {
+VideoPlayer_v2::VideoPlayer_v2(AccessEngine *vm) : VideoPlayer(vm), _audioStream(nullptr),
+_frame(nullptr), _nextFrameTime(0) {
 }
 
-void VideoPlayer_v2::setVideo(const Common::Point &pt, int rate) {
+void VideoPlayer_v2::setVideo(const Common::Point &pt) {
 	_header._id = _videoData->_stream->readUint32LE();
 	_header._version = _videoData->_stream->readByte();
 	_header._frameCount = _videoData->_stream->readUint16LE();
@@ -242,6 +255,9 @@ void VideoPlayer_v2::setVideo(const Common::Point &pt, int rate) {
 }
 
 void VideoPlayer_v2::playVideo() {
+	if (_videoEnd || !_videoData)
+		return;
+
 	debugC(kDebugGraphics, "VideoPlayer_v2::handleChunk() %08X", (int)_videoData->_stream->pos());
 
 	byte type = _videoData->_stream->readByte();
@@ -249,16 +265,24 @@ void VideoPlayer_v2::playVideo() {
 	debugC(kDebugGraphics, "VideoPlayer_v2::handleChunk() type = %d; _currFrame = %d; frameCount = %d", type, _videoFrame, _header._frameCount);
 
 	switch (type) {
+		case 0:
+			// This may be a bug in our decoder - it seems to be
+			// correctly handled if we just skip?
+			//handleStraitChunk();
+			break;
 		case 1:
+			// aka doDiff
 			handleFrameChunk(true, false);
 			break;
 		case 2:
 			handlePaletteChunk();
 			break;
 		case 3:
+			// aka doComp
 			handleFrameChunk(false, false);
 			break;
 		case 4:
+			// aka doDiff2
 			handleFrameChunk(true, true);
 			break;
 		case 0x7C:
@@ -269,10 +293,12 @@ void VideoPlayer_v2::playVideo() {
 			break;
 		case 0x14:
 			closeVideo();
+			_videoEnd = true;
 			break;
 		default:
 			warning("VideoPlayer_v2::handleChunk() Unknown chunk type %d at %08X", type, (int)_videoData->_stream->pos() - 1);
 			closeVideo();
+			_videoEnd = true;
 	}
 
 }
@@ -282,21 +308,26 @@ void VideoPlayer_v2::handlePaletteChunk() {
 	_videoData->_stream->read(_palette, 768);
 }
 
+void VideoPlayer_v2::calcNextFrameTime(int delay) {
+	uint32 lastFrameTime = _vm->_events->getPriorFrameTime();
+	_nextFrameTime = lastFrameTime + (delay * 1000) / 60 + _header._frameIncr * 1000 / 60;
+}
+
 void VideoPlayer_v2::handleFrameChunk(bool delta, bool skipLines) {
 	debugC(kDebugGraphics, "VideoPlayer_v2::handleFrameChunk(%d, %d)", delta, skipLines);
 
-	uint32 frameDelay;
 	uint32 frameSize = _header._width * _header._height;
 	byte *dest;
 
-	frameDelay = _videoData->_stream->readUint16LE();
+	uint32 frameDelay = _videoData->_stream->readUint16LE();
 	debugC(kDebugGraphics, "frameDelay = %d", frameDelay);
+	calcNextFrameTime(frameDelay);
 
 	const Common::Rect frameBounds(Common::Point(_vidSurface->_orgX1, _vidSurface->_orgY1), _frame->w, _frame->h);
 	if (_videoFrame == 0 && delta) {
 		// If it's the first frame, grab the background
 		// (in case the first video frame happens to be a delta frame)
-		_frame->copyBlock(_vidSurface, frameBounds);
+		_frame->blitFrom(*_vidSurface, frameBounds, Common::Point());
 	}
 
 	if (skipLines) {
@@ -328,11 +359,39 @@ void VideoPlayer_v2::handleFrameChunk(bool delta, bool skipLines) {
 	}
 
 	// Draw the video frame
-	_vidSurface->copyBlock(_frame, frameBounds);
+	_vidSurface->blitFrom(*_frame, Common::Point(_vidSurface->_orgX1, _vidSurface->_orgY1));
+	_vidSurface->addDirtyRect(frameBounds);
+
+	_videoFrame++;
+	if (_videoFrame >= _header._frameCount) {
+		_videoEnd = true;
+		closeVideo();
+	}
+}
+
+void VideoPlayer_v2::handleStraitChunk() {
+	debugC(kDebugGraphics, "VideoPlayer_v2::handleStrait()");
+
+	uint32 frameDelay = _videoData->_stream->readUint16LE();
+	debugC(kDebugGraphics, "frameDelay = %d", frameDelay);
+	calcNextFrameTime(frameDelay);
+
+	byte *dest = (byte*)_frame->getBasePtr(0, 0);
+	for (int y = 0; y < _frame->h; y++) {
+		_videoData->_stream->read(dest, _frame->w);
+		dest += _frame->pitch;
+	}
+
+	// Draw the video frame
+	const Common::Rect frameBounds(Common::Point(_vidSurface->_orgX1, _vidSurface->_orgY1), _frame->w, _frame->h);
+	_vidSurface->blitFrom(*_frame, Common::Point(_vidSurface->_orgX1, _vidSurface->_orgY1));
+	_vidSurface->addDirtyRect(frameBounds);
 
 	_videoFrame++;
-	if (_videoFrame >= _header._frameCount)
+	if (_videoFrame >= _header._frameCount) {
+		_videoEnd = true;
 		closeVideo();
+	}
 }
 
 void VideoPlayer_v2::handleSoundChunk(bool init) {
@@ -372,6 +431,4 @@ void VideoPlayer_v2::closeVideo() {
 }
 
 
-
-
 } // End of namespace Access
diff --git a/engines/access/video.h b/engines/access/video.h
index 175473a3ade..f30817c2e29 100644
--- a/engines/access/video.h
+++ b/engines/access/video.h
@@ -57,8 +57,10 @@ public:
 	 */
 	virtual void closeVideo();
 
+	void playToEnd();
+
 protected:
-	virtual void setVideo(const Common::Point &pt, int rate) = 0;
+	virtual void setVideo(const Common::Point &pt) = 0;
 
 	Resource *_videoData;
 	BaseSurface *_vidSurface;
@@ -68,7 +70,7 @@ public:
 	bool _soundFlag;
 	int _soundFrame;
 	bool _videoEnd;
-
+	int _rate;
 };
 
 
@@ -89,7 +91,7 @@ private:
 
 	void getFrame();
 protected:
-	void setVideo(const Common::Point &pt, int rate) override;
+	void setVideo(const Common::Point &pt) override;
 
 public:
 	VideoPlayer_v1(AccessEngine *vm);
@@ -113,16 +115,20 @@ private:
 	VideoHeader _header;
 	BaseSurface *_frame;
 	byte _palette[768];
+	uint32 _nextFrameTime;
 
 	Audio::QueuingAudioStream *_audioStream;
 	Audio::SoundHandle _audioStreamHandle;
 
+	void handleStraitChunk();
 	void handlePaletteChunk();
 	void handleFrameChunk(bool delta, bool skipLines);
 	void handleSoundChunk(bool init);
 
+	void calcNextFrameTime(int delay);
+
 protected:
-	void setVideo(const Common::Point &pt, int rate) override;
+	void setVideo(const Common::Point &pt) override;
 
 public:
 	VideoPlayer_v2(AccessEngine *vm);


Commit: 035dafef0460cc5ce8852ecb92d36824bb4d723b
    https://github.com/scummvm/scummvm/commit/035dafef0460cc5ce8852ecb92d36824bb4d723b
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix access video timing a bit

Changed paths:
    engines/access/bubble_box.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/scripts.cpp
    engines/access/video.cpp
    engines/access/video.h


diff --git a/engines/access/bubble_box.cpp b/engines/access/bubble_box.cpp
index ab522e27283..6089b1b53ff 100644
--- a/engines/access/bubble_box.cpp
+++ b/engines/access/bubble_box.cpp
@@ -413,12 +413,9 @@ void BubbleBox::doBox_v3(int item, int box) {
 		font->drawString(&screen, _bubbleDisplStr, Common::Point(boxX + 14, boxY + 10));
 	}
 
-	/*if (boxDimensions) {
-		boxDimensions->x = boxX;
-		boxDimensions->y = boxY;
-		boxDimensions->width = boxWidth;
-		boxDimensions->height = boxHeight;
-	}*/
+	// Update the bounds now they are fully calculated.
+	_bubbles.back() = _bounds;
+
 	_vm->_screen->restoreScreen();
 }
 
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 87526b1d11a..c8345aa843c 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -683,6 +683,9 @@ void NoctropolisEngine::playSuccubusSplit() {
 }
 
 void NoctropolisEngine::playSuccubusAttack() {
+	//warning("FIXME: NoctropolisEngine::playSuccubusAttack - skipping for testing.");
+	//return;
+
 	_midi->stopSong();
 	_midi->loadMusic(98, 4);
 	_midi->midiPlay();
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 5433e804f30..fa552d6e616 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -1199,17 +1199,20 @@ void Scripts::cmdPlayerChoice() {
 
 	debugC(1, kDebugScripts, "cmdPlayerChoice(%d, %d, ..(%d choices)..)", x, startY, choiceStrs.size());
 
+	_vm->_screen->_printStart = _vm->_screen->_printOrg = Common::Point(x, startY);
+
 	_vm->_events->setCursor(CURSOR_ARROW);
 	const char *respTitle = ((Noctropolis::NoctropolisResources *)_vm->_res)->getResponseTitle();
 	Common::Array<Common::Rect> responseCoords;
 
 	for (uint i = 0; i < choiceStrs.size(); i++) {
 		_vm->_bubbleBox->_bubbleDisplStr = Common::String::format(respTitle, i + 1);
+		_vm->_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctPlain);
 		_vm->_bubbleBox->calcBubble(choiceStrs[i]);
 		_vm->_bubbleBox->printBubble(choiceStrs[i]);
 		responseCoords.push_back(_vm->_bubbleBox->_bounds);
-		_vm->_screen->_printOrg.y = _vm->_bubbleBox->_bounds.bottom + startY;
-		startY = _vm->_bubbleBox->_bounds.bottom + 10;
+		_vm->_screen->_printOrg.y = _vm->_bubbleBox->_bounds.bottom + 10;
+		_vm->_screen->_printOrg.x = _vm->_screen->_printStart.x;
 	}
 
 	int choice = -1;
@@ -1218,8 +1221,6 @@ void Scripts::cmdPlayerChoice() {
 		if (_vm->shouldQuit())
 			return;
 
-		charLoop();
-
 		_vm->_bubbleBox->_bubbleDisplStr = _vm->_bubbleBox->_bubbleTitle;
 		if (_vm->_events->_leftButton) {
 			if (_vm->_events->_mouseRow >= ((_vm->getGameID() == kGameMartianMemorandum) ? 23 : 22)) {
@@ -1696,7 +1697,6 @@ void Scripts::cmdRestoreBlock() {
 	debugC(1, kDebugScripts, "cmdRestoreBlock(%d, %d, %d, %d)", x, y, w, h);
 	_vm->clearPlotImagesIn(x, y, w, h);
 	_vm->clearPlotVidsIn(x, y, w, h);
-	error("TODO: Implement Scripts::cmdRestoreBlock");
 }
 
 void Scripts::cmdCopyScnBuf() {
diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index 2e2a53c35ba..84e6316e675 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -27,8 +27,7 @@
 namespace Access {
 
 VideoPlayer::VideoPlayer(AccessEngine *vm) : Manager(vm), _videoData(nullptr),
-_videoFrame(0), _soundFrame(0), _videoEnd(false), _soundFlag(false), _vidSurface(nullptr),
-_rate(0) {
+_videoFrame(0), _soundFrame(0), _videoEnd(false), _soundFlag(false), _vidSurface(nullptr) {
 }
 
 VideoPlayer::~VideoPlayer() {
@@ -40,8 +39,8 @@ void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, con
 	_videoData = _vm->_files->loadRawFile(filename);
 
 	_vidSurface = vidSurface;
-	_rate = rate;
 	setVideo(pt);
+	setRate(rate);
 }
 
 void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, const FileIdent &videoFile, int rate) {
@@ -49,8 +48,8 @@ void VideoPlayer::setVideo(BaseSurface *vidSurface, const Common::Point &pt, con
 	_videoData = _vm->_files->loadFile(videoFile);
 
 	_vidSurface = vidSurface;
-	_rate = rate;
 	setVideo(pt);
+	setRate(rate);
 }
 
 void VideoPlayer::closeVideo() {
@@ -63,7 +62,7 @@ void VideoPlayer::playToEnd() {
 		playVideo();
 		_vm->_events->pollEvents();
 		// TODO: This is not very exact, should calculate expected frame time etc.
-		_vm->_events->delay(1000 / _rate - 20);
+		delayToNextFrame();
 	}
 }
 
@@ -77,6 +76,7 @@ VideoPlayer_v1::VideoPlayer_v1(AccessEngine *vm) : VideoPlayer(vm) {
 	_xCount = 0;
 	_scanCount = 0;
 	_frameSize = 0;
+	_rate = 0;
 
 	_header._frameCount = 0;
 	_header._width = _header._height = 0;
@@ -191,6 +191,10 @@ void VideoPlayer_v1::playVideo() {
 	}
 }
 
+void VideoPlayer_v1::delayToNextFrame() {
+	_vm->_events->delay(1000 / _rate - 20);
+}
+
 void VideoPlayer_v1::copyVideo() {
 	// aka drawTalkVideoFrame
 	_vm->_player->calcPlayer();
@@ -319,6 +323,8 @@ void VideoPlayer_v2::handleFrameChunk(bool delta, bool skipLines) {
 	uint32 frameSize = _header._width * _header._height;
 	byte *dest;
 
+	delayToNextFrame();
+
 	uint32 frameDelay = _videoData->_stream->readUint16LE();
 	debugC(kDebugGraphics, "frameDelay = %d", frameDelay);
 	calcNextFrameTime(frameDelay);
@@ -416,7 +422,6 @@ void VideoPlayer_v2::handleSoundChunk(bool init) {
 	_audioStream->queueBuffer(soundData, soundSize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
 
 	debugC(kDebugGraphics, "soundSize = %d", soundSize);
-
 }
 
 
@@ -431,4 +436,13 @@ void VideoPlayer_v2::closeVideo() {
 }
 
 
+void VideoPlayer_v2::delayToNextFrame() {
+	if (!_nextFrameTime)
+		return;
+
+	while (_nextFrameTime > g_system->getMillis() && !_vm->shouldQuit()) {
+		_vm->_events->pollEventsAndWait();
+	}
+}
+
 } // End of namespace Access
diff --git a/engines/access/video.h b/engines/access/video.h
index f30817c2e29..45e62de457b 100644
--- a/engines/access/video.h
+++ b/engines/access/video.h
@@ -57,11 +57,18 @@ public:
 	 */
 	virtual void closeVideo();
 
+	/**
+	 * Play to the end of the video, handling events.
+	 */
 	void playToEnd();
 
 protected:
 	virtual void setVideo(const Common::Point &pt) = 0;
 
+	virtual void setRate(int rate) = 0;
+
+	virtual void delayToNextFrame() = 0;
+
 	Resource *_videoData;
 	BaseSurface *_vidSurface;
 
@@ -70,7 +77,6 @@ public:
 	bool _soundFlag;
 	int _soundFrame;
 	bool _videoEnd;
-	int _rate;
 };
 
 
@@ -88,11 +94,16 @@ private:
 	int _scanCount;
 	int _frameSize;
 	Common::Rect _videoBounds;
+	int _rate;
 
 	void getFrame();
 protected:
 	void setVideo(const Common::Point &pt) override;
 
+	void setRate(int rate) override { _rate = rate; }
+
+	void delayToNextFrame() override;
+
 public:
 	VideoPlayer_v1(AccessEngine *vm);
 
@@ -130,6 +141,9 @@ private:
 protected:
 	void setVideo(const Common::Point &pt) override;
 
+	void setRate(int rate) override { };
+
+	void delayToNextFrame() override;
 public:
 	VideoPlayer_v2(AccessEngine *vm);
 


Commit: d59b56d241e0c3e8fa4d3799bfbc7baa28fa5512
    https://github.com/scummvm/scummvm/commit/d59b56d241e0c3e8fa4d3799bfbc7baa28fa5512
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix noctropolis dialog clearing

Changed paths:
    engines/access/scripts.cpp


diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index fa552d6e616..edeada75527 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -509,7 +509,8 @@ void Scripts::printString(const Common::String &msg, Common::Point pt) {
 		_vm->_screen->_printOrg = _vm->_screen->_printStart = pt;
 		_vm->_timers[PRINT_TIMER]._timer = 50;
 		_vm->_timers[PRINT_TIMER]._initTm = 50;
-		++_vm->_timers[PRINT_TIMER]._flag;
+		// Don't enable the timer in Noctropolis, just wait for click?
+		// ++_vm->_timers[PRINT_TIMER]._flag;
 
 		_vm->_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctCenter);
 		if (_vm->_player->_roomNumber <= 4)


Commit: 7067f95b6c895ccaabaad3be5ceab99d7412e0c4
    https://github.com/scummvm/scummvm/commit/7067f95b6c895ccaabaad3be5ceab99d7412e0c4
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix noctropolis videos slightly

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/video.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index c8345aa843c..9c586d605d8 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -54,6 +54,9 @@ void NoctropolisEngine::initObjects() {
 
 	const Common::FSNode gameDataDir(ConfMan.getPath("path"));
 	SearchMan.addSubDirectoryMatching(gameDataDir, "comdata");
+
+	// Current defaults to screen in Noctropolis.
+	_current = _screen;
 }
 
 void NoctropolisEngine::setupGame() {
@@ -676,8 +679,9 @@ void NoctropolisEngine::playSuccubusSplit() {
 	_midi->loadMusic(98, 25);
 	_midi->midiPlay();
 	_screen->clearScreen();
-	warning("TODO: Implement Noctropolis type video player (playSuccubusSplit)");
-	//playVideo("VID1/SUCSPLT1.VID", 116, 2, false, true);
+	VideoPlayer_v2 vidPlayer(this);
+	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(116, 2), Common::Path("VID1/SUCATT1.VID"), 0);
+	vidPlayer.playToEnd();
 	_midi->stopSong();
 	_screen->fadeOutThenClearAndSetPal();
 }
@@ -696,12 +700,11 @@ void NoctropolisEngine::playSuccubusAttack() {
 	_system->delayMillis(60 * 17);
 	VideoPlayer_v2 vidPlayer(this);
 
-	warning("FIXME: NoctropolisEngine::playSuccubusAttack - fix video playback speed.");
-	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(118, 118), Common::Path("VID1/SUCATT1.VID"), 15);
+	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(118, 118), Common::Path("VID1/SUCATT1.VID"), 0);
 	vidPlayer.playToEnd();
 
 	_screen->clearScreen();
-	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(196, 96), Common::Path ("VID1/SUCATT2.VID"), 15);
+	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(196, 96), Common::Path ("VID1/SUCATT2.VID"), 0);
 	vidPlayer.playToEnd();
 
 	//playVideo("VID1\\SUCATT2.VID", 196, 96, false, false);
diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index 84e6316e675..4718c8148b2 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -58,9 +58,17 @@ void VideoPlayer::closeVideo() {
 }
 
 void VideoPlayer::playToEnd() {
+	Common::CustomEventType action = kActionNone;
 	while (!_vm->shouldQuit() && _videoData && !_videoEnd) {
 		playVideo();
 		_vm->_events->pollEvents();
+
+		_vm->_events->getAction(action);
+		if (action == kActionSkip) {
+			_videoEnd = true;
+			continue;
+		}
+
 		// TODO: This is not very exact, should calculate expected frame time etc.
 		delayToNextFrame();
 	}


Commit: ca6616db81aa776fea8bfd0d01259c5d5b39ede6
    https://github.com/scummvm/scummvm/commit/ca6616db81aa776fea8bfd0d01259c5d5b39ede6
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Many improvements, can now get to Noctropolis in the game.

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/access/bubble_box.cpp
    engines/access/bubble_box.h
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_resources.h
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/scripts.cpp
    engines/access/scripts.h


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 3e3afd8adaf..891ff4f3b13 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -104,6 +104,7 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_startTravelItem = _startTravelBox = 0;
 	ARRAYCLEAR(_ask);
 	_startAboutItem = _startAboutBox = 0;
+	_keepAskPosition = false;
 	_bcnt = 0;
 	_boxDataStart = 0;
 	_boxDataEnd = false;
@@ -113,7 +114,7 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_pictureTaken = 0;
 
 	_vidEnd = false;
-	_textFlag = false;
+	_textFlag = true;
 	_exitBox = false;
 
 	_icons = nullptr;
@@ -431,6 +432,7 @@ void AccessEngine::clearPlotImagesIn(int16 x, int16 y, int16 w, int16 h) {
 		Common::Rect imgRect(topLeft, frame->w, frame->h);
 		if (toClear.intersects(imgRect)) {
 			_images.remove_at(idx);
+			_screen->addDirtyRect(imgRect);
 			idx--;
 		}
 	}
diff --git a/engines/access/access.h b/engines/access/access.h
index ee42243f7fe..45da996dc07 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -275,6 +275,9 @@ public:
 	int _startTravelBox;
 	int _startAboutItem;
 	int _startAboutBox;
+
+	Common::Point _askBase; // Noctropolis only
+	bool _keepAskPosition;  // Noctropolis only
 	int _boxDataStart;
 	bool _boxDataEnd;
 	int _boxSelectY;
diff --git a/engines/access/bubble_box.cpp b/engines/access/bubble_box.cpp
index 6089b1b53ff..86a639ffa32 100644
--- a/engines/access/bubble_box.cpp
+++ b/engines/access/bubble_box.cpp
@@ -170,7 +170,7 @@ void BubbleBox::calcBubble(const Common::String &msg) {
 		int textWidth = _vm->_fonts.getFont(4)->stringWidth(msg);
 
 		if (_type & kTextBoxNoctCaption)
-			textHeight += _vm->_fonts.getFont(4)->stringHeight(_bubbleTitle) - 4;
+			textHeight += _vm->_fonts.getFont(4)->stringHeight(_bubbleDisplStr) - 4;
 
 		if (_type & kTextBoxNoctCenter) {
 			// Center the box
@@ -401,9 +401,9 @@ void BubbleBox::doBox_v3(int item, int box) {
 
 	font->_fontColors[0] = 0;
 	if (_type & kTextBoxNoctCaption) {
-		int captionWidth = font->stringWidth(_bubbleTitle);
+		int captionWidth = font->stringWidth(_bubbleDisplStr);
 		font->_fontColors[1] = 238;
-		font->drawString(&screen, _bubbleTitle, Common::Point(boxX + 14 + (boxWidth * 8) - (captionWidth / 2), boxY + 6));
+		font->drawString(&screen, _bubbleDisplStr, Common::Point(boxX + 14 + (boxWidth * 8) - (captionWidth / 2), boxY + 6));
 		_vm->_screen->_printOrg.x = boxX + 14;
 		_vm->_screen->_printOrg.y = boxY + 6 + fontHeight;
 		//font->_fontColors[1] = 255;
diff --git a/engines/access/bubble_box.h b/engines/access/bubble_box.h
index 958de19b9af..4e6801d2771 100644
--- a/engines/access/bubble_box.h
+++ b/engines/access/bubble_box.h
@@ -70,8 +70,8 @@ public:
 	BoxType _type;
 	Common::Rect _bounds;
 	Common::StringArray _nameIndex;
-	Common::String _bubbleTitle;
-	Common::String _bubbleDisplStr;
+	Common::String _bubbleTitle; // the active default "script" title
+	Common::String _bubbleDisplStr; // the title that will be drawn on the next bubble
 	Common::String _tempList[60];
 	int _tempListIdx[60];
 	int _btnId1;
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index 626e43fdad1..f7e8887c369 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -105,6 +105,16 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 
 		_vm->_events->pollEvents();
 		_vm->_events->delayUntilNextFrame();
+		Common::CustomEventType action = kActionNone;
+		_vm->_events->getAction(action);
+
+		if (action == kActionMoveLeft) {
+			result = kPageResultPrevPage;
+			continue;
+		} else if (action == kActionMoveRight) {
+			result = kPageResultNextPage;
+			continue;
+		}
 
 		if (_vm->_events->_mousePos.y >= 389) {
 			PageResult naviResult = kPageResultNone;
@@ -123,6 +133,7 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 			}
 		}
 
+
 		int hotspotIndex = -1;
 		for (int i = 0; i < page->numBlocks; i++) {
 			const ComicBlock &hotspot = page->blocks[i];
@@ -156,12 +167,10 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 			_vm->_events->setCursor(CURSOR_ARROW);
 		}
 
-		if (_vm->_events->_rightButton) {
+		if (_vm->_events->_rightButton || action == kActionSkip) {
 			result = kPageResultExit;
 			_vm->_events->debounceRight();
 		}
-
-		_vm->_events->delay();
 	}
 
 	delete _bubbleSprites;
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 9c586d605d8..e444004ee9f 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -153,7 +153,7 @@ void NoctropolisEngine::playGame() {
 
 Common::Error NoctropolisEngine::loadGameState(int slot) {
 	_loadFlag = true;
-	return AccessEngine::Engine::loadGameState(slot);
+	return AccessEngine::loadGameState(slot);
 }
 
 
@@ -733,6 +733,23 @@ void NoctropolisEngine::doSpecialComic() {
 	_screen->fadeOutThenClearAndSetPal();
 }
 
+void NoctropolisEngine::synchronize(Common::Serializer &s) {
+	AccessEngine::synchronize(s);
+
+	for (int i = 0; i < ARRAYSIZE(_travel); i++) {
+		s.syncAsByte(_travel[i]);
+	}
+
+	for (int i = 0; i < ARRAYSIZE(_ask); i++) {
+		s.syncAsByte(_ask[i]);
+	}
+
+	// This game uses a longer establish table. first 100 bytes were already handled in the common engine sync
+	for (int i = 100; i < 128; ++i)
+		s.syncAsByte(_establishTable[i]);
+
+	_stil->synchronize(s);
+}
 
 } // end namespace Noctropolis
 
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index 6a1cef4e0bc..0f5d1371009 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -90,6 +90,11 @@ protected:
 	void setupGame() override;
 	void initObjects() override;
 
+	/**
+	* Synchronize savegame data
+	*/
+	void synchronize(Common::Serializer &s) override;
+
 private:
 	void doIntro();
 	void doFlashLogo();
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index f1f98b7be5a..793c1c0a9ca 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -1788,8 +1788,12 @@ static const char *INVNAMES[4][76] = {
 {" ", "  WEITERE GEGENST\x8E""NDE", "  WEITERE GEGENST\x8E""NDE", "      ZAUNSTREBE", "   SILBERNES SYMBOL", "   GOLDENES SYMBOL", "       MAHNUNGEN", "     LOSABSCHNITT", "  SCHEIDUNGSPAPIERE", "      POSTKARTE", "     KONTOAUSZUG", "   WETTBEWERBSBRIEF", "       ZEITUNG", "    BUTTERMESSER", "        KABEL", "       Z\x9A""NDER", "STATUE AUS PLASTIKSPRENGSTOFF", "       KELCH", "   SARGSCHL\x9A""SSEL", "     RECHNUNGEN", "       SPITZE", "       ZETTEL", "      TAGEBUCH", "   DUSTER\x99""L-GRANATE", "      ZEITUNG", "DIE GESCHICHTE VON DARKSHEER", "   GLASSCHNEIDER", "      SCHERBE", "     KLEMMBRETT", "     MAGNETKARTE", "       WECKER", "  WUCHSBESCHLEUNIGER", "       KNOCHEN", "     SAMENBEUTEL", "      WURFMESSER", "      ZAUBERSTAB", "   SCHRAUBENDREHER", "       LOGBUCH", "      \x99""LK\x8E""NNCHEN", "        LINSE", "     SCHMINKSET", "        SCHMUCK", "        HAMMER", "        MEISSEL", "        MESSER", "    FLEISCHERHAKEN", "       MESSBECHER", "        S\x8E""URE", "    VENTILSTELLRAD", "         SEIL", "     MONIEREISEN", "         NETZ", "        RATTE", "        GABEL", "     STREICHHOLZ", "         LACK", "        PINSEL", "        PFEFFER", "      ZAHNSTOCHER", "         SPEER", "       EIERSACK", "        DIAMANT", "        COMIC", "         NETZ", "  SCHMIEDEEISERNE STANGE", "    KELCH MIT WASSER", "      STUHLTR\x9A""MMER", "       W\x9A""RSTCHEN", "        PLAKAT", "        ZIEGEL", "      NOCTROGLYPH", "      ISOLIERBAND", "         BESEN", "        \x99""LLAMPE", "     STIEL MIT HAKEN", "    SEIL MIT W\x9A""RSTCHEN"},
 };
 
-
-
+static const char *ASKITEMS[4][33] = {
+{"      NOCTROPOLIS", "       DARKSHEER", "       STILETTO", "    FATHER DESMOND", "       SUCCUBUS", "        CYGNUS", "      SAM JENKINS", "       MS. SHOTO", "      GREENTHUMB", "        TOPHAT", "        BUTCHER", "    MASTER MACABRE", "       DREALMER", "         FLUX", "    SUNSPIRE TOWER", "      LIQUIDARK", "      SHADESKIN", "      SHADOWLAIR", "     OBSERVATORY", "      CATHEDRAL", "     BEN HUTCHINS", "      MAUSOLEUM", "CENTRAL PARK GREENHOUSE", "      WHISPERMAN", "      OPERA- NEX", "      OPERAHOUSE", "     SUBTERRAINIA", "       CREATURE", "        WARDS", "    PETER BORNICK", "  INCARNATE/DYNATEK", "      JIM DRAKE", "      DISASTERS"},
+{"      NOCTROPOLIS", "       DARKSHEER", "       STILETTO", "    PERE DESMOND", "       SUCCUBE", "        CYGNE", "      SAM JENKINS", "       MME SHOTO", "      MAINVERTE", "        TOPHAT", "        BOUCHER", "    MAITRE MACABRE", "       DREALMER", "         FLUX", "    TOUR SUNSPIRE", "      LIQUIDARK", "    PEAU D'OMBRE", "    ANTRE D'OMBRE", "     OBSERVATOIRE", "      CATHEDRALE", "     BEN HUTCHINS", "      MAUSOLEE", " SERRE DE CENTRAL PARK", "      CHUCHOTEUR", "      OPERA-NEX", "         OPERA", "     SUBTERRAINIA", "       CREATURE", "      PUPILLES", "    PETER BORNICK", "  INCARNATE/DYNATEK", "      JIM DRAKE", "     CATASTROPHES"},
+{"      NOCTROPOLIS", "       TENEBROSO", "       STILETTO", "     PADRE DESMOND", "       SUCCUBUS", "        CYGNUS", "      SAM JENKINS", "      SRA. SHOTO", "       DEDOVERDE", "          DIVA", "      CARNICERO", "   MAESTRO MACABRO", "       MORFEICO", "         FLUX", "       TORRE SOLAR", "    LIQUIOSCURO", "   PIEL SOMBRIA", "   CUEVA SOMBRIA", "    OBSERVATORIO", "       CATEDRAL", "     BEN HUTCHINS", "       MAUSOLEO", "        INVERNADERO", "      WHISPERMAN", "      OPERA- NEX", "           OPERA", "      SUBTERRANIA", "       CRIATURA", "   GUARDIANES", "    PETER BORNICK", " ENCARNADAS/DYNATEK", "      JIM DRAKE", "      DESASTRES"},
+{"      NOCTROPOLIS", "       DARKSHEER", "       STILETTO", "    VATER DESMOND", "       SUCCUBUS", "        CYGNUS", "      SAM JENKINS", "      MISS SHOTO", "     GR\x9A""ND\x8E""UMLING", "  MISS ZYLINDERCHEN", "        METZGER", "    DOKTOR MAKABER", "       TR\x8E""UMLER", "         FLUX", "     SONNENNADEL", "       DUSTER\x99""L", "     FINSTERHAUT", "    SCHATTENHORT", "    OBSERVATORIUM", "         DOM", "    BEN HUTCHINS", "     MAUSOLEUM", "CENTRAL PARK TREIBHAUS", "     FL\x9A""STERMANN", "      OPER-NEX", "      OPERNHAUS", "    SUBTERRAINIA", "      GESCH\x99""PF", "      DIE WEHR", "    PETER BORNICK", "  INCARNATE/DYNATEK", "      JIM DRAKE", "    KATASTROPHEN"},
+};
 
 
 
@@ -2146,6 +2150,28 @@ const char *NoctropolisResources::getResponseTitle() const {
 	}
 }
 
+const char *NoctropolisResources::getAskItem(int num) const {
+	assert(num >= 0 && num < 33);
+	switch (_vm->getLanguage()) {
+	case Common::EN_ANY: return ASKITEMS[0][num];
+	case Common::FR_FRA: return ASKITEMS[1][num];
+	case Common::ES_ESP: return ASKITEMS[2][num];
+	case Common::DE_DEU: return ASKITEMS[3][num];
+	default: error("Unsupported language for ask item");
+	}
+
+}
+
+const char *NoctropolisResources::getMoreItemsText() const {
+	switch (_vm->getLanguage()) {
+	case Common::EN_ANY: return "       MORE ITEMS       ";
+	case Common::FR_FRA: return "    PLUS D'ARTICLES     ";
+	case Common::ES_ESP: return "       MAS OBJETOS      ";
+	case Common::DE_DEU: return "       MEHR INFO        ";
+	default: error("Unsupported language for more items text");
+	}
+}
+
 const ComicResource *NoctropolisResources::getLastComicResource() const {
 	return new ComicResource(LastComicPages, 15);
 }
diff --git a/engines/access/noctropolis/noctropolis_resources.h b/engines/access/noctropolis/noctropolis_resources.h
index 6961044115a..a4285965b35 100644
--- a/engines/access/noctropolis/noctropolis_resources.h
+++ b/engines/access/noctropolis/noctropolis_resources.h
@@ -66,6 +66,8 @@ public:
 	const char *getShotoText() const;
 	const char *getStilEndMessage() const;
 	const char *getResponseTitle() const;
+	const char *getAskItem(int num) const;
+	const char *getMoreItemsText() const;
 
 	const ComicResource *getLastComicResource() const;
 	const ComicResource *getSpecialComicResource() const;
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 3baa4f2c8e4..cd1a5568a54 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -42,7 +42,9 @@ void NoctropolisRoom::reloadRoom() {
 	int numSubFiles = -1;
 	int objBase = -1;
 	int fileNum = -1;
+	int palOffset = 6;
 	if (!(_roomFlag & kRoomFlagTopView)) {
+		palOffset = 6;
 		if ((int8)_roomFlag > -1) {
 			if ((_vm->_flags[1] & 1) == 0) {
 				// Peter
@@ -62,10 +64,11 @@ void NoctropolisRoom::reloadRoom() {
 		numSubFiles = 1;
 		objBase = 115;
 		fileNum = 0xfc;
+		palOffset = 2;
 	}
 
 	if (fileNum > 0) {
-		_vm->_player->loadNoctPalette(fileNum, _palIntensity + 6);
+		_vm->_player->loadNoctPalette(fileNum, _palIntensity + palOffset);
 		((NoctropolisPlayer *)_vm->_player)->loadAnimation(fileNum, 0);
 
 		for (int i = subFileBase; i <= numSubFiles; i++) {
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index edeada75527..4a68903290e 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -157,6 +157,7 @@ void Scripts::setOpcodes_v3() {
 	COMMAND_LIST[61] = &Scripts::cmdBD;
 	COMMAND_LIST[62] = &Scripts::cmdPlayVid1;
 	COMMAND_LIST[63] = &Scripts::cmdNull; // empty function CmdPRINTWITHOUT
+	COMMAND_LIST[64] = &Scripts::cmdDispAbout_v3;
 	COMMAND_LIST[71] = &Scripts::cmdFadeOut_v3;
 	COMMAND_LIST[74] = &Scripts::cmdCharWait;
 	COMMAND_LIST[75] = &Scripts::cmdUndoText;
@@ -179,7 +180,7 @@ void Scripts::setOpcodes_v3() {
 	COMMAND_LIST[92] = &Scripts::cmdSetStilDir;
 	COMMAND_LIST[93] = &Scripts::cmdStilScale;
 	COMMAND_LIST[94] = &Scripts::cmdLockInterface;
-	COMMAND_LIST[94] = &Scripts::cmdUnlockInterface;
+	COMMAND_LIST[95] = &Scripts::cmdUnlockInterface;
 }
 
 void Scripts::setScript(Resource *res, bool restartFlag) {
@@ -313,8 +314,8 @@ void Scripts::executeCommand(int commandIndex) {
 }
 
 void Scripts::cmdObject() {
-	debugC(1, kDebugScripts, "cmdObject()");
 	_vm->_bubbleBox->load(_data);
+	debugC(1, kDebugScripts, "cmdObject(%s)", _vm->_bubbleBox->_bubbleTitle.c_str());
 }
 
 void Scripts::cmdEndObject() {
@@ -882,13 +883,13 @@ void Scripts::cmdSetVideo_v3() {
 	if (cellIndex > 0x3f)
 		error("Invalid room video number %d", cellIndex);
 
-	bool loop;
+	bool flag;
 	const int roomNum = _vm->_player->_roomNumber;
 
 	if ((roomNum == 0x1e && cellIndex == 0) || roomNum == 0x21 || (roomNum == 0x36 && cellIndex < 32))
-		loop = true;
+		flag = true;
 	else
-		loop = false;
+		flag = false;
 
 	if (roomNum == 0x1b || roomNum == 0x1e)
 		pt.x = rawx + -5;
@@ -896,7 +897,7 @@ void Scripts::cmdSetVideo_v3() {
 		pt.x = rawx;
 
 	debugC(1, kDebugScripts, "cmdSetVideo_v3(x=%d, y=%d, cellIndex=%d, rate=%d)", pt.x, pt.y, cellIndex, rate);
-	warning("TODO: cmdSetVideo_v3: Use flag");
+	warning("TODO: cmdSetVideo_v3: Use flag value (%d)", flag);
 	// Hack: Skip the "DARK/"
 	Common::Path vidpath(_vm->_extraCells[cellIndex]._vidFilename.substr(5));
 	_vm->_video->setVideo(_vm->_screen, pt, vidpath, rate);
@@ -1099,7 +1100,7 @@ void Scripts::cmdSpecial() {
 	int p1 = _data->readUint16LE();
 	int p2 = _data->readUint16LE();
 	debugC(1, kDebugScripts, "cmdSpecial(specialFunction=%d, p1=%d, p2=%d)", _specialFunction, p1, p2);
-	
+
 	AccessGameType game = _vm->getGameID();
 
 	if ((game == kGameAmazon && _specialFunction == 1) || game == kGameMartianMemorandum) {
@@ -1157,8 +1158,10 @@ void Scripts::cmdCharSpeak_v3() {
 
 	Common::String str = _data->readString();
 	debugC(1, kDebugScripts, "cmdCharSpeak(%d, %d, str=\"%s\")", x, y, str.c_str());
-	if (_vm->_textFlag)
+	if (_vm->_textFlag) {
+		_vm->_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctPlain);
 		_vm->_bubbleBox->placeBubble(str);
+	}
 	findNull();
 }
 
@@ -1174,6 +1177,7 @@ void Scripts::cmdPlayerSpeak() {
 	_charsOrg = Common::Point(x, y);
 	_vm->_screen->_printOrg = _charsOrg;
 	_vm->_screen->_printStart = _charsOrg;
+	_vm->_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctPlain);
 	_vm->_bubbleBox->_bubbleTitle = title;
 
 	_vm->_bubbleBox->placeBubble(str);
@@ -1216,22 +1220,17 @@ void Scripts::cmdPlayerChoice() {
 		_vm->_screen->_printOrg.x = _vm->_screen->_printStart.x;
 	}
 
+	_vm->_bubbleBox->_bubbleDisplStr = _vm->_bubbleBox->_bubbleTitle;
+
 	int choice = -1;
 	do {
 		_vm->_events->pollEvents();
 		if (_vm->shouldQuit())
 			return;
 
-		_vm->_bubbleBox->_bubbleDisplStr = _vm->_bubbleBox->_bubbleTitle;
 		if (_vm->_events->_leftButton) {
-			if (_vm->_events->_mouseRow >= ((_vm->getGameID() == kGameMartianMemorandum) ? 23 : 22)) {
-				_vm->_events->debounceLeft();
-				int mouseX = _vm->_events->_mousePos.x;
-				choice = _vm->_res->inButtonXRange(mouseX);
-			} else {
-				_vm->_events->debounceLeft();
-				choice = _vm->_events->checkMouseBox1(responseCoords);
-			}
+			_vm->_events->debounceLeft();
+			choice = _vm->_events->checkMouseBox1(responseCoords);
 		}
 	} while (choice == -1);
 
@@ -1465,8 +1464,6 @@ void Scripts::cmdPrintWatch() {
 
 void Scripts::cmdDispAbout() {
 	debugC(1, kDebugScripts, "cmdDispAbout()");
-	if (_vm->getGameID() != kGameMartianMemorandum)
-		error("TODO: Implement cmdDispAbout for Noctropolis - need ask tbl.");
 	const char *const *askTbl = Martian::ASK_TBL;
 	_vm->_aboutBox->getList(askTbl, _vm->_ask);
 	int btnSelected = 0;
@@ -1480,10 +1477,166 @@ void Scripts::cmdDispAbout() {
 	else
 		_vm->_useItem = _vm->_aboutBox->_tempListIdx[boxX];
 
-	if (_vm->getGameID() == kGameNoctropolis)
-		_continuenceFlag = true;
 }
 
+void Scripts::cmdDispAbout_v3() {
+	// Graphical ask box for Noctropolis
+	debugC(1, kDebugScripts, "cmdDispAbout_v3()");
+
+	static const struct { int16 x1, y1, x2, y2; } askItemPos[] = {
+		{84, 0, 126, 48},
+		{42, 24, 84, 72},
+		{126, 24, 168, 72},
+		{0, 48, 42, 96},
+		{84, 48, 126, 96},
+		{168, 48, 210, 96},
+		{42, 72, 84, 120},
+		{126, 72, 168, 120},
+		{18, 102, 40, 120},
+		{186, 102, 208, 120}
+	};
+	bool menuUpArrow = false, menuDownArrow = false;
+	int hoveredItem = -1, slotIndex;
+	byte slotItems[20];
+	Common::Array<byte> items;
+	int selectedItem = -2;
+	bool needRedraw = true;
+
+	Resource *spriteData = _vm->_files->loadRawFile("ASK.AP");
+	SpriteResource *askSprites = new SpriteResource(_vm, spriteData);
+	delete spriteData;
+
+	if (!_vm->_keepAskPosition) {
+		for (int i = 0; i < 40; i++)
+			_vm->_ask[i] = false;
+
+		int16 warpMouseX, warpMouseY;
+		_vm->_askBase.x = _vm->_events->clipMouseCenter(_vm->_events->_mousePos.x, 226, 640, warpMouseX);
+		_vm->_askBase.y = _vm->_events->clipMouseCenter(_vm->_events->_mousePos.y, 145, 400, warpMouseY);
+
+		_vm->_keepAskPosition = true;
+		if (warpMouseX != _vm->_events->_mousePos.x || warpMouseY != _vm->_events->_mousePos.y)
+			g_system->warpMouse(warpMouseX, warpMouseY);
+	}
+
+	const Common::Point base = _vm->_askBase;
+
+	// Build the list of available ask items
+	for (int i = 0; i < 40; i++) {
+		if (_vm->_ask[i] == 1)
+			items.push_back(i);
+	}
+
+	// Grab screen background
+	_vm->_screen->saveBlock(Common::Rect(base, 226, 145));
+	// Draw ask panel
+	_vm->_screen->plotImage(askSprites, 0, Common::Point(base.x, base.y + 96));
+
+	_vm->_events->setCursor(CURSOR_ARROW);
+
+	const Font *font = _vm->_fonts.getFont(1);
+	Font::_fontColors[0] = 246;
+	Font::_fontColors[1] = 238;
+
+	Noctropolis::NoctropolisResources *res = (Noctropolis::NoctropolisResources *)_vm->_res;
+
+	while (selectedItem == -2 && !_vm->shouldQuitOrRestart()) {
+		int item = -1;
+
+		if (needRedraw) {
+			hoveredItem = -1;
+			menuUpArrow = false;
+			menuDownArrow = false;
+			slotIndex = 0;
+			if (items.size() > 0) {
+				// Draw "Up" arrow if required
+				menuUpArrow = _vm->_startAboutItem > 0;
+				_vm->_screen->plotImage(askSprites, menuUpArrow ? 1 : 3, Common::Point(base.x + 18, base.y + 102));
+				// Draw ask items
+				for (uint i = 0; i < 8 && _vm->_startAboutItem + i < items.size(); i++) {
+					slotItems[slotIndex] = items[_vm->_startAboutItem + i];
+					_vm->_screen->plotImage(askSprites, slotItems[slotIndex] + 6, Common::Point(base.x + askItemPos[slotIndex].x1, base.y + askItemPos[slotIndex].y1));
+					if (_vm->_ask[slotItems[slotIndex]]) {
+						_vm->_screen->plotImage(askSprites, 5, Common::Point(base.x + askItemPos[slotIndex].x1, base.y + askItemPos[slotIndex].y1));
+					}
+					slotIndex++;
+				}
+				// Draw "Down" arrow if required
+				menuDownArrow = (int)items.size() > _vm->_startAboutItem + 8;
+				_vm->_screen->plotImage(askSprites, menuDownArrow ? 2 : 3, Common::Point(base.x + 186, base.y + 102));
+			}
+			// Draw remaining empty slots if any
+			while (slotIndex < 8) {
+				slotItems[slotIndex] = 0;
+				_vm->_screen->plotImage(askSprites, 4, Common::Point(base.x + askItemPos[slotIndex].x1, base.y + askItemPos[slotIndex].y1));
+				slotIndex++;
+			}
+			needRedraw = false;
+		}
+
+		// Find at which slot the mouse is
+		for (int i = 0; i < 10; i++) {
+			if (_vm->_events->_mousePos.x >= base.x + askItemPos[i].x1 && _vm->_events->_mousePos.x <= base.x + askItemPos[i].x2 &&
+				_vm->_events->_mousePos.y >= base.y + askItemPos[i].y1 && _vm->_events->_mousePos.y <= base.y + askItemPos[i].y2) {
+				item = i;
+				break;
+			}
+		}
+
+		if (hoveredItem != item) {
+			_vm->_screen->fillRect(Common::Rect(Common::Point(base.x + 41, base.y + 128), 150, 8), 246);
+			if ((item == 8 && menuUpArrow) || (item == 9 && menuDownArrow)) {
+				font->drawString(_vm->_screen, res->getMoreItemsText(), Common::Point(base.x + 41, base.y + 128));
+			} else if (item >= 0 && item < 8) {
+				font->drawString(_vm->_screen, res->getAskItem(slotItems[item]), Common::Point(base.x + 41, base.y + 128));
+			}
+			hoveredItem = item;
+		}
+
+		// Support the mouse wheel for scrolling through the ask items
+		if (menuUpArrow && _vm->_events->_wheelUp) {
+			_vm->_startAboutItem--;
+			needRedraw = true;
+		} else if (menuDownArrow && _vm->_events->_wheelDown) {
+			_vm->_startAboutItem++;
+			needRedraw = true;
+		}
+
+		if (_vm->_events->_leftButton) {
+			_vm->_events->debounceLeft();
+			if (hoveredItem == 8 && menuUpArrow) {
+				_vm->_startAboutItem--;
+				needRedraw = true;
+			} else if (hoveredItem == 9 && menuDownArrow) {
+				_vm->_startAboutItem++;
+				needRedraw = true;
+			} else if (hoveredItem >= 0 && hoveredItem < 8) {
+				if (_vm->_startAboutItem + hoveredItem > (int)items.size()) {
+					// An empty slot was clicked
+					selectedItem = -1;
+				} else {
+					selectedItem = slotItems[hoveredItem];
+					_vm->_ask[selectedItem] = true;
+				}
+			}
+		} else if (_vm->_events->_rightButton) {
+			_vm->_events->debounceRight();
+			selectedItem = 255;
+			_vm->_keepAskPosition = false;
+		}
+
+		_vm->_events->pollEventsAndWait();
+	}
+
+	_vm->_flags[99] = selectedItem;
+
+	// Restore screen background
+	_vm->_screen->restoreBlock();
+
+	_continuenceFlag = true;
+}
+
+
 void Scripts::cmdPushLocation_v1() {
 	// MM only
 	debugC(1, kDebugScripts, "cmdPushLocation_v1()");
@@ -1595,7 +1748,8 @@ void Scripts::cmdFillSound() {
 }
 
 void Scripts::cmdPlayVid1() {
-	error("TODO: Implement Scripts::cmdPlayVid1");
+	// TODO: should this mark the video finished if it's not loaded?
+	_vm->_video->playVideo();
 	_continuenceFlag = true;
 }
 
@@ -1696,13 +1850,17 @@ void Scripts::cmdRestoreBlock() {
 	int16 w = _data->readSint16LE();
 	int16 h = _data->readSint16LE();
 	debugC(1, kDebugScripts, "cmdRestoreBlock(%d, %d, %d, %d)", x, y, w, h);
-	_vm->clearPlotImagesIn(x, y, w, h);
-	_vm->clearPlotVidsIn(x, y, w, h);
+	Common::Rect r(Common::Point(x, y), w, h);
+	_vm->_screen->blitFrom(_vm->_buffer1, r, r);
+
+	// Remake does this, but it doesn't use same buffer setup..
+	//_vm->clearPlotImagesIn(x, y, w, h);
+	//_vm->clearPlotVidsIn(x, y, w, h);
 }
 
 void Scripts::cmdCopyScnBuf() {
 	debugC(1, kDebugScripts, "cmdCopyScnBuf()");
-	_vm->_screen->update();
+	_vm->_buffer1.blitFrom(*_vm->_screen);
 }
 
 void Scripts::cmdStilWalkTo() {
diff --git a/engines/access/scripts.h b/engines/access/scripts.h
index 11b12a043fe..52fe492827c 100644
--- a/engines/access/scripts.h
+++ b/engines/access/scripts.h
@@ -132,6 +132,7 @@ protected:
 	void cmdPlayVideoSound();
 	void cmdPrintWatch();
 	void cmdDispAbout();
+	void cmdDispAbout_v3();
 	void cmdPushLocation();
 	void cmdPushLocation_v1();
 	void cmdCheckTravel();


Commit: 3af926f351b9bd587087fb95b3d653626d9b3f3a
    https://github.com/scummvm/scummvm/commit/3af926f351b9bd587087fb95b3d653626d9b3f3a
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fixes for noctropolis ask box

Changed paths:
    engines/access/access.h
    engines/access/inventory.cpp
    engines/access/inventory.h
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/scripts.cpp


diff --git a/engines/access/access.h b/engines/access/access.h
index 45da996dc07..307589e56c8 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -271,6 +271,7 @@ public:
 	// TODO: Refactor
 	byte _travel[60]; // only first ~15 used in MM
 	byte _ask[40];
+	byte _asked[40]; // Noctropolis only
 	int _startTravelItem;
 	int _startTravelBox;
 	int _startAboutItem;
diff --git a/engines/access/inventory.cpp b/engines/access/inventory.cpp
index a5cdef8cbfd..faa4cd35ce3 100644
--- a/engines/access/inventory.cpp
+++ b/engines/access/inventory.cpp
@@ -72,8 +72,6 @@ InventoryManager::InventoryManager(AccessEngine *vm) : Manager(vm) {
 	_invChangeFlag = true;
 	_invRefreshFlag = false;
 	_invModeFlag = false;
-	_startAboutItem = 0;
-	_startTravelItem = 0;
 	_iconDisplayFlag = true;
 	_boxNum = 0;
 
diff --git a/engines/access/inventory.h b/engines/access/inventory.h
index c9a3ce08f87..0550e093cd6 100644
--- a/engines/access/inventory.h
+++ b/engines/access/inventory.h
@@ -111,8 +111,7 @@ public:
 	bool _invChangeFlag;
 	bool _invRefreshFlag;
 	bool _invModeFlag;
-	int _startAboutItem;
-	int _startTravelItem;
+
 public:
 	InventoryManager(AccessEngine *vm);
 
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index e444004ee9f..d61f24cd882 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -736,16 +736,17 @@ void NoctropolisEngine::doSpecialComic() {
 void NoctropolisEngine::synchronize(Common::Serializer &s) {
 	AccessEngine::synchronize(s);
 
-	for (int i = 0; i < ARRAYSIZE(_travel); i++) {
+	for (int i = 0; i < ARRAYSIZE(_travel); i++)
 		s.syncAsByte(_travel[i]);
-	}
 
-	for (int i = 0; i < ARRAYSIZE(_ask); i++) {
+	for (int i = 0; i < ARRAYSIZE(_ask); i++)
 		s.syncAsByte(_ask[i]);
-	}
+
+	for (int i = 0; i < ARRAYSIZE(_asked); i++)
+		s.syncAsByte(_asked[i]);
 
 	// This game uses a longer establish table. first 100 bytes were already handled in the common engine sync
-	for (int i = 100; i < 128; ++i)
+	for (int i = 100; i < 128; i++)
 		s.syncAsByte(_establishTable[i]);
 
 	_stil->synchronize(s);
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index 0f5d1371009..3fa9e64b266 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -54,8 +54,8 @@ public:
 	void establish(int esatabIndex, int sub) override {};
 	Common::Error loadGameState(int slot) override;
 
-	virtual int16 getScreenWidth() const override { return 640; }
-	virtual int16 getScreenHeight() const override { return 400; }
+	int16 getScreenWidth() const override { return 640; }
+	int16 getScreenHeight() const override { return 400; }
 
 	Player *_stil;
 	int _travScrollRow;
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 4a68903290e..090dc69a579 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -1495,7 +1495,8 @@ void Scripts::cmdDispAbout_v3() {
 		{18, 102, 40, 120},
 		{186, 102, 208, 120}
 	};
-	bool menuUpArrow = false, menuDownArrow = false;
+	bool menuUpArrow = false;
+	bool menuDownArrow = false;
 	int hoveredItem = -1, slotIndex;
 	byte slotItems[20];
 	Common::Array<byte> items;
@@ -1508,7 +1509,7 @@ void Scripts::cmdDispAbout_v3() {
 
 	if (!_vm->_keepAskPosition) {
 		for (int i = 0; i < 40; i++)
-			_vm->_ask[i] = false;
+			_vm->_asked[i] = false;
 
 		int16 warpMouseX, warpMouseY;
 		_vm->_askBase.x = _vm->_events->clipMouseCenter(_vm->_events->_mousePos.x, 226, 640, warpMouseX);
@@ -1556,7 +1557,7 @@ void Scripts::cmdDispAbout_v3() {
 				for (uint i = 0; i < 8 && _vm->_startAboutItem + i < items.size(); i++) {
 					slotItems[slotIndex] = items[_vm->_startAboutItem + i];
 					_vm->_screen->plotImage(askSprites, slotItems[slotIndex] + 6, Common::Point(base.x + askItemPos[slotIndex].x1, base.y + askItemPos[slotIndex].y1));
-					if (_vm->_ask[slotItems[slotIndex]]) {
+					if (_vm->_asked[slotItems[slotIndex]]) {
 						_vm->_screen->plotImage(askSprites, 5, Common::Point(base.x + askItemPos[slotIndex].x1, base.y + askItemPos[slotIndex].y1));
 					}
 					slotIndex++;
@@ -1616,7 +1617,7 @@ void Scripts::cmdDispAbout_v3() {
 					selectedItem = -1;
 				} else {
 					selectedItem = slotItems[hoveredItem];
-					_vm->_ask[selectedItem] = true;
+					_vm->_asked[selectedItem] = true;
 				}
 			}
 		} else if (_vm->_events->_rightButton) {


Commit: daa2dd203e37b109405b4d88c8bf1e825260760e
    https://github.com/scummvm/scummvm/commit/daa2dd203e37b109405b4d88c8bf1e825260760e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix some misc Noctropolis pal/fade issues

Changed paths:
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/room.cpp
    engines/access/screen.cpp
    engines/access/screen.h


diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index f7e8887c369..dd523971c92 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -73,6 +73,8 @@ void ComicViewer::run(const ComicResource *comic) {
 
 	debug("ComicViewer::run() getCount() = %d", comic->getCount());
 
+	_vm->_screen->savePalette();
+
 	while (result != kPageResultExit) {
 		result = runPage(comic->getPage(_currPage));
 		if (result == kPageResultNextPage && _currPage + 1 < comic->getCount()) {
@@ -82,24 +84,27 @@ void ComicViewer::run(const ComicResource *comic) {
 		}
 	}
 
+	// Fade out and then restore the screen
+	// First copy the comic palette or fade out will be wrong
+	_vm->_screen->copyRawPalToTempPal();
+	_vm->_screen->fadeOut();
+	// Now restore the original screen and pal.
+	_vm->_screen->restorePalette();
+	_vm->_screen->setPalette();
+	_vm->_screen->copyRawPalToTempPal();
+	_vm->copyBF2Vid();
 }
 
 PageResult ComicViewer::runPage(const ComicPage *page) {
 	PageResult result = kPageResultNone;
 
 	_vm->_files->loadScreen(Common::Path(page->filename.baseName()));
-	_vm->_buffer2.blitFrom(*_vm->_screen);
 
 	Resource *bubbleData = _vm->_files->loadRawFile("comic.ap");
 	_bubbleSprites = new SpriteResource(_vm, bubbleData);
 	delete bubbleData;
 
-	// TODO: Copy the palette else the fade out will be wrong?
-	//_vm->_screen->palPaletteRange(pagePicture->getPalette(), 0, 256);
-	//_vm->copySystemPalette();
-	//_vm->setMainPalette();
-
-	//vgaScreen->drawScreen(pagePicture, 640, 400);
+	bool playedSound = false;
 
 	while (result == kPageResultNone) {
 
@@ -148,6 +153,12 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 			if (_vm->_events->_leftButton) {
 				_vm->_events->debounceLeft();
 				const ComicBlock &hotspot = page->blocks[hotspotIndex];
+
+				if (hotspot.soundFileIndex >= 0) {
+					_vm->_sound->loadSoundTable(1, hotspot.soundFileIndex, hotspot.soundResIndex);
+					_vm->_sound->playSound(1);
+					playedSound = true;
+				}
 				// TODO: Play hotspot sound
 				for (int bubbleIndex = 0; bubbleIndex < hotspot.numBoxes; bubbleIndex++) {
 					const ComicBox &bubble = hotspot.boxes[bubbleIndex];
@@ -173,6 +184,12 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 		}
 	}
 
+	if (playedSound) {
+		_vm->_sound->stopSound();
+		delete _vm->_sound->_soundTable[1]._res;
+		_vm->_sound->_soundTable[1]._res = nullptr;
+	}
+
 	delete _bubbleSprites;
 
 	return result;
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index d61f24cd882..ad03d5cbde2 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -720,7 +720,6 @@ void NoctropolisEngine::doLastComic() {
 	viewer->run(comic);
 	delete viewer;
 	delete comic;
-	_screen->fadeOutThenClearAndSetPal();
 }
 
 void NoctropolisEngine::doSpecialComic() {
@@ -730,7 +729,6 @@ void NoctropolisEngine::doSpecialComic() {
 	viewer->run(comic);
 	delete viewer;
 	delete comic;
-	_screen->fadeOutThenClearAndSetPal();
 }
 
 void NoctropolisEngine::synchronize(Common::Serializer &s) {
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index cd1a5568a54..0a30b244bbc 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -109,7 +109,7 @@ void NoctropolisRoom::reloadRoom1() {
 	_vm->copyBF2Vid();
 
 	// TODO: Work out if this is right - the second room has roomflag 0 so maybe not??
-	if (_roomFlag >= 0) {
+	if (_roomFlag >= 0 && !(kRoomFlagNoPlayer & _roomFlag)) {
 		if (_roomFlag & kRoomFlagStiletto)
 			_vm->_screen->setStilPalette();
 		_vm->_screen->setManPalette();
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index c5ef2b001db..6f62ac49240 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -185,17 +185,19 @@ void Room::doRoom() {
 		while (!_vm->shouldQuit()) {
 			// NoctRoomEngine::ticker in Noctropolis
 			_vm->_images.clear();
+
+			// Poll for events - this can move the frame count forward thus
+			// trigger fade-in
+			_vm->_canSaveLoad = true;
+			_vm->_events->pollEventsAndWait();
+			_vm->_canSaveLoad = false;
+
 			if (_vm->_screen->_fadeIn) {
 				_vm->_events->showCursor();
 				_vm->_screen->fadeIn();
 				_vm->_screen->_fadeIn = false;
 			}
 
-			// Poll for events
-			_vm->_canSaveLoad = true;
-			_vm->_events->pollEventsAndWait();
-			_vm->_canSaveLoad = false;
-
 			// FIXME: cont flag usage..
 			/*if (_vm->_scripts->_continuenceFlag) {
 				if (_vm->_scripts->_continuenceType == 3)
diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp
index dd9b7faa6ce..d19df0905d7 100644
--- a/engines/access/screen.cpp
+++ b/engines/access/screen.cpp
@@ -223,6 +223,11 @@ void Screen::getPalette(byte *pal) {
 	g_system->getPaletteManager()->grabPalette(pal, 0, 256);
 }
 
+void Screen::copyRawPalToTempPal() {
+	Common::copy(&_rawPalette[0],
+		&_rawPalette[Graphics::PALETTE_SIZE], &_tempPalette[0]);
+}
+
 void Screen::forceFadeOut() {
 	const int FADE_AMOUNT = 2;
 	bool repeatFlag;
diff --git a/engines/access/screen.h b/engines/access/screen.h
index 2300eee61fe..89fcae15554 100644
--- a/engines/access/screen.h
+++ b/engines/access/screen.h
@@ -118,12 +118,17 @@ public:
 	void fadeOut() { forceFadeOut(); }
 	void fadeIn() { forceFadeIn(); }
 	void clearScreen();
-	
+
 	/**
 	 * Fade out, clear the screen, then restore the palette (Noctropolis)
 	 */
 	void fadeOutThenClearAndSetPal();
 
+	/**
+	 * Save the current "raw" palette into the effect (temp) palette
+	 */
+	void copyRawPalToTempPal();
+
 	/**
 	 * Set the initial palette
 	 */


Commit: fd337da36d540494d17c65db36c198fe81fa0210
    https://github.com/scummvm/scummvm/commit/fd337da36d540494d17c65db36c198fe81fa0210
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Make Noctropolis travel work

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/room.cpp
    engines/access/scripts.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index ad03d5cbde2..9f4ef0621af 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -352,49 +352,64 @@ void NoctropolisEngine::doTravel() {
 	_midi->midiRepeat();
 	_midi->midiPlay();
 
-	//loadPlayField(0, 0); //??
+	_buffer1.clear();
+	_buffer2.clear();
+	_screen->clearScreen();
+	_room->loadPlayField(0, 0); // MAP.AP
+	_buffer1.copyFrom(*_screen);
+	_buffer2.copyFrom(*_screen);
+	_screen->setPalette();
 	_screen->setIconPalette();
 	_scrollRow = _travScrollRow;
 	_scrollCol = _travScrollCol;
 	_scrollX = _travScrollX;
 	_scrollY = _travScrollY;
+	// Load MAP.AP
 	Resource *spriteData = _files->loadFile(0, 1);
 	_objectsTable[0] = new SpriteResource(this, spriteData);
 	delete spriteData;
 
 	// This section is "state 1" in NoctTravelEngine::ticker
+	((NoctropolisRoom *)_room)->buildScreenXScroll();
+	_buffer2.copyFrom(_buffer1);
+	copyBF2Vid();
 	_screen->setPaletteCycle(0xb5, 0xbe, 5);
 	_screen->fadeIn();
 
 	Common::Point rawMouse;
 	int locFlag = -1;
 	// Show the map and wait for clicks
-	while (!shouldQuitOrRestart()) {
+	while (!shouldQuitOrRestart() && locFlag == -1) {
 		_midi->midiRepeat();
 
 		// TODO: check me.. is buildScreen equivalent??
-		//NoctPF_RenderPlayfield();
-		_room->buildScreen();
+		((NoctropolisRoom *)_room)->buildScreenXScroll();
+		_buffer2.copyFrom(_buffer1);
 
 		_player->calcPlayer();
 
 		for (int i = 0; i < 15; i++) {
 			if (_travel[i]) {
-				int imgNum = TRAV_ICONS[i * 3];
-				int x = TRAV_ICONS[i * 3 + 1];
-				int y = TRAV_ICONS[i * 3 + 2];
+				int x = TRAV_ICONS[i * 3 + 0];
+				int y = TRAV_ICONS[i * 3 + 1];
+				int imgNum = TRAV_ICONS[i * 3 + 2];
 				Common::Point pt(x - _screen->_bufferStart.x, y - _screen->_bufferStart.y);
 				_buffer2.plotImage(_objectsTable[0], imgNum, pt);
 			}
 		}
+
 		copyBF2Vid();
 
 		_screen->cyclePaletteForward();
 		locFlag = -1;
 		rawMouse = _events->calcRawMouse();
-		int boxResult = _room->checkBoxes1(rawMouse);
-		if (boxResult != -1 && _travel[boxResult])
-			locFlag = boxResult;
+
+		if (_events->_leftButton) {
+			_events->debounceLeft();
+			int boxResult = _room->checkBoxes1(rawMouse);
+			if (boxResult != -1 && _travel[boxResult])
+				locFlag = boxResult;
+		}
 
 		if (!_events->_leftButton || locFlag == -1) {
 			int scrolly = _scrollY;
@@ -419,19 +434,24 @@ void NoctropolisEngine::doTravel() {
 		_events->pollEventsAndWait();
 	}
 
+	if (shouldQuitOrRestart())
+		return;
+
+	assert(locFlag > 0 && locFlag < 15);
+
 	// This is NoctTravelEngine::done
 	_screen->fadeOut();
 	_travScrollRow = _scrollRow;
 	_travScrollCol = _scrollCol;
 	_travScrollX = _scrollX;
 	_travScrollY = _scrollY;
-	assert(locFlag < 15);
 	_player->_roomNumber = TRAV_ROOMS[locFlag];
 	_player->_rawPlayer.x = TRAV_MAN_POS[locFlag * 2];
 	_player->_rawPlayer.y = TRAV_MAN_POS[locFlag * 2 + 1];
 	_player->_moveTo = _player->_rawPlayer;
 	setStilettoPos();
-	_room->clearRoom();
+	_room->_function = FN_CLEAR1;
+	_room->loadRoom(_player->_roomNumber);
 }
 
 static const short StilYDirOff[] = {
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 6f62ac49240..96dbd06a5c9 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -349,8 +349,7 @@ void Room::loadRoomData(const byte *roomData) {
 	if (_vm->getGameID() == kGameNoctropolis && _roomFlag & kRoomFlagStiletto) {
 		// Load _vm->_screen->_stilPal
 		Resource *stilPal = _vm->_files->loadFile(0xfd, _palIntensity + 6);
-		assert(stilPal->_size <= 99);
-		memcpy(stilPal->data(), _vm->_screen->_stilPal, stilPal->_size);
+		memcpy(stilPal->data(), _vm->_screen->_stilPal, 99);
 		error("TODO: Finish load of Stiletto data - see Noctropolis LoadRoom()");
 	}
 
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 090dc69a579..b575d4a9b5f 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -148,6 +148,7 @@ void Scripts::setOpcodes_v3() {
 	COMMAND_LIST[18] = &Scripts::cmdSetCoords;
 	COMMAND_LIST[33] = &Scripts::cmdJumpGoto_v3;
 	COMMAND_LIST[34] = &Scripts::cmdSetVideo_v3;
+	COMMAND_LIST[45] = &Scripts::cmdDoTravel_Noct;
 	COMMAND_LIST[50] = &Scripts::cmdCharSpeak_v3;
 	COMMAND_LIST[51] = &Scripts::cmdPlayerSpeak;
 	COMMAND_LIST[52] = &Scripts::cmdPlayerChoice;
@@ -784,7 +785,10 @@ void Scripts::cmdSetAbout() {
 
 	debugC(1, kDebugScripts, "cmdSetAbout(idx=%d, val=%d)", idx, val);
 	_vm->_ask[idx] = val;
-	_vm->_startAboutBox = _vm->_startAboutItem = 0;
+
+	// Reset location of about items, except in Noctropolis
+	if (_vm->getGameID() != kGameNoctropolis)
+		_vm->_startAboutBox = _vm->_startAboutItem = 0;
 }
 
 void Scripts::cmdSetTimer() {


Commit: abf79cbe2d0dac70e73dc8db953cdddd07bba806
    https://github.com/scummvm/scummvm/commit/abf79cbe2d0dac70e73dc8db953cdddd07bba806
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Load Stiletto data correctly

Changed paths:
    engines/access/noctropolis/noctropolis_comicviewer.h
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_player.cpp
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/player.h
    engines/access/room.cpp


diff --git a/engines/access/noctropolis/noctropolis_comicviewer.h b/engines/access/noctropolis/noctropolis_comicviewer.h
index 178171a4220..bdae418da69 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.h
+++ b/engines/access/noctropolis/noctropolis_comicviewer.h
@@ -50,11 +50,6 @@ protected:
 	void internalLoad(Common::SeekableReadStream &source, uint32 size);
 };
 
-struct Comic {
-	short numPoints;
-	Common::Point points[];
-};
-
 struct ComicBlock {
 	struct Polygon *polygon;
 	int32 soundFileIndex, soundResIndex;
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 9f4ef0621af..d5f211f62df 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -21,6 +21,7 @@
 
 #include "access/noctropolis/noctropolis_game.h"
 #include "access/noctropolis/noctropolis_room.h"
+#include "access/noctropolis/noctropolis_player.h"
 #include "access/noctropolis/noctropolis_scripts.h"
 #include "access/noctropolis/noctropolis_resources.h"
 #include "access/noctropolis/noctropolis_comicviewer.h"
@@ -50,7 +51,7 @@ void NoctropolisEngine::initObjects() {
 	_invScript = new NoctropolisScripts(this);
 	_inventory = new NoctropolisInventory(this);
 	_video = new VideoPlayer_v2(this);
-	_stil = new Player(this);
+	_stil = Player::init(this);
 
 	const Common::FSNode gameDataDir(ConfMan.getPath("path"));
 	SearchMan.addSubDirectoryMatching(gameDataDir, "comdata");
diff --git a/engines/access/noctropolis/noctropolis_player.cpp b/engines/access/noctropolis/noctropolis_player.cpp
index febc1a2f881..464a298ffa4 100644
--- a/engines/access/noctropolis/noctropolis_player.cpp
+++ b/engines/access/noctropolis/noctropolis_player.cpp
@@ -187,13 +187,16 @@ void NoctropolisPlayer::walk() {
 		int dirAnimNum = _animNumForDir(_playerDirection);
 		if (_playerDirection != _lastDirection) {
 			_lastDirection = _playerDirection;
-			_animManager->popBackTimer();
-			Animation *anim = _animManager->setAnimation(dirAnimNum);
-			_animManager->setAnimTimer(anim);
+			if (_animManager) {
+				_animManager->popBackTimer();
+				Animation *anim = _animManager->setAnimation(dirAnimNum);
+				_animManager->setAnimTimer(anim);
+			}
 		}
 		_playerX = _rawPlayer.x;
 		_playerY = _rawPlayer.y;
-		/*local_30 =*/ _animManager->animate(dirAnimNum);
+		if (_animManager)
+			_animManager->animate(dirAnimNum);
 		_rawPlayer.x = _playerX;
 		_rawPlayer.y = _playerY;
 		
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 0a30b244bbc..c4203d33920 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -284,7 +284,7 @@ int NoctropolisRoom::checkPlayerBox(const Common::Point &pt) {
 
 	Player *stil = ((NoctropolisEngine *)_vm)->_stil;
 
-	if (stil->_playerOff != 0)
+	if (stil->_playerOff)
 		return 1;
 
 	_vm->_scale = _vm->_stilScale;
diff --git a/engines/access/player.h b/engines/access/player.h
index c1d3432ced0..c4c820820ae 100644
--- a/engines/access/player.h
+++ b/engines/access/player.h
@@ -47,6 +47,9 @@ class AccessEngine;
 
 class Player : public ImageEntry, public Manager {
 protected:
+	// should be constructed via ::init().
+	Player(AccessEngine *vm);
+
 	int _leftDelta, _rightDelta;
 	int _upDelta, _downDelta;
 	int _scrollConst;
@@ -120,7 +123,6 @@ public:
 	Common::Point _rawPlayerLow;
 	Common::Point _rawPlayer;
 public:
-	Player(AccessEngine *vm);
 	virtual ~Player();
 	static Player *init(AccessEngine *vm);
 
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 96dbd06a5c9..384cd520f79 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -27,6 +27,7 @@
 #include "access/amazon/amazon_resources.h"
 #include "access/martian/martian_resources.h"
 #include "access/noctropolis/noctropolis_game.h"
+#include "access/noctropolis/noctropolis_player.h"
 
 namespace Access {
 
@@ -264,11 +265,11 @@ void Room::doRoom() {
 				_function = FN_NONE;
 				roomLoop();
 			}
-			
+
 			// Back to NoctRoomEngine::roomMainLoop in Noctropolis..
 			//if (_vm->_scripts->_continuenceFlag)
 			//	continue;
-				
+
 			_vm->_scripts->_continuenceType = 0;
 
 			if (_vm->_player->_scrollFlag) {
@@ -349,8 +350,15 @@ void Room::loadRoomData(const byte *roomData) {
 	if (_vm->getGameID() == kGameNoctropolis && _roomFlag & kRoomFlagStiletto) {
 		// Load _vm->_screen->_stilPal
 		Resource *stilPal = _vm->_files->loadFile(0xfd, _palIntensity + 6);
-		memcpy(stilPal->data(), _vm->_screen->_stilPal, 99);
-		error("TODO: Finish load of Stiletto data - see Noctropolis LoadRoom()");
+		memcpy(stilPal->data() + 480, _vm->_screen->_stilPal, 99);
+
+		Player *stil = ((Noctropolis::NoctropolisEngine *)_vm)->_stil;
+		((Noctropolis::NoctropolisPlayer *)stil)->loadAnimation(0xfd, 0);
+
+		for (int subFileNum = 1; subFileNum < 6; subFileNum++) {
+			Resource *data = _vm->_files->loadFile(0xfd, subFileNum);
+			_vm->_objectsTable[0x6d + subFileNum] = new SpriteResource(_vm, data);
+		}
 	}
 
 	_vm->_establishFlag = false;


Commit: ca04a107a89218de20d12fe8a5c2d713399b5403
    https://github.com/scummvm/scummvm/commit/ca04a107a89218de20d12fe8a5c2d713399b5403
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix msvc build

Changed paths:
    engines/access/noctropolis/noctropolis_inventory.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/room.cpp


diff --git a/engines/access/noctropolis/noctropolis_inventory.cpp b/engines/access/noctropolis/noctropolis_inventory.cpp
index 1334b2a5e4d..0fddebaccc5 100644
--- a/engines/access/noctropolis/noctropolis_inventory.cpp
+++ b/engines/access/noctropolis/noctropolis_inventory.cpp
@@ -41,8 +41,8 @@ int NoctropolisInventory::displayInv() {
 
 	int hoveredItem = -1;
 	byte slotItems[20];
-	SpriteResource *inventorySprites;
-	bool upArrow, downArrow;
+	bool upArrow = false;
+	bool downArrow = false;
 	int prevTopItemIndex = -1;
 
 	Screen *screen = _vm->_screen;
@@ -60,7 +60,7 @@ int NoctropolisInventory::displayInv() {
 
 	// TODO: Maybe move/load these globally?
 	Resource *iconData = _vm->_files->loadRawFile("INV.AP");
-	inventorySprites = new SpriteResource(_vm, iconData);
+	SpriteResource *inventorySprites = new SpriteResource(_vm, iconData);
 	delete iconData;
 
 	// Build the list of available inventory items
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 793c1c0a9ca..3de200b0d13 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -1977,7 +1977,7 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	// Fill out the inventory
 	const Common::Language lang = _vm->getLanguage();
 	INVENTORY.resize(ARRAYSIZE(INVNAMES[0]));
-	for (int i = 0; i < ARRAYSIZE(INVNAMES[0]); i++) {
+	for (i = 0; i < ARRAYSIZE(INVNAMES[0]); i++) {
 		switch (lang) {
 		case Common::EN_ANY: INVENTORY[i]._desc = INVNAMES[0][i]; break;
 		case Common::FR_FRA: INVENTORY[i]._desc = INVNAMES[1][i]; break;
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 384cd520f79..2a89e980ba6 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -444,7 +444,7 @@ void Room::cmdExitContinuance() {
 	_vm->_scripts->_continuenceFlag = false;
 	_vm->_scripts->executeScript();
 	if (!_vm->_scripts->_continuenceFlag) {
-		_vm->_boxSelect = -1;
+		_vm->_boxSelect = false; // -1
 		warning("TODO: Room::cmdExitContinuance: check and clear double click.");
 		/*
 		if (DidDblClick) {


Commit: efe2bb81f8724bf8437120ede37cda9800d0e4e9
    https://github.com/scummvm/scummvm/commit/efe2bb81f8724bf8437120ede37cda9800d0e4e9
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Partially fix Stiletto in Noctropolis

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/access/animation.cpp
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_player.cpp
    engines/access/noctropolis/noctropolis_player.h
    engines/access/player.cpp
    engines/access/player.h
    engines/access/room.cpp


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 891ff4f3b13..dfdacfb420e 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -47,6 +47,7 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_helpBox = nullptr;
 	_midi = nullptr;
 	_player = nullptr;
+	_curPlayer = nullptr;
 	_res = nullptr;
 	_room = nullptr;
 	_screen = nullptr;
@@ -191,6 +192,7 @@ void AccessEngine::initialize() {
 	_screen = new Screen(this);
 	_sound = new SoundManager(this, _mixer);
 	_midi = new MusicManager(this);
+	_curPlayer = _player;
 
 	syncSoundSettings();
 	setTotalPlayTime(0);
diff --git a/engines/access/access.h b/engines/access/access.h
index 307589e56c8..207c9aa71d3 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -208,6 +208,7 @@ public:
 	FileManager *_files;
 	InventoryManager *_inventory;
 	Player *_player;
+	Player *_curPlayer; // current player being animated (only changes in Noctropolis)
 	Resources *_res;
 	Room *_room;
 	Screen *_screen;
diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index c373e389ae0..41555c767d9 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -213,18 +213,18 @@ void Animation::anim7() {
 
 void Animation::anim8() {
 	const AnimationFrame *frame = calcFrame();
-	if (!_vm->_player->_playerOff) {
+	if (!_vm->_curPlayer->_playerOff) {
 		assert(frame->_parts.size() > 0);
 		const AnimationFramePart &part0 = frame->_parts[0];
 		const SpriteFrame *spriteFrame0 = _vm->_objectsTable[part0._spritesIndex]->_frames[part0._frameIndex];
 		_vm->_animation->_base.x = frame->_baseX;
 		_vm->_animation->_base.y = frame->_baseY;
-		int playerX = _vm->_player->_playerX;
-		int playerY = _vm->_player->_playerY;
+		int playerX = _vm->_curPlayer->_playerX;
+		int playerY = _vm->_curPlayer->_playerY;
 		int frameX = _vm->_animation->_base.x + part0._position.x;
 		int frameY = _vm->_animation->_base.y + part0._position.y;
-		int playerOffX = _vm->_player->_playerOffset.x;
-		int playerOffY = _vm->_player->_playerOffset.y;
+		int playerOffX = _vm->_curPlayer->_playerOffset.x;
+		int playerOffY = _vm->_curPlayer->_playerOffset.y;
 
 		if (playerX <= frameX + spriteFrame0->w &&
 			playerY - playerOffY <= frameY + spriteFrame0->h &&
@@ -250,7 +250,7 @@ void Animation::anim11() {
 	const AnimationFrame *frame = calcFrame();
 	_countdownTicks += frame->_frameDelay;
 	_scaling = _vm->_scale;
-	setFrame1(frame, _vm->_player->_playerX, _vm->_player->_playerY - _vm->_player->_playerOffset.y);
+	setFrame1(frame, _vm->_curPlayer->_playerX, _vm->_curPlayer->_playerY - _vm->_curPlayer->_playerOffset.y);
 }
 
 void Animation::anim12() {
@@ -272,18 +272,18 @@ void Animation::anim12() {
 		int16 xadd = ABS(deltaX) * _vm->_scale / 256;
 		int16 yadd = ABS(deltaY) * _vm->_scale / 256;
 		if (deltaX < 0)
-			_vm->_player->_playerX -= xadd;
+			_vm->_curPlayer->_playerX -= xadd;
 		else
-			_vm->_player->_playerX += xadd;
+			_vm->_curPlayer->_playerX += xadd;
 		if (deltaY < 0)
-			_vm->_player->_playerY -= yadd;
+			_vm->_curPlayer->_playerY -= yadd;
 		else
-			_vm->_player->_playerY += yadd;
+			_vm->_curPlayer->_playerY += yadd;
 		_countdownTicks += frame->_frameDelay;
-		debugC(kDebugGraphics, "anim12: player pos %d, %d (change %d %d -> %d %d) scale %d", _vm->_player->_playerX, _vm->_player->_playerY, deltaX, deltaY, xadd, yadd, _vm->_scale);
+		debugC(kDebugGraphics, "anim12: player pos %d, %d (change %d %d -> %d %d) scale %d", _vm->_curPlayer->_playerX, _vm->_curPlayer->_playerY, deltaX, deltaY, xadd, yadd, _vm->_scale);
 	}
 	_scaling = _vm->_scale;
-	setFrame1(frame, _vm->_player->_playerX, _vm->_player->_playerY - _vm->_player->_playerOffset.y);
+	setFrame1(frame, _vm->_curPlayer->_playerX, _vm->_curPlayer->_playerY - _vm->_curPlayer->_playerOffset.y);
 }
 
 
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index dd523971c92..8dcabfb57c5 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -89,6 +89,7 @@ void ComicViewer::run(const ComicResource *comic) {
 	_vm->_screen->copyRawPalToTempPal();
 	_vm->_screen->fadeOut();
 	// Now restore the original screen and pal.
+	_vm->_screen->clearScreen();
 	_vm->_screen->restorePalette();
 	_vm->_screen->setPalette();
 	_vm->_screen->copyRawPalToTempPal();
@@ -107,7 +108,6 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 	bool playedSound = false;
 
 	while (result == kPageResultNone) {
-
 		_vm->_events->pollEvents();
 		_vm->_events->delayUntilNextFrame();
 		Common::CustomEventType action = kActionNone;
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index d5f211f62df..5bc07bf2301 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -51,7 +51,7 @@ void NoctropolisEngine::initObjects() {
 	_invScript = new NoctropolisScripts(this);
 	_inventory = new NoctropolisInventory(this);
 	_video = new VideoPlayer_v2(this);
-	_stil = Player::init(this);
+	_stil = new NoctropolisPlayer(this);
 
 	const Common::FSNode gameDataDir(ConfMan.getPath("path"));
 	SearchMan.addSubDirectoryMatching(gameDataDir, "comdata");
@@ -714,7 +714,6 @@ void NoctropolisEngine::playSuccubusAttack() {
 	_midi->stopSong();
 	_midi->loadMusic(98, 4);
 	_midi->midiPlay();
-	_screen->fadeOut();
 	_files->loadScreen(Common::Path("scene06.scn")); // "DARK/SCENE06.SCN"
 	_screen->fadeIn();
 	_system->updateScreen();
diff --git a/engines/access/noctropolis/noctropolis_player.cpp b/engines/access/noctropolis/noctropolis_player.cpp
index 464a298ffa4..90f45ab68e4 100644
--- a/engines/access/noctropolis/noctropolis_player.cpp
+++ b/engines/access/noctropolis/noctropolis_player.cpp
@@ -89,10 +89,10 @@ static int _animNumForDir(Direction dir) {
 void NoctropolisPlayer::updatePlayerDirection() {
 	if (_playerOff)
 		return;
-	
+
 	int16 absDeltaX = abs(_moveTo.x - _rawPlayer.x);
 	int16 absDeltaY = abs(_moveTo.y - _rawPlayer.y);
-	
+
 	int scaleEntry = (_vm->_room->_roomFlag & kRoomFlagTopView) ? 4 : 20;
 	int16 minMove = _vm->_screen->_scaleTable1[scaleEntry];
 	if (minMove < absDeltaX) {
@@ -152,7 +152,7 @@ void NoctropolisPlayer::calcManScale1() {
 			_vm->_scale = ((((_rawPlayer.y - _vm->_scaleMaxY + _vm->_scaleN1) *
 				_vm->_scaleT1 + (_vm->_scaleH2 << 8)) & 0xff00) / _vm->_scaleH1 * _vm->_scaleI) >> 8;
 		}
-		
+
 		_vm->_screen->setScaleTable(_vm->_scale);
 		_playerOffset.x = _vm->_screen->_scaleTable1[60];
 		_playerOffset.y = _vm->_screen->_scaleTable1[200];
@@ -172,6 +172,8 @@ void NoctropolisPlayer::walk() {
 	if (_playerOff)
 		return;
 
+	_vm->_curPlayer = this;
+
 	updatePlayerDirection();
 
 	calcManScale();
@@ -180,7 +182,8 @@ void NoctropolisPlayer::walk() {
 		// Idle animation (using last direction)
 		_playerX = _rawPlayer.x;
 		_playerY = _rawPlayer.y;
-		_animManager->animate(_animNumForDir(_lastDirection) + 8);
+		if (_animManager)
+			_animManager->animate(_animNumForDir(_lastDirection) + 8);
 		_playerMove = false;
 	} else {
 		// Move animation
@@ -199,9 +202,9 @@ void NoctropolisPlayer::walk() {
 			_animManager->animate(dirAnimNum);
 		_rawPlayer.x = _playerX;
 		_rawPlayer.y = _playerY;
-		
+
 		calcManScale1();
-		
+
 		/*
 		if (local_30 != (byte *)0x0) {
 			local_48.animNum = dirAnimNum;
@@ -212,6 +215,12 @@ void NoctropolisPlayer::walk() {
 	}
 }
 
+void NoctropolisPlayer::synchronize(Common::Serializer &s) {
+	Player::synchronize(s);
+	s.syncAsSint16LE(_moveTo.x);
+	s.syncAsSint16LE(_moveTo.x);
+	s.syncAsByte(_playerMove);
+}
 
 
 } // End of namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_player.h b/engines/access/noctropolis/noctropolis_player.h
index 24402baec6e..fb0665f568c 100644
--- a/engines/access/noctropolis/noctropolis_player.h
+++ b/engines/access/noctropolis/noctropolis_player.h
@@ -53,6 +53,7 @@ public:
 
 	void updateTimers() override;
 
+	void synchronize(Common::Serializer &s) override;
 };
 
 } // End of namespace Noctropolis
diff --git a/engines/access/player.cpp b/engines/access/player.cpp
index dac8fdbd481..c1e9b720d8f 100644
--- a/engines/access/player.cpp
+++ b/engines/access/player.cpp
@@ -137,9 +137,9 @@ void Player::load() {
 	_playerSprites = _playerSprites1;
 	if (_manPal1) {
 		if (_vm->getGameID() == kGameNoctropolis) {
-			if (_vm->_room->_roomFlag & kRoomFlagStiletto) {
-				Common::copy(_manPal1 + 0x1e0, _manPal1 + 0x1e0 + 99, _vm->_screen->_stilPal);
-			}
+			//if (_vm->_room->_roomFlag & kRoomFlagStiletto) {
+			//	Common::copy(_manPal1 + 0x1e0, _manPal1 + 0x1e0 + 99, _vm->_screen->_stilPal);
+			//}
 			Common::copy(_manPal1 + 0x240, _manPal1 + 0x240 + 0x84, _vm->_screen->_manPal);
 		} else {
 			// Those values are from MM as Amazon doesn't use it
diff --git a/engines/access/player.h b/engines/access/player.h
index c4c820820ae..4d277d1c086 100644
--- a/engines/access/player.h
+++ b/engines/access/player.h
@@ -47,9 +47,6 @@ class AccessEngine;
 
 class Player : public ImageEntry, public Manager {
 protected:
-	// should be constructed via ::init().
-	Player(AccessEngine *vm);
-
 	int _leftDelta, _rightDelta;
 	int _upDelta, _downDelta;
 	int _scrollConst;
@@ -84,6 +81,9 @@ protected:
 
 	void loadPalResource(Resource *pal);
 public:
+	// should be constructed via ::init().
+	Player(AccessEngine *vm);
+
 	Direction _playerDirection;
 	SpriteResource *_playerSprites;
 	// Fields in original Player structure
@@ -158,7 +158,7 @@ public:
 	/**
 	* Synchronize savegame data
 	*/
-	void synchronize(Common::Serializer &s);
+	virtual void synchronize(Common::Serializer &s);
 };
 
 } // End of namespace Access
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 2a89e980ba6..be6ed1d4715 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -214,7 +214,7 @@ void Room::doRoom() {
 					takePicture();
 				} else {
 					_vm->_player->walk();
-					if (_vm->getGameID() == kGameNoctropolis)
+					if (_vm->getGameID() == kGameNoctropolis && _roomFlag & kRoomFlagStiletto)
 						((Noctropolis::NoctropolisEngine *)_vm)->_stil->walk();
 					_vm->_midi->midiRepeat();
 					_vm->_player->checkScroll();
@@ -350,7 +350,8 @@ void Room::loadRoomData(const byte *roomData) {
 	if (_vm->getGameID() == kGameNoctropolis && _roomFlag & kRoomFlagStiletto) {
 		// Load _vm->_screen->_stilPal
 		Resource *stilPal = _vm->_files->loadFile(0xfd, _palIntensity + 6);
-		memcpy(stilPal->data() + 480, _vm->_screen->_stilPal, 99);
+		memcpy(_vm->_screen->_stilPal, stilPal->data() + 480, 99);
+		delete stilPal;
 
 		Player *stil = ((Noctropolis::NoctropolisEngine *)_vm)->_stil;
 		((Noctropolis::NoctropolisPlayer *)stil)->loadAnimation(0xfd, 0);
@@ -358,6 +359,7 @@ void Room::loadRoomData(const byte *roomData) {
 		for (int subFileNum = 1; subFileNum < 6; subFileNum++) {
 			Resource *data = _vm->_files->loadFile(0xfd, subFileNum);
 			_vm->_objectsTable[0x6d + subFileNum] = new SpriteResource(_vm, data);
+			delete data;
 		}
 	}
 


Commit: ee6c0fdc06dd0dfaf788f0eb9780e310c6d09f90
    https://github.com/scummvm/scummvm/commit/ee6c0fdc06dd0dfaf788f0eb9780e310c6d09f90
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: More Stiletto fixes for Noctropolis

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/noctropolis/noctropolis_player.cpp
    engines/access/noctropolis/noctropolis_player.h
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/noctropolis/noctropolis_room.h
    engines/access/room.cpp
    engines/access/scripts.cpp


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index dfdacfb420e..653a501ed95 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -119,7 +119,7 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_exitBox = false;
 
 	_icons = nullptr;
-	_stilScale = 0;
+	_stilScaleOff = 0;
 
 	ARRAYCLEAR(_countTbl);
 }
diff --git a/engines/access/access.h b/engines/access/access.h
index 207c9aa71d3..b288092722f 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -293,7 +293,7 @@ public:
 	bool _restartFl;
 	bool _textFlag; // whether subtitles are enabled
 	bool _exitBox; // whether the current hotspot is an exit (Noctropolis only)
-	uint16 _stilScale;
+	uint16 _stilScaleOff;
 
 	// Fields mapped into the flags array
 	int &_useItem;
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 5bc07bf2301..e87f06940b1 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -37,7 +37,8 @@ namespace Noctropolis {
 
 NoctropolisEngine::NoctropolisEngine(OSystem *syst, const AccessGameDescription *gameDesc) :
 AccessEngine(syst, gameDesc), _invScript(nullptr), _stil(nullptr), _loadFlag(false),
-_travScrollX(0), _travScrollY(0), _travScrollCol(0), _travScrollRow(0)
+_travScrollX(0), _travScrollY(0), _travScrollCol(0), _travScrollRow(0), _stilFlag1(_flags[205]),
+_stilFlag2(_flags[234])
 {
 }
 
@@ -51,7 +52,7 @@ void NoctropolisEngine::initObjects() {
 	_invScript = new NoctropolisScripts(this);
 	_inventory = new NoctropolisInventory(this);
 	_video = new VideoPlayer_v2(this);
-	_stil = new NoctropolisPlayer(this);
+	_stil = new NoctropolisPlayer(this, true);
 
 	const Common::FSNode gameDataDir(ConfMan.getPath("path"));
 	SearchMan.addSubDirectoryMatching(gameDataDir, "comdata");
@@ -751,6 +752,14 @@ void NoctropolisEngine::doSpecialComic() {
 	delete comic;
 }
 
+void NoctropolisEngine::stilWalk() {
+	if (!(_room->_roomFlag & kRoomFlagStiletto) || _stilFlag1 == 1)
+		return;
+	if ((_player->_roomNumber == 26 && _stilFlag2 == 1) || (_player->_roomNumber != 26 && _stilFlag2 != 2))
+		return;
+	_stil->walk();
+}
+
 void NoctropolisEngine::synchronize(Common::Serializer &s) {
 	AccessEngine::synchronize(s);
 
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index 3fa9e64b266..a5d014de1e1 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -65,10 +65,14 @@ public:
 	bool _loadFlag;
 	byte _minigameCurrentConfig[9];
 
+	int &_stilFlag1;
+	int &_stilFlag2;
+
 	Scripts *_invScript;
 
 	void doTravel();
 	void setStilettoPos();
+	void stilWalk();
 
 	void initMinigame();
 	void displayPegsTick();
diff --git a/engines/access/noctropolis/noctropolis_player.cpp b/engines/access/noctropolis/noctropolis_player.cpp
index 90f45ab68e4..08e3c2b1368 100644
--- a/engines/access/noctropolis/noctropolis_player.cpp
+++ b/engines/access/noctropolis/noctropolis_player.cpp
@@ -30,7 +30,8 @@ namespace Access {
 
 namespace Noctropolis {
 
-NoctropolisPlayer::NoctropolisPlayer(AccessEngine *vm) : Player(vm), _lastDirection(DOWN), _animManager(nullptr) {
+NoctropolisPlayer::NoctropolisPlayer(AccessEngine *vm, bool isStil) : Player(vm), _lastDirection(DOWN),
+_animManager(nullptr), _isStil(isStil) {
 	_game = (NoctropolisEngine *)vm;
 }
 
@@ -139,16 +140,9 @@ void NoctropolisPlayer::calcManScale() {
 }
 
 void NoctropolisPlayer::calcManScale1() {
-	_vm->_scale = _vm->_manScaleOff;
+	_vm->_scale = (_isStil ? _vm->_stilScaleOff : _vm->_manScaleOff);
 	if (!(_vm->_room->_roomFlag & kRoomFlagTopView)) {
 		if (_vm->_scale == 0) {
-			/*
-			_vm->_scale = (_vm->_scaleI *
-						   ((_vm->_scaleH2 * 0x100 +
-							 _vm->_scaleT1 *
-							 (_vm->_scaleN1 + (_playerY - _vm->_scaleMaxY)) & 0xff00) /
-							_vm->_scaleH1) >> 8);
-							*/
 			_vm->_scale = ((((_rawPlayer.y - _vm->_scaleMaxY + _vm->_scaleN1) *
 				_vm->_scaleT1 + (_vm->_scaleH2 << 8)) & 0xff00) / _vm->_scaleH1 * _vm->_scaleI) >> 8;
 		}
diff --git a/engines/access/noctropolis/noctropolis_player.h b/engines/access/noctropolis/noctropolis_player.h
index fb0665f568c..636e7468679 100644
--- a/engines/access/noctropolis/noctropolis_player.h
+++ b/engines/access/noctropolis/noctropolis_player.h
@@ -36,6 +36,7 @@ private:
 	NoctropolisEngine *_game;
 	Direction _lastDirection;
 	AnimationManager *_animManager;
+	bool _isStil;
 
 	void updatePlayerDirection();
 
@@ -43,7 +44,7 @@ private:
 	void calcManScale1();
 
 public:
-	NoctropolisPlayer(AccessEngine *vm);
+	NoctropolisPlayer(AccessEngine *vm, bool isStil = false);
 	~NoctropolisPlayer();
 
 	void load() override;
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index c4203d33920..b226bd4564c 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -108,7 +108,6 @@ void NoctropolisRoom::reloadRoom1() {
 	buildScreen();
 	_vm->copyBF2Vid();
 
-	// TODO: Work out if this is right - the second room has roomflag 0 so maybe not??
 	if (_roomFlag >= 0 && !(kRoomFlagNoPlayer & _roomFlag)) {
 		if (_roomFlag & kRoomFlagStiletto)
 			_vm->_screen->setStilPalette();
@@ -121,6 +120,13 @@ void NoctropolisRoom::reloadRoom1() {
 	_vm->_events->clearEvents();
 }
 
+void NoctropolisRoom::clearRoom() {
+	Room::clearRoom();
+
+	_vm->_manScaleOff = 0;
+	_vm->_stilScaleOff = 0;
+}
+
 void NoctropolisRoom::roomInit() {
 	Room::roomInit();
 
@@ -287,8 +293,8 @@ int NoctropolisRoom::checkPlayerBox(const Common::Point &pt) {
 	if (stil->_playerOff)
 		return 1;
 
-	_vm->_scale = _vm->_stilScale;
-	if (_vm->_stilScale == 0) {
+	_vm->_scale = _vm->_stilScaleOff;
+	if (_vm->_stilScaleOff == 0) {
 		_vm->_scale = (_vm->_scaleI *
 						(((_vm->_scaleH2 << 8) +
 						  _vm->_scaleT1 *
diff --git a/engines/access/noctropolis/noctropolis_room.h b/engines/access/noctropolis/noctropolis_room.h
index 8c979763626..dc3690dfe57 100644
--- a/engines/access/noctropolis/noctropolis_room.h
+++ b/engines/access/noctropolis/noctropolis_room.h
@@ -52,6 +52,8 @@ protected:
 
 	int validateBox(int boxId) override;
 
+	void clearRoom() override;
+
 	void roomInit() override;
 private:
 	// Like buildColumn but can handle negative playX.
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index be6ed1d4715..5886a882640 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -214,8 +214,8 @@ void Room::doRoom() {
 					takePicture();
 				} else {
 					_vm->_player->walk();
-					if (_vm->getGameID() == kGameNoctropolis && _roomFlag & kRoomFlagStiletto)
-						((Noctropolis::NoctropolisEngine *)_vm)->_stil->walk();
+					if (_vm->getGameID() == kGameNoctropolis)
+						((Noctropolis::NoctropolisEngine *)_vm)->stilWalk();
 					_vm->_midi->midiRepeat();
 					_vm->_player->checkScroll();
 				}
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index b575d4a9b5f..31c9920aedd 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -1923,8 +1923,14 @@ void Scripts::cmdSetCoords() {
 }
 
 void Scripts::cmdSetStilCoords() {
-	error("TODO: Implement Scripts::cmdSetStilCoords");
-	// ((Noctropolis::NoctropolisEngine *)_vm)->_stil->
+	const int x = _data->readSint16LE();
+	const int y = _data->readSint16LE();
+	debugC(1, kDebugScripts, "cmdSetStilCoords(x=%d, y=%d)", x, y);
+	Player *stil = ((Noctropolis::NoctropolisEngine *)_vm)->_stil;
+	stil->_rawPlayer.x = x;
+	stil->_moveTo.x = x;
+	stil->_rawPlayer.y = y;
+	stil->_moveTo.y = y;
 }
 
 void Scripts::cmdSetPlayerDir() {
@@ -1939,7 +1945,7 @@ void Scripts::cmdSetStilDir() {
 
 void Scripts::cmdStilScale() {
 	debugC(1, kDebugScripts, "cmdStilScale()");
-	_vm->_stilScale = _data->readUint16LE();
+	_vm->_stilScaleOff = _data->readUint16LE();
 }
 
 void Scripts::cmdLockInterface() {


Commit: 524d663c3e0e1127e092f2c02797916f196dca9c
    https://github.com/scummvm/scummvm/commit/524d663c3e0e1127e092f2c02797916f196dca9c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fixes for Noctropolis travel

Changed paths:
    engines/access/bubble_box.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_resources.h
    engines/access/room.cpp


diff --git a/engines/access/bubble_box.cpp b/engines/access/bubble_box.cpp
index 86a639ffa32..27d922c438f 100644
--- a/engines/access/bubble_box.cpp
+++ b/engines/access/bubble_box.cpp
@@ -61,6 +61,8 @@ void BubbleBox::clearBubbles() {
 		_vm->_screen->_screenYOff = 0;
 		r.left -= 2;
 		r.right = MIN(r.right, (int16)_vm->_screen->w);
+		
+		r.translate(-_vm->_screen->_windowXAdd, -_vm->_screen->_windowYAdd);
 
 		_vm->_screen->copyBlock(&_vm->_buffer1, r);
 	}
@@ -127,7 +129,7 @@ void BubbleBox::calcBubble(const Common::String &msg) {
 			lastLine = _vm->_fonts._font2->getLine(s, screen._maxChars * 6, line, width);
 		} else {
 			assert(gameType == kGameNoctropolis);
-			lastLine = _vm->_fonts.getFont(4)->getLine(s, screen._maxChars, line, width, Font::kWidthInChars);
+			lastLine = _vm->_fonts.getFont(4)->getLine(s, 200, line, width, Font::kWidthInChars);
 			width = _vm->_fonts.getFont(4)->stringWidth(line);
 		}
 
@@ -292,7 +294,8 @@ void BubbleBox::printBubble_v3(const Common::String &msg) {
 		// Get next line
 		const Font *font = _vm->_fonts.getFont(4);
 		_vm->_fonts._font1 = font;
-		lastLine = font->getLine(s, _vm->_screen->_maxChars, line, width, Font::kWidthInChars);
+		// Note: don't use _vm->_screen->maxchars, never set in Noct.
+		lastLine = font->getLine(s, 200, line, width, Font::kWidthInChars);
 		// Draw the text
 		printString(line);
 
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index e87f06940b1..92d211d84af 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -378,14 +378,18 @@ void NoctropolisEngine::doTravel() {
 	_screen->setPaletteCycle(0xb5, 0xbe, 5);
 	_screen->fadeIn();
 
+	const Font *font = _fonts.getFont(3);
+	Font::_fontColors[0] = 0;
+	Font::_fontColors[1] = 181;
+
 	Common::Point rawMouse;
-	int locFlag = -1;
+	int selectedLoc = -1;
+	int hoveredLoc = -1;
 	// Show the map and wait for clicks
-	while (!shouldQuitOrRestart() && locFlag == -1) {
+	while (!shouldQuitOrRestart() && selectedLoc == -1) {
 		_midi->midiRepeat();
 
-		// TODO: check me.. is buildScreen equivalent??
-		((NoctropolisRoom *)_room)->buildScreenXScroll();
+		_room->buildScreen();
 		_buffer2.copyFrom(_buffer1);
 
 		_player->calcPlayer();
@@ -403,33 +407,29 @@ void NoctropolisEngine::doTravel() {
 		copyBF2Vid();
 
 		_screen->cyclePaletteForward();
-		locFlag = -1;
+		selectedLoc = -1;
 		rawMouse = _events->calcRawMouse();
 
+		int boxResult = _room->checkBoxes1(rawMouse);
+		if (boxResult != hoveredLoc) {
+			_screen->fillRect(Common::Rect(Common::Point(220, 380), 300, 16), 246);
+			if (boxResult != -1) {
+				const char *name = ((NoctropolisResources *)_res)->getPlaceName(boxResult);
+				font->drawString(_screen, name, Common::Point(220, 380));
+			}
+			hoveredLoc = boxResult;
+		}
 		if (_events->_leftButton) {
 			_events->debounceLeft();
-			int boxResult = _room->checkBoxes1(rawMouse);
 			if (boxResult != -1 && _travel[boxResult])
-				locFlag = boxResult;
+				selectedLoc = boxResult;
 		}
 
-		if (!_events->_leftButton || locFlag == -1) {
-			int scrolly = _scrollY;
-
-			// TODO: Clean up these if()s a bit
-			if (rawMouse.y < 33) {
-				if (_scrollRow != 0 && (scrolly = _scrollY + -8, (_scrollY + -8) < 0)) {
-					int row = _scrollRow + -1;
-					scrolly = _scrollY + 8;
-					_scrollRow = 0;
-					if (-1 < row)
-						_scrollRow = row;
-				}
-			} else if (367 < rawMouse.y &&
-						(_screen->_vWindowHeight + _scrollRow != _room->_playFieldHeight) &&
-					   (scrolly = _scrollY + 8, 0xf < (_scrollY + 8))) {
-				scrolly = _scrollY + -8;
-				_scrollRow = _scrollRow + 1;
+		if (!_events->_leftButton || selectedLoc == -1) {
+			if (_events->_mousePos.y < 33 && _scrollRow > 0) {
+				_scrollRow--;
+			} else if (_events->_mousePos.y > 367 && _screen->_vWindowHeight + _scrollRow < _room->_playFieldHeight) {
+				_scrollRow++;
 			}
 		}
 
@@ -439,7 +439,7 @@ void NoctropolisEngine::doTravel() {
 	if (shouldQuitOrRestart())
 		return;
 
-	assert(locFlag > 0 && locFlag < 15);
+	assert(selectedLoc >= 0 && selectedLoc < 15);
 
 	// This is NoctTravelEngine::done
 	_screen->fadeOut();
@@ -447,9 +447,9 @@ void NoctropolisEngine::doTravel() {
 	_travScrollCol = _scrollCol;
 	_travScrollX = _scrollX;
 	_travScrollY = _scrollY;
-	_player->_roomNumber = TRAV_ROOMS[locFlag];
-	_player->_rawPlayer.x = TRAV_MAN_POS[locFlag * 2];
-	_player->_rawPlayer.y = TRAV_MAN_POS[locFlag * 2 + 1];
+	_player->_roomNumber = TRAV_ROOMS[selectedLoc];
+	_player->_rawPlayer.x = TRAV_MAN_POS[selectedLoc * 2];
+	_player->_rawPlayer.y = TRAV_MAN_POS[selectedLoc * 2 + 1];
 	_player->_moveTo = _player->_rawPlayer;
 	setStilettoPos();
 	_room->_function = FN_CLEAR1;
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 3de200b0d13..b4d0428bfb7 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -136,7 +136,8 @@ static const char *NOCT_FILES_2[] = {
 	"DARK/PLAYER.AP", "DARK/DARKSHR.AP",
 };
 
-static const char *NOCT_PLACE_NAMES[] = {
+static const char *NOCT_PLACE_NAMES[4][14] = {
+{
 	"       Cathedral",
 	"    Sunspire Tower",
 	"      Main Street",
@@ -151,6 +152,8 @@ static const char *NOCT_PLACE_NAMES[] = {
 	"Central Park Greenhouse",
 	"      Shadowlair",
 	"      Neon Noose",
+},
+{
 	"      Cathedrale",
 	"    Tour Sunspire",
 	"    Rue Principale",
@@ -165,6 +168,8 @@ static const char *NOCT_PLACE_NAMES[] = {
 	"  Serre de Central Park",
 	"     Antre d'Ombre",
 	"      Neon Noose",
+},
+{
 	"       Catedral",
 	"      Torre Solar",
 	"      Calle Mayor",
@@ -179,6 +184,8 @@ static const char *NOCT_PLACE_NAMES[] = {
 	" Invernadero del Parque",
 	"     Guarida Sombria",
 	"      Lazo de Neon",
+},
+{
 	"          Dom",
 	"      Sonnennadel",
 	"     Hauptstrasse",
@@ -193,6 +200,7 @@ static const char *NOCT_PLACE_NAMES[] = {
 	"Central Park Gewaechshaus",
 	"     Schattenhort",
 	"      Neon Noose",
+}
 };
 
 static const byte ROOMDATA_02[] = {
@@ -2159,7 +2167,17 @@ const char *NoctropolisResources::getAskItem(int num) const {
 	case Common::DE_DEU: return ASKITEMS[3][num];
 	default: error("Unsupported language for ask item");
 	}
+}
 
+const char *NoctropolisResources::getPlaceName(int num) const {
+	assert(num >= 0 && num < 33);
+	switch (_vm->getLanguage()) {
+	case Common::EN_ANY: return NOCT_PLACE_NAMES[0][num];
+	case Common::FR_FRA: return NOCT_PLACE_NAMES[1][num];
+	case Common::ES_ESP: return NOCT_PLACE_NAMES[2][num];
+	case Common::DE_DEU: return NOCT_PLACE_NAMES[3][num];
+	default: error("Unsupported language for place name");
+	}
 }
 
 const char *NoctropolisResources::getMoreItemsText() const {
diff --git a/engines/access/noctropolis/noctropolis_resources.h b/engines/access/noctropolis/noctropolis_resources.h
index a4285965b35..6f6fb7b96a0 100644
--- a/engines/access/noctropolis/noctropolis_resources.h
+++ b/engines/access/noctropolis/noctropolis_resources.h
@@ -68,6 +68,7 @@ public:
 	const char *getResponseTitle() const;
 	const char *getAskItem(int num) const;
 	const char *getMoreItemsText() const;
+	const char *getPlaceName(int num) const;
 
 	const ComicResource *getLastComicResource() const;
 	const ComicResource *getSpecialComicResource() const;
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 5886a882640..321aa5725fb 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -472,7 +472,7 @@ void Room::setupRoom() {
 	screen.setScaleTable(_vm->_scale);
 	screen.setBufferScan();
 
-	if (_roomFlag != 2)
+	if (_roomFlag != 2 || _vm->getGameID() == kGameNoctropolis)
 		screen.setIconPalette();
 
 	if (screen._vWindowWidth == _playFieldWidth) {


Commit: 9c2db3ad25454bfe360cbff6f6232e257c401223
    https://github.com/scummvm/scummvm/commit/9c2db3ad25454bfe360cbff6f6232e257c401223
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Clean up resources a bit

Changed paths:
    engines/access/font.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_resources.h
    engines/access/scripts.cpp


diff --git a/engines/access/font.cpp b/engines/access/font.cpp
index 44528ec2260..d73b281874c 100644
--- a/engines/access/font.cpp
+++ b/engines/access/font.cpp
@@ -37,7 +37,7 @@ int Font::charWidth(char c) const {
 	if (c < _firstCharIndex)
 		return 0;
 
-	return _chars[c - _firstCharIndex].w;
+	return _chars[(byte)c - _firstCharIndex].w;
 }
 
 int Font::stringWidth(const Common::String &msg) const {
@@ -117,7 +117,7 @@ void Font::drawString(BaseSurface *s, const Common::String &msg, const Common::P
 }
 
 int Font::drawChar(BaseSurface *s, char c, Common::Point &pt) const {
-	const Graphics::Surface &ch = _chars[c - _firstCharIndex];
+	const Graphics::Surface &ch = _chars[(byte)c - _firstCharIndex];
 	Graphics::Surface dest = s->getSubArea(Common::Rect(pt.x, pt.y, pt.x + ch.w, pt.y + ch.h));
 
 	// Loop through the lines of the character
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index b4d0428bfb7..f389835d8b2 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -1804,7 +1804,6 @@ static const char *ASKITEMS[4][33] = {
 };
 
 
-
 ///////////////////////////////////////////////////////////////
 
 NoctropolisResources::NoctropolisResources(AccessEngine *_vm) : Resources(_vm), _fontChaleteu(nullptr), _fontSystemeu(nullptr),
@@ -1822,12 +1821,22 @@ NoctropolisResources::~NoctropolisResources() {
 	delete _fontComicseu;
 }
 
-
 const char *NoctropolisResources::getEgoName() const {
 	return _vm->_flags[1] == 0 ? "PETER" :
 		_vm->getLanguage() == Common::ES_ESP ? "TENEBROSO" : "DARKSHEER";
 }
 
+static int _langOffset(Common::Language lang) {
+	switch (lang) {
+	case Common::EN_ANY: return 0;
+	case Common::FR_FRA: return 1;
+	case Common::ES_ESP: return 2;
+	case Common::DE_DEU: return 3;
+	default: error("Unsupported language %s for resource",
+		Common::getLanguageDescription(lang));
+	}
+}
+
 void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	// Note: *don't* call the base class here. Noctropolis doesn't have data in access.dat.
 
@@ -1986,13 +1995,7 @@ void NoctropolisResources::load(Common::SeekableReadStream &s) {
 	const Common::Language lang = _vm->getLanguage();
 	INVENTORY.resize(ARRAYSIZE(INVNAMES[0]));
 	for (i = 0; i < ARRAYSIZE(INVNAMES[0]); i++) {
-		switch (lang) {
-		case Common::EN_ANY: INVENTORY[i]._desc = INVNAMES[0][i]; break;
-		case Common::FR_FRA: INVENTORY[i]._desc = INVNAMES[1][i]; break;
-		case Common::ES_ESP: INVENTORY[i]._desc = INVNAMES[2][i]; break;
-		case Common::DE_DEU: INVENTORY[i]._desc = INVNAMES[3][i]; break;
-		default: error("Unsupported language for response title");
-		}
+		INVENTORY[i]._desc = INVNAMES[_langOffset(lang)][i];
 		memset(INVENTORY[i]._combo, 0, sizeof(INVENTORY[i]._combo));
 	}
 }
@@ -2012,7 +2015,7 @@ int NoctropolisResources::getCursorWidth(int num) const {
 }
 
 int NoctropolisResources::getCursorHeight(int num) const {
-	if (num < ARRAYSIZE(CURSOR_HEIGHTS))
+	if (num > 0 && num < ARRAYSIZE(CURSOR_HEIGHTS))
 		return CURSOR_HEIGHTS[num];
 	return 0;
 }
@@ -2034,7 +2037,8 @@ const byte *NoctropolisResources::getCursor(int num) const {
 	}
 }
 
-static const char *const NOCT_GENERAL_MESSAGES_EN[] = {
+static const char *const NOCT_GENERAL_MESSAGES[4][10] = {
+{
 	"Looking there reveals nothing of interest.",
 	"That doesn't open.",
 	"That won't move.",
@@ -2045,9 +2049,8 @@ static const char *const NOCT_GENERAL_MESSAGES_EN[] = {
 	"That doesn't seem to work.",
 	"That doesn't seem to work.",
 	"That doesn't seem to work.",
-};
-
-static const char *const NOCT_GENERAL_MESSAGES_FR[] = {
+},
+{
 	"Vous ne d\x82""couvrez rien d'int\x82""ressant.",
 	"\x80""a ne s'ouvre pas.",
 	"\x80""a ne bouge pas.",
@@ -2058,9 +2061,8 @@ static const char *const NOCT_GENERAL_MESSAGES_FR[] = {
 	"\x80""a ne marche pas.",
 	"\x80""a ne marche pas.",
 	"\x80""a ne marche pas.",
-};
-
-static const char *const NOCT_GENERAL_MESSAGES_ES[] = {
+},
+{
 	"No descubres nada de interes.",
 	"No se abre.",
 	"No se mueve.",
@@ -2071,9 +2073,8 @@ static const char *const NOCT_GENERAL_MESSAGES_ES[] = {
 	"Eso no funciona.",
 	"Eso no funciona.",
 	"Eso no funciona.",
-};
-
-static const char *const NOCT_GENERAL_MESSAGES_DE[] = {
+},
+{
 	"Dieser Anblick zeigt nichts Interessantes.",
 	"Das l\x84\xe1t sich nicht \x94""ffnen.",
 	"Bewegt sich keinen Millimeter.",
@@ -2084,110 +2085,101 @@ static const char *const NOCT_GENERAL_MESSAGES_DE[] = {
 	"Das scheint nicht zu funktionieren.",
 	"Das scheint nicht zu funktionieren.",
 	"Das scheint nicht zu funktionieren.",
+}
 };
 
+static const char *const END_MESSAGE[4] = {
+	"Don't look at me, you're the city's new champion.",
+	"Ne me regardez pas. C'est vous le nouveau\nchampion de la ville.",
+	"No me mires. Eres tu el nuevo campeon.",
+	"Schau mich nicht an, du bist der neue Held der Stadt.",
+};
+
+static const char *const MEANWHILE_MESSAGE[4] = {
+	"MEANWHILE...",
+	"PENDANT CE TEMPS...",
+	"MIENTRAS...",
+	"INZWISCHEN...",
+};
+
+static const char *const SHOTO_NAME[4] = {
+	"MS. SHOTO",
+	"Mme SHOTO",
+	"SRA. SHOTO",
+	"MS. SHOTO",
+};
+
+static const char *const SHOTO_TEXT[4] = {
+	"He was just here....\nHe's better than we thought.",
+	"Il sort d'ici ... l'instant...\nIl est meilleur que nous pensions.",
+	"Ha estado aqui...\nEsta mejor de lo que pensabamos.",
+	"Er war gerade hier...\nEr ist besser, als wir dachten.",
+};
+
+static const char *const STIL_MSG[4] = {
+	"Don't worry about me, Peter. You know I'll\nsupport whatever you've got planned.",
+	"Ne vous inqui\x82tez pas pour moi, Peter. Vous\nsavez que je supporterai tous vos plans.",
+	"No te preocupes por mi, Peter. Te ayudare\nen cualquier cosa que intentes.",
+	"K\x81mmer' dich nicht um mich, Peter. Du wei\xe1t, ich\nunterst\x81tze dich bei allem, was du vorhast.",
+};
+
+static const char *const RESPONSE_TITLE[4] = {
+	"RESPONSE %d",
+	"REPONSE %d",
+	"RESPUESA %d",
+	"ANTWORT %d",
+};
+
+static const char *const MORE_ITEMS_TITLE[4] = {
+	"       MORE ITEMS       ",
+	"    PLUS D'ARTICLES     ",
+	"       MAS OBJETOS      ",
+	"       MEHR INFO        ",
+};
+
+
 const char *NoctropolisResources::getGeneralMessage(int command) const {
-	if (command < 0 || command >= ARRAYSIZE(NOCT_GENERAL_MESSAGES_EN))
+	if (command < 0 || command >= ARRAYSIZE(NOCT_GENERAL_MESSAGES[0]))
 		error("No general message for command %d", command);
-	switch (_vm->getLanguage()) {
-	case Common::EN_ANY: return NOCT_GENERAL_MESSAGES_EN[command];
-	case Common::FR_FRA: return NOCT_GENERAL_MESSAGES_FR[command];
-	case Common::ES_ESP: return NOCT_GENERAL_MESSAGES_ES[command];
-	case Common::DE_DEU: return NOCT_GENERAL_MESSAGES_DE[command];
-	default: error("Unsupported language for general message");
-	}
+	return NOCT_GENERAL_MESSAGES[_langOffset(_vm->getLanguage())][command];
 }
 
 const char *NoctropolisResources::getEndMessage() const {
-	switch (_vm->getLanguage()) {
-	case Common::EN_ANY: return "Don't look at me, you're the city's new champion.";
-	case Common::FR_FRA: return "Ne me regardez pas. C'est vous le nouveau\nchampion de la ville.";
-	case Common::ES_ESP: return "No me mires. Eres tu el nuevo campeon.";
-	case Common::DE_DEU: return "Schau mich nicht an, du bist der neue Held der Stadt.";
-	default: error("Unsupported language for end message");
-	}
+	return END_MESSAGE[_langOffset(_vm->getLanguage())];
 }
 
 const char *NoctropolisResources::getMeanwhileMessage() const {
-	switch (_vm->getLanguage()) {
-	case Common::EN_ANY: return "MEANWHILE...";
-	case Common::FR_FRA: return "PENDANT CE TEMPS...";
-	case Common::ES_ESP: return "MIENTRAS...";
-	case Common::DE_DEU: return "INZWISCHEN...";
-	default: error("Unsupported language for meanwhile message");
-	}
+	return MEANWHILE_MESSAGE[_langOffset(_vm->getLanguage())];
 }
 
 const char *NoctropolisResources::getShotoTitle() const {
-	switch (_vm->getLanguage()) {
-	case Common::EN_ANY: return "MS. SHOTO";
-	case Common::FR_FRA: return "Mme SHOTO";
-	case Common::ES_ESP: return "SRA. SHOTO";
-	case Common::DE_DEU: return "MS. SHOTO";
-	default: error("Unsupported language for ms shoto title");
-	}
+	return SHOTO_NAME[_langOffset(_vm->getLanguage())];
 }
 
 const char *NoctropolisResources::getShotoText() const {
-	switch (_vm->getLanguage()) {
-	case Common::EN_ANY: return "He was just here....\nHe's better than we thought.";
-	case Common::FR_FRA: return "Il sort d'ici ... l'instant...\nIl est meilleur que nous pensions.";
-	case Common::ES_ESP: return "Ha estado aqui...\nEsta mejor de lo que pensabamos.";
-	case Common::DE_DEU: return "Er war gerade hier...\nEr ist besser, als wir dachten.";
-	default: error("Unsupported language for ms shoto text");
-	}
+	return SHOTO_TEXT[_langOffset(_vm->getLanguage())];
 }
 
-const char *NoctropolisResources::getStilEndMessage() const {
-	switch (_vm->getLanguage()) {
-	case Common::EN_ANY: return "Don't worry about me, Peter. You know I'll\nsupport whatever you've got planned.";
-	case Common::FR_FRA: return "Ne vous inqui\x82tez pas pour moi, Peter. Vous\nsavez que je supporterai tous vos plans.";
-	case Common::ES_ESP: return "No te preocupes por mi, Peter. Te ayudare\nen cualquier cosa que intentes.";
-	case Common::DE_DEU: return "K\x81mmer' dich nicht um mich, Peter. Du wei\xe1t, ich\nunterst\x81tze dich bei allem, was du vorhast.";
-	default: error("Unsupported language for stil end message");
-	}
+const char *NoctropolisResources::getStilMessage() const {
+	return STIL_MSG[_langOffset(_vm->getLanguage())];
 }
 
 const char *NoctropolisResources::getResponseTitle() const {
-	switch (_vm->getLanguage()) {
-	case Common::EN_ANY: return "RESPONSE %d";
-	case Common::FR_FRA: return "REPONSE %d";
-	case Common::ES_ESP: return "RESPUESA %d";
-	case Common::DE_DEU: return "ANTWORT %d";
-	default: error("Unsupported language for response title");
-	}
+	return RESPONSE_TITLE[_langOffset(_vm->getLanguage())];
 }
 
 const char *NoctropolisResources::getAskItem(int num) const {
-	assert(num >= 0 && num < 33);
-	switch (_vm->getLanguage()) {
-	case Common::EN_ANY: return ASKITEMS[0][num];
-	case Common::FR_FRA: return ASKITEMS[1][num];
-	case Common::ES_ESP: return ASKITEMS[2][num];
-	case Common::DE_DEU: return ASKITEMS[3][num];
-	default: error("Unsupported language for ask item");
-	}
+	assert(num >= 0 && num < ARRAYSIZE(ASKITEMS[0]));
+	return ASKITEMS[_langOffset(_vm->getLanguage())][num];
 }
 
 const char *NoctropolisResources::getPlaceName(int num) const {
-	assert(num >= 0 && num < 33);
-	switch (_vm->getLanguage()) {
-	case Common::EN_ANY: return NOCT_PLACE_NAMES[0][num];
-	case Common::FR_FRA: return NOCT_PLACE_NAMES[1][num];
-	case Common::ES_ESP: return NOCT_PLACE_NAMES[2][num];
-	case Common::DE_DEU: return NOCT_PLACE_NAMES[3][num];
-	default: error("Unsupported language for place name");
-	}
+	assert(num >= 0 && num < ARRAYSIZE(NOCT_PLACE_NAMES[0]));
+	return NOCT_PLACE_NAMES[_langOffset(_vm->getLanguage())][num];
 }
 
 const char *NoctropolisResources::getMoreItemsText() const {
-	switch (_vm->getLanguage()) {
-	case Common::EN_ANY: return "       MORE ITEMS       ";
-	case Common::FR_FRA: return "    PLUS D'ARTICLES     ";
-	case Common::ES_ESP: return "       MAS OBJETOS      ";
-	case Common::DE_DEU: return "       MEHR INFO        ";
-	default: error("Unsupported language for more items text");
-	}
+	return MORE_ITEMS_TITLE[_langOffset(_vm->getLanguage())];
 }
 
 const ComicResource *NoctropolisResources::getLastComicResource() const {
diff --git a/engines/access/noctropolis/noctropolis_resources.h b/engines/access/noctropolis/noctropolis_resources.h
index 6f6fb7b96a0..af6098ed57b 100644
--- a/engines/access/noctropolis/noctropolis_resources.h
+++ b/engines/access/noctropolis/noctropolis_resources.h
@@ -64,7 +64,7 @@ public:
 	const char *getMeanwhileMessage() const;
 	const char *getShotoTitle() const;
 	const char *getShotoText() const;
-	const char *getStilEndMessage() const;
+	const char *getStilMessage() const;
 	const char *getResponseTitle() const;
 	const char *getAskItem(int num) const;
 	const char *getMoreItemsText() const;
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 31c9920aedd..70254b00353 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -340,7 +340,7 @@ void Scripts::cmdEndObject_v3() {
 		if (_vm->_textFlag) {
 			const char *subtitle = res->getEndMessage();
 			if (_vm->_flags[91] == 2) {
-				subtitle = res->getStilEndMessage();
+				subtitle = res->getStilMessage();
 			}
 			//NoctRoomEngine::setBoxInfo(&_gNoctRoomEngine,0x46,0xcd,"STILETTO",subtitle,3);
 		}


Commit: 28728dc3a04c841ca15f66b3c659f7a91aac9dab
    https://github.com/scummvm/scummvm/commit/28728dc3a04c841ca15f66b3c659f7a91aac9dab
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Misc fixes for Noctropolis

Changed paths:
    engines/access/animation.cpp
    engines/access/asurface.cpp
    engines/access/asurface.h
    engines/access/bubble_box.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/room.cpp
    engines/access/screen.cpp
    engines/access/screen.h
    engines/access/scripts.cpp
    engines/access/sound.cpp
    engines/access/video.cpp


diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index 41555c767d9..365f40de027 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -126,6 +126,7 @@ void Animation::anim0() {
 	}
 }
 
+// Loop and then leave the last frame
 void Animation::anim1() {
 	if (_currentLoopCount == -1 || _countdownTicks != 0) {
 		setFrame1(calcFrame());
@@ -144,6 +145,7 @@ void Animation::anim1() {
 	}
 }
 
+// Loop forever
 void Animation::anim2() {
 	if (_countdownTicks != 0) {
 		setFrame1(calcFrame());
@@ -161,28 +163,35 @@ void Animation::anim2() {
 	}
 }
 
+// Loop and stop.
 void Animation::anim3() {
-	if (_currentLoopCount != -1) {
-		if (_countdownTicks != 0) {
-			setFrame1(calcFrame());
-		} else {
-			_countdownTicks = _initialTicks;
-			++_frameNumber;
-			const AnimationFrame *frame = calcFrame();
+	if (_currentLoopCount == -1)
+		return;
 
-			if (frame == nullptr) {
-				--_currentLoopCount;
-				_frameNumber = 0;
-				frame = calcFrame();
-			}
+	if (_countdownTicks != 0) {
+		setFrame1(calcFrame());
+	} else {
+		_countdownTicks = _initialTicks;
+		++_frameNumber;
+		const AnimationFrame *frame = calcFrame();
 
-			setFrame(frame);
+		if (frame == nullptr) {
+			--_currentLoopCount;
+			_frameNumber = 0;
+			frame = calcFrame();
 		}
+
+		setFrame(frame);
 	}
 }
 
+// Loop and stop?? How is this different from 3?
+// It can't leave the last frame there, that breaks
+// Stiletto's door opening in Noctropolis.
 void Animation::anim4() {
-	if (_currentLoopCount == -1 || _countdownTicks != 0) {
+	if (_currentLoopCount == -1)
+		return;
+	if (_countdownTicks != 0) {
 		setFrame1(calcFrame());
 	} else {
 		_countdownTicks = _initialTicks;
@@ -191,7 +200,6 @@ void Animation::anim4() {
 
 		if (frame == nullptr) {
 			if (--_currentLoopCount == -1) {
-				setFrame1(calcFrame());
 				return;
 			} else {
 				_frameNumber = 0;
@@ -207,6 +215,7 @@ void Animation::animNone() {
 	// Empty implementation
 }
 
+// Just a single frame.
 void Animation::anim7() {
 	setFrame(calcFrame1());
 }
@@ -327,6 +336,11 @@ void Animation::setFrame1(const AnimationFrame *frame, int16 xoff, int16 yoff) {
 			ie._offsetY = part._offsetY - ie._position.y;
 		}
 
+		/*
+		Common::String dumpfn = Common::String::format("anim_%d_%d_%d_sprite_%d_frame_%d", ie._position.x, ie._position.y, ie._offsetY, part._spritesIndex, part._frameIndex);
+		ie._spritesPtr->getFrame(ie._frameNumber)->dump(dumpfn.c_str());
+		*/
+
 		_vm->_images.addToList(ie);
 	}
 }
diff --git a/engines/access/asurface.cpp b/engines/access/asurface.cpp
index 08658f99c93..e40e08c0e8f 100644
--- a/engines/access/asurface.cpp
+++ b/engines/access/asurface.cpp
@@ -25,6 +25,17 @@
 #include "access/access.h"
 #include "access/asurface.h"
 
+// for frame contents debugging
+#define DEBUG_FRAME_DUMP 1
+
+#ifdef DEBUG_FRAME_DUMP
+#include "graphics/paletteman.h"
+#include "image/png.h"
+#include "common/path.h"
+#include "common/file.h"
+#endif
+
+
 namespace Access {
 
 const int TRANSPARENCY = 0;
@@ -298,4 +309,17 @@ bool BaseSurface::clip(Common::Rect &r) {
 	return false;
 }
 
+void BaseSurface::dump(const char *fname) const {
+#ifdef DEBUG_FRAME_DUMP
+	// For debugging, dump the frame contents.
+	::Common::DumpFile outf;
+	uint32 now = g_system->getMillis();
+	outf.open(::Common::Path(::Common::String::format("/tmp/%07d-%s.png", now, fname)));
+	byte pal[768];
+	((AccessEngine *)g_engine)->_screen->getPalette(pal);
+	::Image::writePNG(outf, *this, pal);
+	outf.close();
+#endif
+}
+
 } // End of namespace Access
diff --git a/engines/access/asurface.h b/engines/access/asurface.h
index 984b0ef3a7c..46767a5acf4 100644
--- a/engines/access/asurface.h
+++ b/engines/access/asurface.h
@@ -117,6 +117,11 @@ public:
 	void moveBufferDown();
 
 	bool clip(Common::Rect &r);
+
+	/**
+	 * dump to png for debugging
+	 */
+	void dump(const char *fname) const;
 };
 
 class ASurface : public BaseSurface {
diff --git a/engines/access/bubble_box.cpp b/engines/access/bubble_box.cpp
index 27d922c438f..95c62293c46 100644
--- a/engines/access/bubble_box.cpp
+++ b/engines/access/bubble_box.cpp
@@ -61,10 +61,8 @@ void BubbleBox::clearBubbles() {
 		_vm->_screen->_screenYOff = 0;
 		r.left -= 2;
 		r.right = MIN(r.right, (int16)_vm->_screen->w);
-		
-		r.translate(-_vm->_screen->_windowXAdd, -_vm->_screen->_windowYAdd);
 
-		_vm->_screen->copyBlock(&_vm->_buffer1, r);
+		_vm->_screen->blitFrom(_vm->_buffer1, r, r);
 	}
 
 	// Clear the list
@@ -277,8 +275,6 @@ void BubbleBox::printBubble_v2(const Common::String &msg) {
 }
 
 void BubbleBox::printBubble_v3(const Common::String &msg) {
-	Font::_fontColors[1] = 255;
-
 	drawBubble(_bubbles.size() - 1);
 
 	Font::_fontColors[1] = 255;
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index f389835d8b2..346ceeee282 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -2015,7 +2015,7 @@ int NoctropolisResources::getCursorWidth(int num) const {
 }
 
 int NoctropolisResources::getCursorHeight(int num) const {
-	if (num > 0 && num < ARRAYSIZE(CURSOR_HEIGHTS))
+	if (num >= 0 && num < ARRAYSIZE(CURSOR_HEIGHTS))
 		return CURSOR_HEIGHTS[num];
 	return 0;
 }
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 321aa5725fb..5e9a0fd5a4a 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -1161,7 +1161,7 @@ bool Room::checkCode(int v1, int v2) {
 /*------------------------------------------------------------------------*/
 
 RoomInfo::RoomInfo(const byte *data, AccessGameType gameType, bool isCD, bool isDemo) {
-	Common::MemoryReadStream stream(data, 999);
+	Common::MemoryReadStream stream(data, 2048);
 
 	_roomFlag = stream.readByte();
 
diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp
index d19df0905d7..02b9c16445c 100644
--- a/engines/access/screen.cpp
+++ b/engines/access/screen.cpp
@@ -33,16 +33,6 @@
 #include "access/noctropolis/noctropolis_resources.h"
 
 
-// for frame contents debugging
-//#define DEBUG_FRAME_DUMP 1
-
-#ifdef DEBUG_FRAME_DUMP
-#include "graphics/paletteman.h"
-#include "image/png.h"
-#include "common/path.h"
-#include "common/file.h"
-#endif
-
 namespace Access {
 
 ScreenSave::ScreenSave() : _clipWidth(0), _clipHeight(0), _windowXAdd(0), _windowYAdd(0), _scrollCol(0), _scrollRow(0), _screenYOff(0) {
@@ -418,15 +408,4 @@ void Screen::flashPalette(int step) {
 	_vm->_events->pollEventsAndWait();
 }
 
-void Screen::dump(const char *fname) const {
-#ifdef DEBUG_FRAME_DUMP
-	// For debugging, dump the frame contents.
-	::Common::DumpFile outf;
-	uint32 now = g_system->getMillis();
-	outf.open(::Common::Path(::Common::String::format("/tmp/%07d-%s.png", now, fname)));
-	::Image::writePNG(outf, *this, _rawPalette);
-	outf.close();
-#endif
-}
-
 } // End of namespace Access
diff --git a/engines/access/screen.h b/engines/access/screen.h
index 89fcae15554..ec7abc19b84 100644
--- a/engines/access/screen.h
+++ b/engines/access/screen.h
@@ -194,8 +194,6 @@ public:
 	void cyclePaletteForward();
 
 	void cyclePaletteBackwards();
-
-	void dump(const char *fname) const;
 };
 
 } // End of namespace Access
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 70254b00353..3cd699c96d8 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -599,6 +599,15 @@ void Scripts::cmdSetInventory() {
 	_vm->_inventory->_startInvItem = 0;
 	_vm->_inventory->_startInvBox = 0;
 	_vm->_inventory->_invChangeFlag = true;
+
+	if (itemVal == 1 && _vm->getGameID() == kGameNoctropolis) {
+		// Slight hack - add a new sound to play the stinger.  This won't be freed
+		// until we leave the room, but there are only a few inv items in each room
+		// so the total leak is tiny.
+		Resource *sound = _vm->_sound->loadSound(99, 64);
+		_vm->_sound->_soundTable.push_back(SoundEntry(sound, 1));
+		_vm->_sound->playSound(_vm->_sound->_soundTable.size() - 1);
+	}
 }
 
 void Scripts::cmdCheckInventory() {
@@ -1177,7 +1186,6 @@ void Scripts::cmdPlayerSpeak() {
 	Common::String str = _data->readString();
 	debugC(1, kDebugScripts, "cmdPlayerSpeak(%d, %d, \"%s\", \"%s\")", x, y, title, str.c_str());
 
-	// TODO: Check that this gives correct placement
 	_charsOrg = Common::Point(x, y);
 	_vm->_screen->_printOrg = _charsOrg;
 	_vm->_screen->_printStart = _charsOrg;
@@ -1187,7 +1195,14 @@ void Scripts::cmdPlayerSpeak() {
 	_vm->_bubbleBox->placeBubble(str);
 	_continuenceFlag = true;
 	findNull();
-	warning("TODO: Check rendering for cmdPlayerSpeak() box");
+
+	while (!_vm->shouldQuitOrRestart() && !_vm->_events->isKeyActionMousePressed()) {
+		_vm->_events->pollEventsAndWait();
+	}
+
+	_vm->_events->debounceLeft();
+	_vm->_events->zeroKeysActions();
+	_vm->_bubbleBox->clearBubbles();
 }
 
 
diff --git a/engines/access/sound.cpp b/engines/access/sound.cpp
index 195c0088332..eaf3ed4ba92 100644
--- a/engines/access/sound.cpp
+++ b/engines/access/sound.cpp
@@ -90,7 +90,7 @@ Resource *SoundManager::loadSound(int fileNum, int subfile) {
 	return _vm->_files->loadFile(fileNum, subfile);
 }
 
-void SoundManager::playSound(int soundIndex, bool loop) {
+void SoundManager::playSound(int soundIndex, bool loop /* = false */) {
 	debugC(1, kDebugSound, "playSound(%d, %d)", soundIndex, loop);
 	if (isSoundQueued(soundIndex))
 		// Prevent duplicate copies of a sound from being queued
diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index 4718c8148b2..46a2792f776 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -251,6 +251,9 @@ void VideoPlayer_v2::setVideo(const Common::Point &pt) {
 	_header._frameIncr = _videoData->_stream->readUint16LE();
 	_header._unk = _videoData->_stream->readUint16LE();
 
+	if (_header._id != 0x444956) // 'VID' (LE)
+		warning("Video header for %s is not VID", _videoData->getFileName());
+
 	_videoFrame = 0;
 	_audioStream = NULL;
 	_videoEnd = false;


Commit: e2e40d33afba9e56f9619727377448d7e3605a43
    https://github.com/scummvm/scummvm/commit/e2e40d33afba9e56f9619727377448d7e3605a43
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Mark some consts as constexpr

Changed paths:
    engines/access/amazon/amazon_resources.cpp
    engines/access/bubble_box.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/video/movie_decoder.cpp


diff --git a/engines/access/amazon/amazon_resources.cpp b/engines/access/amazon/amazon_resources.cpp
index 741b2c49ba1..f7c65e4c44e 100644
--- a/engines/access/amazon/amazon_resources.cpp
+++ b/engines/access/amazon/amazon_resources.cpp
@@ -158,7 +158,7 @@ const int DEATH_CELLS[13][3] = {
 	{ 0, 94, 14 }
 };
 
-const int CHAPTER_CELLS[17][3] = {
+constexpr int CHAPTER_CELLS[17][3] = {
 	{ 1, 96, 18 },
 	{ 2, 96, 19 },
 	{ 3, 96, 20 },
diff --git a/engines/access/bubble_box.cpp b/engines/access/bubble_box.cpp
index 95c62293c46..55ccc6b1dee 100644
--- a/engines/access/bubble_box.cpp
+++ b/engines/access/bubble_box.cpp
@@ -428,8 +428,8 @@ void BubbleBox::doBox_v2(int item, int box) {
 	// Save state information
 	FontVal charSet = fonts._charSet;
 	FontVal charFor = fonts._charFor;
-	Common::Point printOrg = screen._printOrg;
-	Common::Point printStart = screen._printStart;
+	const Common::Point printOrg = screen._printOrg;
+	const Common::Point printStart = screen._printStart;
 	int charCol = _charCol;
 	int rowOff = _rowOff;
 
@@ -629,7 +629,7 @@ void BubbleBox::drawSelectBox() {
 }
 
 int BubbleBox::doBox_v1(int item, int box, int &btnSelected) {
-	static const int ICONW[] = { 0, 11, 28, 19, 19, 15 };
+	static constexpr int ICONW[] = { 0, 11, 28, 19, 19, 15 };
 
 	FontManager &fonts = _vm->_fonts;
 	int retval_ = -1;
@@ -637,8 +637,8 @@ int BubbleBox::doBox_v1(int item, int box, int &btnSelected) {
 	_startItem = item;
 	_startBox = box;
 
-	Common::Point origPrintStart = _vm->_screen->_printStart;
-	Common::Point origPrintOrg = _vm->_screen->_printOrg;
+	const Common::Point origPrintStart = _vm->_screen->_printStart;
+	const Common::Point origPrintOrg = _vm->_screen->_printOrg;
 
 	_vm->_events->hideCursor();
 
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 92d211d84af..2c7c2b3bbd6 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -227,9 +227,9 @@ void NoctropolisEngine::doPublisherLogo() {
 }
 
 void NoctropolisEngine::doIntro() {
-	static const int lettersX[] = {106, 153, 197, 229, 271, 309, 357, 394, 443, 476, 504};
-	static const int titlesSpriteX[] = {238, 237, 237, 200, 200, 216, 231, 207, 198, 201, 234, 200, 220, 235, 214};
-	static const int titlesSpriteY[] = {108, 112, 125, 128, 128, 124, 128, 115, 131, 130, 102, 112, 112, 102, 112};
+	static constexpr int lettersX[] = {106, 153, 197, 229, 271, 309, 357, 394, 443, 476, 504};
+	static constexpr int titlesSpriteX[] = {238, 237, 237, 200, 200, 216, 231, 207, 198, 201, 234, 200, 220, 235, 214};
+	static constexpr int titlesSpriteY[] = {108, 112, 125, 128, 128, 124, 128, 115, 131, 130, 102, 112, 112, 102, 112};
 
 	int16 skylineSpriteOfsX1 = 740;
 	int16 skylineSpriteOfsX2 = 1050;
@@ -456,7 +456,7 @@ void NoctropolisEngine::doTravel() {
 	_room->loadRoom(_player->_roomNumber);
 }
 
-static const short StilYDirOff[] = {
+static constexpr short StilYDirOff[] = {
 	10, 10, 10, 10, 5, 5, 10, 10, 10,
 };
 
@@ -539,16 +539,16 @@ void NoctropolisEngine::dead(int deathType) {
 }
 
 void NoctropolisEngine::initMinigame() {
-	static const byte minigameInitialConfig[9] = {2, 8, 9, 5, 6, 4, 1, 7, 3};
+	static constexpr byte minigameInitialConfig[9] = {2, 8, 9, 5, 6, 4, 1, 7, 3};
 	memcpy(_minigameCurrentConfig, minigameInitialConfig, 9);
 	_flags[91] = 0;
 }
 
 void NoctropolisEngine::displayPegsTick() {
-	static const byte redSol[3] = {9, 6, 3};
-	static const byte greenSol[3] = {2, 5, 8};
-	static const byte blueSol[3] = {1, 4, 7};
-	static const struct { int16 x, y; } pegPos[10] = {
+	static constexpr byte redSol[3] = {9, 6, 3};
+	static constexpr byte greenSol[3] = {2, 5, 8};
+	static constexpr byte blueSol[3] = {1, 4, 7};
+	static constexpr struct { int16 x, y; } pegPos[10] = {
 		{255, 201}, {143, 211},
 		{27, 57}, {249, 56},
 		{141, 174}, {67, 75},
@@ -582,7 +582,7 @@ void NoctropolisEngine::displayPegsTick() {
 }
 
 void NoctropolisEngine::movePeg(int16 slot) {
-	static const struct { int16 a, b; } pegPath[] = {
+	static constexpr struct { int16 a, b; } pegPath[] = {
 		{0, 1}, {1, 2}, {1, 5}, {1, 3}, {2, 3},
 		{2, 6}, {3, 4}, {4, 5}, {4, 8}, {4, 6},
 		{5, 6}, {5, 9}, {6, 7}, {7, 8}, {8, 9},
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 346ceeee282..03fce8f5c1a 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -103,7 +103,7 @@ const short TRAV_ICONS[] = {
 
 // The original game has 4 files after a bunch of nullptrs.
 // We add them separately to make this file a little smaller.
-static const char *NOCT_FILES_1[] = {
+static constexpr const char * NOCT_FILES_1[] = {
 	"DARK/MAP.AP", "DARK/SCENE01.AP", "DARK/SCENE02.AP", "DARK/SCENE03.AP",
 	"DARK/SCENE04.AP", "R05.AP", "R06.AP", "R07.AP",
 	"R08.AP", "R09.AP", "R10.AP", "DARK/SCENE11.AP",
@@ -131,12 +131,12 @@ static const char *NOCT_FILES_1[] = {
 	"DARK/SCENE96.AP", "DARK/SCENE97.AP", "DARK/MUSIC.AP", "DARK/SOUND.AP",
 };
 
-static const char *NOCT_FILES_2[] = {
+static constexpr const char *NOCT_FILES_2[] = {
 	"DARK/TOP.AP", "DARK/STILETTO.AP",
 	"DARK/PLAYER.AP", "DARK/DARKSHR.AP",
 };
 
-static const char *NOCT_PLACE_NAMES[4][14] = {
+static constexpr const char *NOCT_PLACE_NAMES[4][14] = {
 {
 	"       Cathedral",
 	"    Sunspire Tower",
@@ -203,7 +203,7 @@ static const char *NOCT_PLACE_NAMES[4][14] = {
 }
 };
 
-static const byte ROOMDATA_02[] = {
+static constexpr byte ROOMDATA_02[] = {
 	0x81, 0x02, 0x62, 0x00, 0x02, 0x00, 0x30, 0x22, 0x30, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00,
 	0x02, 0x00, 0x03, 0x02, 0x00, 0x03, 0x00, 0x04, 0x02, 0x00, 0x04, 0x00, 0xff, 0x02, 0x00, 0x01,
 	0x00, 0x02, 0x00, 0x05, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41,
@@ -212,7 +212,7 @@ static const byte ROOMDATA_02[] = {
 	0x30, 0x31, 0x42, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0x63, 0x00, 0x3a, 0x00, 0x00, 0x00,
 	0xff, 0xff,
 };
-static const byte ROOMDATA_03[] = {
+static constexpr byte ROOMDATA_03[] = {
 	0x01, 0x02, 0x62, 0x00, 0x03, 0x00, 0xc8, 0x46, 0x84, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00,
 	0x02, 0x00, 0xff, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0xf2, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x4f, 0x4f, 0x54, 0x48, 0x33, 0x2e, 0x56, 0x49,
@@ -245,12 +245,12 @@ static const byte ROOMDATA_03[] = {
 	0x63, 0x00, 0x02, 0x00, 0x02, 0x00, 0x63, 0x00, 0x07, 0x00, 0x03, 0x00, 0x63, 0x00, 0x3c, 0x00,
 	0x03, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_04[] = {
+static constexpr byte ROOMDATA_04[] = {
 	0x00, 0x02, 0x62, 0x00, 0x07, 0x00, 0xa0, 0x84, 0x5a, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00,
 	0x02, 0x00, 0xff, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x03, 0x00, 0xcc, 0x00, 0x00, 0x63, 0x00,
 	0x04, 0x00, 0x01, 0x00, 0x63, 0x00, 0x06, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_11[] = {
+static constexpr byte ROOMDATA_11[] = {
 	0x05, 0x02, 0x62, 0x00, 0x05, 0x00, 0xc8, 0x96, 0x6a, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x0b, 0x00,
 	0x02, 0x00, 0xff, 0x0b, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x03, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x4f, 0x4f, 0x54, 0x48, 0x53, 0x4d, 0x2e, 0x56,
@@ -281,7 +281,7 @@ static const byte ROOMDATA_11[] = {
 	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x32, 0x30, 0x32, 0x31, 0x39, 0x2e, 0x56,
 	0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_12[] = {
+static constexpr byte ROOMDATA_12[] = {
 	0x03, 0x02, 0x62, 0x00, 0x15, 0x00, 0x64, 0x28, 0x70, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00,
 	0x03, 0x00, 0x0d, 0x0c, 0x00, 0x04, 0x00, 0xff, 0x0c, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x02, 0x00,
 	0x80, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x36, 0x30, 0x33,
@@ -307,7 +307,7 @@ static const byte ROOMDATA_12[] = {
 	0x08, 0x00, 0x01, 0x00, 0x63, 0x00, 0x09, 0x00, 0x01, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00,
 	0x63, 0x00, 0x0b, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_13[] = {
+static constexpr byte ROOMDATA_13[] = {
 	0x03, 0x02, 0x62, 0x00, 0x16, 0x00, 0x4b, 0x3f, 0x32, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x0d, 0x00,
 	0x03, 0x00, 0x17, 0x0d, 0x00, 0x04, 0x00, 0x19, 0x0d, 0x00, 0x05, 0x00, 0xff, 0x0d, 0x00, 0x01,
 	0x00, 0x0d, 0x00, 0x02, 0x00, 0x60, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
@@ -328,7 +328,7 @@ static const byte ROOMDATA_13[] = {
 	0x00, 0x2c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x74, 0x00, 0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00,
 	0x00, 0x63, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x75, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_14[] = {
+static constexpr byte ROOMDATA_14[] = {
 	0x80, 0x02, 0x62, 0x00, 0x15, 0x00, 0x4b, 0x3c, 0x32, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x0e, 0x00,
 	0x03, 0x00, 0xff, 0x0e, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x60, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44,
@@ -403,7 +403,7 @@ static const byte ROOMDATA_14[] = {
 	0x49, 0x44, 0x2f, 0x41, 0x33, 0x30, 0x34, 0x35, 0x35, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63,
 	0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_15[] = {
+static constexpr byte ROOMDATA_15[] = {
 	0x80, 0x02, 0x62, 0x00, 0x07, 0x00, 0xc8, 0x96, 0x6a, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00,
 	0x03, 0x00, 0xff, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x02, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x30, 0x35, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44,
@@ -440,7 +440,7 @@ static const byte ROOMDATA_15[] = {
 	0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x31, 0x30, 0x32, 0x2e, 0x57, 0x41,
 	0x56, 0x00, 0xff, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_16[] = {
+static constexpr byte ROOMDATA_16[] = {
 	0x81, 0x02, 0x62, 0x00, 0x06, 0x00, 0xc8, 0x96, 0x6a, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,
 	0x03, 0x00, 0xff, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x37, 0x30, 0x36, 0x30, 0x30, 0x2e, 0x56, 0x49,
@@ -458,13 +458,13 @@ static const byte ROOMDATA_16[] = {
 	0x49, 0x44, 0x32, 0x2f, 0x43, 0x37, 0x30, 0x36, 0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00,
 	0x63, 0x00, 0x28, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_17[] = {
+static constexpr byte ROOMDATA_17[] = {
 	0x03, 0x02, 0x62, 0x00, 0x17, 0x00, 0x68, 0x34, 0x78, 0x11, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00,
 	0x02, 0x00, 0xff, 0x11, 0x00, 0x01, 0x00, 0x11, 0x00, 0x03, 0x00, 0x85, 0x00, 0x00, 0x63, 0x00,
 	0x0b, 0x00, 0x01, 0x00, 0x63, 0x00, 0x04, 0x00, 0x03, 0x00, 0x63, 0x00, 0x59, 0x00, 0x02, 0x00,
 	0x63, 0x00, 0x5a, 0x00, 0x03, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_18[] = {
+static constexpr byte ROOMDATA_18[] = {
 	0x01, 0x02, 0x62, 0x00, 0x0e, 0x00, 0xc8, 0x96, 0x96, 0x12, 0x00, 0x00, 0x00, 0x12, 0x12, 0x00,
 	0x03, 0x00, 0xff, 0x12, 0x00, 0x01, 0x00, 0x12, 0x00, 0x02, 0x00, 0xff, 0x00, 0x00, 0x63, 0x00,
 	0x0c, 0x00, 0x00, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x4d,
@@ -492,7 +492,7 @@ static const byte ROOMDATA_18[] = {
 	0x41, 0x55, 0x44, 0x2f, 0x4d, 0x39, 0x53, 0x54, 0x45, 0x50, 0x53, 0x2e, 0x57, 0x41, 0x56, 0x00,
 	0xff, 0x00, 0x63, 0x00, 0x18, 0x00, 0x00, 0x00, 0x63, 0x00, 0x28, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_20[] = {
+static constexpr byte ROOMDATA_20[] = {
 	0x01, 0x00, 0x62, 0x00, 0x0a, 0x00, 0x96, 0x35, 0xcd, 0x14, 0x00, 0x00, 0x00, 0x14, 0x14, 0x00,
 	0x03, 0x00, 0x15, 0x14, 0x00, 0x04, 0x00, 0x16, 0x14, 0x00, 0x05, 0x00, 0xff, 0x14, 0x00, 0x01,
 	0x00, 0x14, 0x00, 0x02, 0x00, 0xc5, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
@@ -521,19 +521,19 @@ static const byte ROOMDATA_20[] = {
 	0x68, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x4a, 0x00, 0x00, 0x00,
 	0x63, 0x00, 0x3e, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_22[] = {
+static constexpr byte ROOMDATA_22[] = {
 	0x01, 0x02, 0x62, 0x00, 0x21, 0x00, 0xc8, 0x96, 0x6a, 0x16, 0x00, 0x00, 0x00, 0x16, 0x16, 0x00,
 	0x02, 0x00, 0xff, 0x16, 0x00, 0x01, 0x00, 0x16, 0x00, 0x03, 0x00, 0x85, 0x00, 0x00, 0x63, 0x00,
 	0x1e, 0x00, 0x00, 0x00, 0x63, 0x00, 0x23, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0b, 0x00, 0x00, 0x00,
 	0xff, 0xff,
 };
-static const byte ROOMDATA_24[] = {
+static constexpr byte ROOMDATA_24[] = {
 	0x00, 0x02, 0x62, 0x00, 0x19, 0x00, 0xc8, 0x96, 0x6a, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
 	0x02, 0x00, 0xff, 0x18, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x53, 0x55, 0x43, 0x53, 0x50, 0x4c, 0x54, 0x31, 0x2e,
 	0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_26[] = {
+static constexpr byte ROOMDATA_26[] = {
 	0x03, 0x01, 0x62, 0x00, 0x1c, 0x00, 0xa5, 0x32, 0x8a, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x1a, 0x00,
 	0x03, 0x00, 0x1b, 0x1a, 0x00, 0x04, 0x00, 0x1c, 0x1a, 0x00, 0x05, 0x00, 0x1d, 0x1a, 0x00, 0x06,
 	0x00, 0x1e, 0x1a, 0x00, 0x07, 0x00, 0xff, 0x1a, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x02, 0x00, 0xd3,
@@ -589,7 +589,7 @@ static const byte ROOMDATA_26[] = {
 	0x00, 0x63, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x63, 0x00, 0x28,
 	0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_27[] = {
+static constexpr byte ROOMDATA_27[] = {
 	0x03, 0x02, 0x62, 0x00, 0x0e, 0x00, 0x48, 0x30, 0x34, 0x1b, 0x00, 0x00, 0x00, 0x1b, 0x1b, 0x00,
 	0x02, 0x00, 0xff, 0x1b, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x5c, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x31, 0x31, 0x32, 0x30, 0x30, 0x2e, 0x56, 0x49,
@@ -649,7 +649,7 @@ static const byte ROOMDATA_27[] = {
 	0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x32, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff,
 	0xff,
 };
-static const byte ROOMDATA_28[] = {
+static constexpr byte ROOMDATA_28[] = {
 	0x02, 0x02, 0x62, 0x00, 0x1e, 0x00, 0x69, 0x5a, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00,
 	0x02, 0x00, 0xff, 0x1c, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x03, 0x00, 0x86, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x38, 0x31, 0x33, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44,
@@ -681,7 +681,7 @@ static const byte ROOMDATA_28[] = {
 	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x31, 0x34, 0x31, 0x30,
 	0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x72, 0x00, 0xfe, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_29[] = {
+static constexpr byte ROOMDATA_29[] = {
 	0x03, 0x02, 0x62, 0x00, 0x10, 0x00, 0x6e, 0x3e, 0xbe, 0x1d, 0x00, 0x00, 0x00, 0x1d, 0x1d, 0x00,
 	0x03, 0x00, 0xff, 0x1d, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x02, 0x00, 0x8c, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x41, 0x39, 0x31, 0x35, 0x30, 0x30, 0x2e, 0x56, 0x49,
@@ -730,7 +730,7 @@ static const byte ROOMDATA_29[] = {
 	0x44, 0x00, 0x00, 0x63, 0x00, 0x25, 0x00, 0x03, 0x00, 0x63, 0x00, 0x1f, 0x00, 0x03, 0x00, 0xff,
 	0xff,
 };
-static const byte ROOMDATA_30[] = {
+static constexpr byte ROOMDATA_30[] = {
 	0x03, 0x03, 0x62, 0x00, 0x13, 0x00, 0x7d, 0x33, 0x5b, 0x1e, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x00,
 	0x02, 0x00, 0xff, 0x1e, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x03, 0x00, 0xa0, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x38, 0x32, 0x30, 0x30, 0x30, 0x2e, 0x56, 0x49,
@@ -790,7 +790,7 @@ static const byte ROOMDATA_30[] = {
 	0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x63, 0x00, 0x1b, 0x00,
 	0x00, 0x00, 0x63, 0x00, 0x04, 0x00, 0x03, 0x00, 0x63, 0x00, 0x2c, 0x00, 0x03, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_31[] = {
+static constexpr byte ROOMDATA_31[] = {
 	0x00, 0x02, 0x62, 0x00, 0x1a, 0x00, 0xc8, 0x96, 0x6a, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00,
 	0x02, 0x00, 0xff, 0x1f, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x03, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x53, 0x41, 0x4d, 0x30, 0x30, 0x30, 0x42, 0x2e, 0x56,
@@ -813,7 +813,7 @@ static const byte ROOMDATA_31[] = {
 	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x30, 0x32, 0x33, 0x31, 0x34, 0x2e,
 	0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_32[] = {
+static constexpr byte ROOMDATA_32[] = {
 	0x03, 0x02, 0x62, 0x00, 0x06, 0x00, 0xa4, 0x36, 0x6f, 0x20, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00,
 	0x03, 0x00, 0xff, 0x20, 0x00, 0x01, 0x00, 0x20, 0x00, 0x02, 0x00, 0xd4, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x39, 0x32, 0x34, 0x30, 0x30, 0x2e, 0x56, 0x49,
@@ -837,7 +837,7 @@ static const byte ROOMDATA_32[] = {
 	0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e,
 	0x30, 0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_33[] = {
+static constexpr byte ROOMDATA_33[] = {
 	0x81, 0x02, 0x62, 0x00, 0x08, 0x00, 0xc8, 0x96, 0x6a, 0x21, 0x00, 0x00, 0x00, 0x21, 0x21, 0x00,
 	0x03, 0x00, 0xff, 0x21, 0x00, 0x01, 0x00, 0x21, 0x00, 0x02, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x30, 0x31, 0x2e, 0x56, 0x49,
@@ -873,13 +873,13 @@ static const byte ROOMDATA_33[] = {
 	0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x30, 0x32, 0x35, 0x32, 0x34,
 	0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_34[] = {
+static constexpr byte ROOMDATA_34[] = {
 	0x00, 0x02, 0x62, 0x00, 0x23, 0x00, 0xc8, 0x96, 0x6a, 0x22, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00,
 	0x03, 0x00, 0x23, 0x22, 0x00, 0x04, 0x00, 0xff, 0x22, 0x00, 0x01, 0x00, 0x22, 0x00, 0x02, 0x00,
 	0xff, 0x00, 0x00, 0x63, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x63, 0x00, 0x52, 0x00, 0x00, 0x00, 0x63,
 	0x00, 0x51, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_35[] = {
+static constexpr byte ROOMDATA_35[] = {
 	0x03, 0x02, 0x62, 0x00, 0x11, 0x00, 0x5e, 0x36, 0x29, 0x23, 0x00, 0x00, 0x00, 0xff, 0x23, 0x00,
 	0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x78, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
 	0x31, 0x2f, 0x42, 0x31, 0x32, 0x36, 0x30, 0x30, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52,
@@ -916,13 +916,13 @@ static const byte ROOMDATA_35[] = {
 	0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x31, 0x34, 0x31, 0x32,
 	0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_37[] = {
+static constexpr byte ROOMDATA_37[] = {
 	0x03, 0x02, 0x62, 0x00, 0x24, 0x00, 0x41, 0x2a, 0x38, 0x25, 0x00, 0x00, 0x00, 0x25, 0x25, 0x00,
 	0x03, 0x00, 0xff, 0x25, 0x00, 0x01, 0x00, 0x25, 0x00, 0x02, 0x00, 0x52, 0x00, 0x00, 0x63, 0x00,
 	0x6d, 0x00, 0x00, 0x00, 0x63, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x63, 0x00, 0x50, 0x00, 0x00, 0x00,
 	0xff, 0xff,
 };
-static const byte ROOMDATA_38[] = {
+static constexpr byte ROOMDATA_38[] = {
 	0x03, 0x01, 0x62, 0x00, 0x00, 0x00, 0x2d, 0x26, 0x98, 0x26, 0x00, 0x00, 0x00, 0x26, 0x26, 0x00,
 	0x03, 0x00, 0x27, 0x26, 0x00, 0x04, 0x00, 0x28, 0x26, 0x00, 0x05, 0x00, 0x29, 0x26, 0x00, 0x06,
 	0x00, 0xff, 0x26, 0x00, 0x01, 0x00, 0x26, 0x00, 0x02, 0x00, 0x39, 0x00, 0x44, 0x41, 0x52, 0x4b,
@@ -939,11 +939,11 @@ static const byte ROOMDATA_38[] = {
 	0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x63, 0x00, 0x60, 0x00,
 	0x01, 0x00, 0x63, 0x00, 0x6e, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_39[] = {
+static constexpr byte ROOMDATA_39[] = {
 	0x00, 0x02, 0x62, 0x00, 0x18, 0x00, 0xc8, 0x96, 0x6a, 0x27, 0x00, 0x00, 0x00, 0x27, 0x27, 0x00,
 	0x03, 0x00, 0xff, 0x27, 0x00, 0x01, 0x00, 0x27, 0x00, 0x02, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_41[] = {
+static constexpr byte ROOMDATA_41[] = {
 	0x03, 0x03, 0x62, 0x00, 0x07, 0x00, 0x4a, 0x1c, 0x30, 0x29, 0x00, 0x00, 0x00, 0x29, 0x29, 0x00,
 	0x03, 0x00, 0xff, 0x29, 0x00, 0x01, 0x00, 0x29, 0x00, 0x02, 0x00, 0x5e, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x32, 0x32, 0x38, 0x30, 0x30, 0x2e, 0x56, 0x49,
@@ -981,7 +981,7 @@ static const byte ROOMDATA_41[] = {
 	0x4c, 0x41, 0x53, 0x48, 0x45, 0x52, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x0c, 0x00,
 	0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_42[] = {
+static constexpr byte ROOMDATA_42[] = {
 	0x81, 0x02, 0x62, 0x00, 0x0d, 0x00, 0xc8, 0x96, 0x6a, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x2a, 0x00,
 	0x03, 0x00, 0x2b, 0x2a, 0x00, 0x04, 0x00, 0x2c, 0x2a, 0x00, 0x05, 0x00, 0x2d, 0x2a, 0x00, 0x06,
 	0x00, 0x2e, 0x2a, 0x00, 0x07, 0x00, 0xff, 0x2a, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x02, 0x00, 0xff,
@@ -1009,22 +1009,22 @@ static const byte ROOMDATA_42[] = {
 	0x34, 0x00, 0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0a, 0x00, 0x01, 0x00,
 	0x63, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_43[] = {
+static constexpr byte ROOMDATA_43[] = {
 	0x03, 0x01, 0x62, 0x00, 0x18, 0x00, 0x75, 0x1d, 0x66, 0x2b, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x00,
 	0x02, 0x00, 0xff, 0x2b, 0x00, 0x01, 0x00, 0x2b, 0x00, 0x03, 0x00, 0x95, 0x00, 0x00, 0x63, 0x00,
 	0x64, 0x00, 0x00, 0x00, 0x63, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0f, 0x00, 0x00, 0x00,
 	0xff, 0xff,
 };
-static const byte ROOMDATA_44[] = {
+static constexpr byte ROOMDATA_44[] = {
 	0x00, 0x02, 0x62, 0x00, 0x25, 0x00, 0xa4, 0x96, 0x91, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0x2c, 0x00,
 	0x03, 0x00, 0xff, 0x2c, 0x00, 0x01, 0x00, 0x2c, 0x00, 0x02, 0x00, 0xd1, 0x00, 0x00, 0x63, 0x00,
 	0x6b, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_45[] = {
+static constexpr byte ROOMDATA_45[] = {
 	0x01, 0x02, 0x62, 0x00, 0x0b, 0x00, 0x46, 0x22, 0x69, 0x2d, 0x00, 0x00, 0x00, 0x2d, 0x2d, 0x00,
 	0x03, 0x00, 0xff, 0x2d, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x02, 0x00, 0x59, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_46[] = {
+static constexpr byte ROOMDATA_46[] = {
 	0x02, 0x02, 0x62, 0x00, 0x0d, 0x00, 0x90, 0x62, 0x3e, 0x2e, 0x00, 0x00, 0x00, 0x2e, 0x2e, 0x00,
 	0x03, 0x00, 0x2f, 0x2e, 0x00, 0x04, 0x00, 0x30, 0x2e, 0x00, 0x05, 0x00, 0x31, 0x2e, 0x00, 0x06,
 	0x00, 0x32, 0x2e, 0x00, 0x07, 0x00, 0x33, 0x2e, 0x00, 0x08, 0x00, 0xff, 0x2e, 0x00, 0x01, 0x00,
@@ -1055,19 +1055,19 @@ static const byte ROOMDATA_46[] = {
 	0x01, 0x00, 0x63, 0x00, 0x36, 0x00, 0x01, 0x00, 0x63, 0x00, 0x2d, 0x00, 0x01, 0x00, 0x63, 0x00,
 	0x68, 0x00, 0x01, 0x00, 0x63, 0x00, 0x71, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_48[] = {
+static constexpr byte ROOMDATA_48[] = {
 	0x01, 0x02, 0x62, 0x00, 0x13, 0x00, 0xa0, 0x56, 0x57, 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00,
 	0x03, 0x00, 0xff, 0x30, 0x00, 0x01, 0x00, 0x30, 0x00, 0x02, 0x00, 0xcc, 0x00, 0x00, 0x63, 0x00,
 	0x04, 0x00, 0x00, 0x00, 0x63, 0x00, 0x15, 0x00, 0x00, 0x00, 0x63, 0x00, 0x57, 0x00, 0x00, 0x00,
 	0x63, 0x00, 0x58, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_49[] = {
+static constexpr byte ROOMDATA_49[] = {
 	0x01, 0x02, 0x62, 0x00, 0x21, 0x00, 0xa0, 0x47, 0x7b, 0x31, 0x00, 0x00, 0x00, 0x31, 0x31, 0x00,
 	0x02, 0x00, 0xff, 0x31, 0x00, 0x01, 0x00, 0x31, 0x00, 0x03, 0x00, 0xcc, 0x00, 0x00, 0x63, 0x00,
 	0x24, 0x00, 0x00, 0x00, 0x63, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x63, 0x00, 0x29, 0x00, 0x00, 0x00,
 	0xff, 0xff,
 };
-static const byte ROOMDATA_50[] = {
+static constexpr byte ROOMDATA_50[] = {
 	0x01, 0x02, 0x62, 0x00, 0x0c, 0x00, 0x50, 0x1a, 0x64, 0x32, 0x00, 0x00, 0x00, 0x32, 0x32, 0x00,
 	0x02, 0x00, 0xff, 0x32, 0x00, 0x01, 0x00, 0x32, 0x00, 0x03, 0x00, 0x66, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35, 0x33, 0x33, 0x30, 0x30, 0x2e, 0x56, 0x49,
@@ -1108,7 +1108,7 @@ static const byte ROOMDATA_50[] = {
 	0x56, 0x49, 0x44, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x35,
 	0x33, 0x33, 0x31, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_51[] = {
+static constexpr byte ROOMDATA_51[] = {
 	0x03, 0x01, 0x62, 0x00, 0x12, 0x00, 0xc8, 0x84, 0x65, 0x33, 0x00, 0x00, 0x00, 0x33, 0x33, 0x00,
 	0x03, 0x00, 0xff, 0x33, 0x00, 0x01, 0x00, 0x33, 0x00, 0x02, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x42, 0x39, 0x33, 0x34, 0x30, 0x30, 0x2e, 0x56, 0x49,
@@ -1133,16 +1133,16 @@ static const byte ROOMDATA_51[] = {
 	0x34, 0x31, 0x34, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x26, 0x00, 0x00, 0x00, 0x63,
 	0x00, 0x4d, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_52[] = {
+static constexpr byte ROOMDATA_52[] = {
 	0x02, 0x01, 0x62, 0x00, 0x20, 0x00, 0x8c, 0x7e, 0x54, 0x34, 0x00, 0x00, 0x00, 0x34, 0x34, 0x00,
 	0x03, 0x00, 0xff, 0x34, 0x00, 0x01, 0x00, 0x34, 0x00, 0x02, 0x00, 0xb3, 0x00, 0x00, 0x63, 0x00,
 	0x56, 0x00, 0x00, 0x00, 0x63, 0x00, 0x4d, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_53[] = {
+static constexpr byte ROOMDATA_53[] = {
 	0x00, 0x02, 0x62, 0x00, 0x02, 0x00, 0xc8, 0xb4, 0x77, 0x35, 0x00, 0x00, 0x00, 0x35, 0x35, 0x00,
 	0x03, 0x00, 0xff, 0x35, 0x00, 0x01, 0x00, 0x35, 0x00, 0x02, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_54[] = {
+static constexpr byte ROOMDATA_54[] = {
 	0x81, 0x02, 0x62, 0x00, 0x1f, 0x00, 0xc8, 0xb4, 0x77, 0x36, 0x00, 0x00, 0x00, 0x36, 0x36, 0x00,
 	0x02, 0x00, 0xff, 0x36, 0x00, 0x01, 0x00, 0x36, 0x00, 0x03, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x4d, 0x41, 0x43, 0x33, 0x35, 0x30, 0x30, 0x41, 0x2e,
@@ -1190,7 +1190,7 @@ static const byte ROOMDATA_54[] = {
 	0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x50, 0x41, 0x53, 0x53, 0x4f, 0x55, 0x54,
 	0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x4e, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_55[] = {
+static constexpr byte ROOMDATA_55[] = {
 	0x02, 0x02, 0x62, 0x00, 0x26, 0x00, 0xb9, 0x51, 0xa3, 0x37, 0x00, 0x00, 0x00, 0x37, 0x37, 0x00,
 	0x02, 0x00, 0x38, 0x37, 0x00, 0x03, 0x00, 0x39, 0x37, 0x00, 0x04, 0x00, 0x3a, 0x37, 0x00, 0x05,
 	0x00, 0x3b, 0x37, 0x00, 0x06, 0x00, 0x3c, 0x37, 0x00, 0x07, 0x00, 0x3d, 0x37, 0x00, 0x08, 0x00,
@@ -1203,49 +1203,49 @@ static const byte ROOMDATA_55[] = {
 	0x00, 0x01, 0x00, 0x63, 0x00, 0x63, 0x00, 0x01, 0x00, 0x63, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x63,
 	0x00, 0x7a, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_57[] = {
+static constexpr byte ROOMDATA_57[] = {
 	0x03, 0x01, 0x62, 0x00, 0x0c, 0x00, 0xa0, 0x46, 0x85, 0x39, 0x00, 0x00, 0x00, 0x39, 0x39, 0x00,
 	0x02, 0x00, 0x3a, 0x39, 0x00, 0x03, 0x00, 0xff, 0x39, 0x00, 0x01, 0x00, 0x39, 0x00, 0x04, 0x00,
 	0xcc, 0x00, 0x00, 0x63, 0x00, 0x61, 0x00, 0x00, 0x00, 0x63, 0x00, 0x62, 0x00, 0x00, 0x00, 0x63,
 	0x00, 0x4d, 0x00, 0x01, 0x00, 0x63, 0x00, 0x68, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_58[] = {
+static constexpr byte ROOMDATA_58[] = {
 	0x03, 0x02, 0x62, 0x00, 0x25, 0x00, 0x57, 0x48, 0x71, 0x3a, 0x00, 0x00, 0x00, 0x3a, 0x3a, 0x00,
 	0x02, 0x00, 0x3b, 0x3a, 0x00, 0x03, 0x00, 0xff, 0x3a, 0x00, 0x01, 0x00, 0x3a, 0x00, 0x04, 0x00,
 	0x6f, 0x00, 0x00, 0x63, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x31, 0x00, 0x01, 0x00, 0x63,
 	0x00, 0x68, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_59[] = {
+static constexpr byte ROOMDATA_59[] = {
 	0x03, 0x02, 0x62, 0x00, 0x21, 0x00, 0x70, 0x4b, 0x83, 0x3b, 0x00, 0x00, 0x00, 0x3b, 0x3b, 0x00,
 	0x02, 0x00, 0xff, 0x3b, 0x00, 0x01, 0x00, 0x3b, 0x00, 0x03, 0x00, 0x8f, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x31, 0x39, 0x2e, 0x56, 0x49, 0x44,
 	0x00, 0x00, 0x63, 0x00, 0x4b, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_60[] = {
+static constexpr byte ROOMDATA_60[] = {
 	0x03, 0x02, 0x62, 0x00, 0x17, 0x00, 0x96, 0x30, 0x90, 0x3c, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00,
 	0x02, 0x00, 0xff, 0x3c, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x63, 0x00,
 	0x16, 0x00, 0x00, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_61[] = {
+static constexpr byte ROOMDATA_61[] = {
 	0x03, 0x02, 0x62, 0x00, 0x0c, 0x00, 0x5a, 0x25, 0x6e, 0x3d, 0x00, 0x00, 0x00, 0x3d, 0x3d, 0x00,
 	0x03, 0x00, 0xff, 0x3d, 0x00, 0x01, 0x00, 0x3d, 0x00, 0x02, 0x00, 0x73, 0x00, 0x00, 0x63, 0x00,
 	0x5b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x0b, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_62[] = {
+static constexpr byte ROOMDATA_62[] = {
 	0x03, 0x02, 0x62, 0x00, 0x0e, 0x00, 0x9d, 0x28, 0x78, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00,
 	0x02, 0x00, 0xff, 0x3e, 0x00, 0x01, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xc8, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_63[] = {
+static constexpr byte ROOMDATA_63[] = {
 	0x03, 0x02, 0x62, 0x00, 0x13, 0x00, 0xb4, 0x8e, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x00,
 	0x02, 0x00, 0xff, 0x3f, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x03, 0x00, 0xe6, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x32, 0x30, 0x2e, 0x56, 0x49, 0x44,
 	0x00, 0x00, 0x63, 0x00, 0x2d, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_64[] = {
+static constexpr byte ROOMDATA_64[] = {
 	0x03, 0x03, 0x62, 0x00, 0x0c, 0x00, 0x3c, 0x17, 0xb6, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00,
 	0x02, 0x00, 0xff, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x03, 0x00, 0x4d, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_65[] = {
+static constexpr byte ROOMDATA_65[] = {
 	0x81, 0x02, 0x62, 0x00, 0x25, 0x00, 0x70, 0x4b, 0x83, 0x41, 0x00, 0x00, 0x00, 0x41, 0x41, 0x00,
 	0x02, 0x00, 0xff, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x03, 0x00, 0x8f, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x31, 0x33, 0x38, 0x30, 0x30, 0x2e, 0x56, 0x49,
@@ -1282,52 +1282,52 @@ static const byte ROOMDATA_65[] = {
 	0x33, 0x38, 0x52, 0x45, 0x46, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00,
 	0x00, 0x63, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x63, 0x00, 0x30, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_67[] = {
+static constexpr byte ROOMDATA_67[] = {
 	0x01, 0x02, 0x62, 0x00, 0x14, 0x00, 0x7e, 0x40, 0x6c, 0x43, 0x00, 0x00, 0x00, 0x43, 0x43, 0x00,
 	0x03, 0x00, 0xff, 0x43, 0x00, 0x01, 0x00, 0x43, 0x00, 0x02, 0x00, 0xa1, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x44, 0x52, 0x4c, 0x30, 0x31, 0x2e, 0x56, 0x49, 0x44,
 	0x00, 0x00, 0x63, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x63, 0x00, 0x49, 0x00, 0x01, 0x00, 0x63, 0x00,
 	0x6f, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_68[] = {
+static constexpr byte ROOMDATA_68[] = {
 	0x01, 0x02, 0x62, 0x00, 0x0b, 0x00, 0x5b, 0x40, 0x8d, 0x44, 0x00, 0x00, 0x00, 0x44, 0x44, 0x00,
 	0x02, 0x00, 0x45, 0x44, 0x00, 0x03, 0x00, 0xff, 0x44, 0x00, 0x01, 0x00, 0x44, 0x00, 0x04, 0x00,
 	0x74, 0x00, 0x00, 0x63, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x63, 0x00, 0x39, 0x00, 0x00, 0x00, 0x63,
 	0x00, 0x50, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_69[] = {
+static constexpr byte ROOMDATA_69[] = {
 	0x01, 0x02, 0x62, 0x00, 0x14, 0x00, 0x60, 0x24, 0x4b, 0x45, 0x00, 0x00, 0x00, 0x45, 0x45, 0x00,
 	0x02, 0x00, 0xff, 0x45, 0x00, 0x01, 0x00, 0x45, 0x00, 0x03, 0x00, 0x7a, 0x00, 0x00, 0x63, 0x00,
 	0x66, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_70[] = {
+static constexpr byte ROOMDATA_70[] = {
 	0x01, 0x02, 0x62, 0x00, 0x20, 0x00, 0x7d, 0x6b, 0xba, 0x46, 0x00, 0x00, 0x00, 0x46, 0x46, 0x00,
 	0x02, 0x00, 0xff, 0x46, 0x00, 0x01, 0x00, 0x46, 0x00, 0x03, 0x00, 0xa0, 0x00, 0x00, 0x63, 0x00,
 	0x6a, 0x00, 0x00, 0x00, 0x63, 0x00, 0x2b, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_71[] = {
+static constexpr byte ROOMDATA_71[] = {
 	0x81, 0x02, 0x62, 0x00, 0x1f, 0x00, 0x87, 0x72, 0x2d, 0x47, 0x00, 0x00, 0x00, 0x47, 0x47, 0x00,
 	0x02, 0x00, 0x48, 0x47, 0x00, 0x03, 0x00, 0xff, 0x47, 0x00, 0x01, 0x00, 0x47, 0x00, 0x04, 0x00,
 	0xad, 0x00, 0x00, 0x63, 0x00, 0x53, 0x00, 0x00, 0x00, 0x63, 0x00, 0x37, 0x00, 0x01, 0x00, 0x63,
 	0x00, 0x2e, 0x00, 0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_72[] = {
+static constexpr byte ROOMDATA_72[] = {
 	0x81, 0x02, 0x62, 0x00, 0x0c, 0x00, 0xc8, 0xc6, 0x27, 0x48, 0x00, 0x00, 0x00, 0x48, 0x48, 0x00,
 	0x03, 0x00, 0xff, 0x48, 0x00, 0x01, 0x00, 0x48, 0x00, 0x02, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x31, 0x2f, 0x46, 0x49, 0x52, 0x45, 0x2e, 0x56, 0x49, 0x44, 0x00,
 	0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_73[] = {
+static constexpr byte ROOMDATA_73[] = {
 	0x01, 0x03, 0x62, 0x00, 0x09, 0x00, 0x20, 0x0c, 0x60, 0x49, 0x00, 0x00, 0x00, 0x49, 0x49, 0x00,
 	0x02, 0x00, 0xff, 0x49, 0x00, 0x01, 0x00, 0x49, 0x00, 0x03, 0x00, 0x29, 0x00, 0x00, 0x63, 0x00,
 	0x68, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_74[] = {
+static constexpr byte ROOMDATA_74[] = {
 	0x01, 0x02, 0x62, 0x00, 0x21, 0x00, 0x28, 0x25, 0x54, 0x4a, 0x00, 0x00, 0x00, 0x4a, 0x4a, 0x00,
 	0x02, 0x00, 0xff, 0x4a, 0x00, 0x01, 0x00, 0x4a, 0x00, 0x03, 0x00, 0x33, 0x00, 0x00, 0x63, 0x00,
 	0x43, 0x00, 0x00, 0x00, 0x63, 0x00, 0x44, 0x00, 0xfe, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_81[] = {
+static constexpr byte ROOMDATA_81[] = {
 	0x01, 0x02, 0x62, 0x00, 0x17, 0x00, 0x54, 0x50, 0xbb, 0x51, 0x00, 0x00, 0x00, 0x51, 0x51, 0x00,
 	0x02, 0x00, 0x52, 0x51, 0x00, 0x03, 0x00, 0xff, 0x51, 0x00, 0x01, 0x00, 0x51, 0x00, 0x04, 0x00,
 	0x6c, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33, 0x39,
@@ -1339,12 +1339,12 @@ static const byte ROOMDATA_81[] = {
 	0x49, 0x44, 0x32, 0x2f, 0x43, 0x32, 0x33, 0x32, 0x32, 0x33, 0x39, 0x36, 0x2e, 0x56, 0x49, 0x44,
 	0x00, 0x00, 0x63, 0x00, 0x19, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_82[] = {
+static constexpr byte ROOMDATA_82[] = {
 	0x81, 0x02, 0x62, 0x00, 0x00, 0x00, 0x48, 0x2c, 0x7b, 0x52, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00,
 	0x02, 0x00, 0xff, 0x52, 0x00, 0x01, 0x00, 0x52, 0x00, 0x03, 0x00, 0xff, 0x00, 0x00, 0x63, 0x00,
 	0x33, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_85[] = {
+static constexpr byte ROOMDATA_85[] = {
 	0x03, 0x02, 0x62, 0x00, 0x24, 0x00, 0x68, 0x39, 0x68, 0x55, 0x00, 0x00, 0x00, 0x55, 0x55, 0x00,
 	0x02, 0x00, 0xff, 0x55, 0x00, 0x01, 0x00, 0x55, 0x00, 0x03, 0x00, 0x85, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x30, 0x34, 0x2e, 0x56, 0x49, 0x44,
@@ -1352,12 +1352,12 @@ static const byte ROOMDATA_85[] = {
 	0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x63, 0x00, 0x59, 0x00,
 	0x01, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_86[] = {
+static constexpr byte ROOMDATA_86[] = {
 	0x01, 0x02, 0x62, 0x00, 0x18, 0x00, 0x78, 0x46, 0x69, 0x56, 0x00, 0x00, 0x00, 0x56, 0x56, 0x00,
 	0x02, 0x00, 0xff, 0x56, 0x00, 0x01, 0x00, 0x56, 0x00, 0x03, 0x00, 0x99, 0x00, 0x00, 0x63, 0x00,
 	0x28, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_87[] = {
+static constexpr byte ROOMDATA_87[] = {
 	0x01, 0x02, 0x62, 0x00, 0x11, 0x00, 0xa5, 0x9b, 0x69, 0x57, 0x00, 0x00, 0x00, 0x57, 0x57, 0x00,
 	0x02, 0x00, 0x58, 0x57, 0x00, 0x03, 0x00, 0xff, 0x57, 0x00, 0x01, 0x00, 0x57, 0x00, 0x04, 0x00,
 	0xd3, 0x00, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
@@ -1396,17 +1396,17 @@ static const byte ROOMDATA_87[] = {
 	0x00, 0xff, 0x00, 0xff, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x41, 0x55, 0x44, 0x2f, 0x57, 0x32,
 	0x38, 0x37, 0x32, 0x32, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_89[] = {
+static constexpr byte ROOMDATA_89[] = {
 	0x03, 0x02, 0x62, 0x00, 0x1d, 0x00, 0x32, 0x28, 0xef, 0x59, 0x00, 0x00, 0x00, 0x59, 0x59, 0x00,
 	0x02, 0x00, 0xff, 0x59, 0x00, 0x01, 0x00, 0x59, 0x00, 0x03, 0x00, 0x40, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x32, 0x38, 0x2e, 0x56, 0x49, 0x44,
 	0x00, 0x00, 0x63, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_90[] = {
+static constexpr byte ROOMDATA_90[] = {
 	0x03, 0x02, 0x62, 0x00, 0x1e, 0x00, 0x96, 0x64, 0xff, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x5a, 0x00,
 	0x03, 0x00, 0xff, 0x5a, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x02, 0x00, 0xbf, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_91[] = {
+static constexpr byte ROOMDATA_91[] = {
 	0x03, 0x01, 0x62, 0x00, 0x00, 0x00, 0x32, 0x2e, 0x2b, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x5b, 0x00,
 	0x03, 0x00, 0x5c, 0x5b, 0x00, 0x04, 0x00, 0x5d, 0x5b, 0x00, 0x05, 0x00, 0xff, 0x5b, 0x00, 0x01,
 	0x00, 0x5b, 0x00, 0x02, 0x00, 0x3f, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f,
@@ -1482,35 +1482,35 @@ static const byte ROOMDATA_91[] = {
 	0x2f, 0x45, 0x4c, 0x34, 0x34, 0x36, 0x30, 0x39, 0x2e, 0x57, 0x41, 0x56, 0x00, 0xff, 0x00, 0x63,
 	0x00, 0x82, 0x00, 0x00, 0x00, 0x63, 0x00, 0x83, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_92[] = {
+static constexpr byte ROOMDATA_92[] = {
 	0x00, 0x02, 0x62, 0x00, 0x0f, 0x00, 0xb9, 0xa7, 0x69, 0x5c, 0x00, 0x00, 0x00, 0xff, 0x5c, 0x00,
 	0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xec, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44,
 	0x31, 0x2f, 0x53, 0x49, 0x4c, 0x4c, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_93[] = {
+static constexpr byte ROOMDATA_93[] = {
 	0x81, 0x02, 0x62, 0x00, 0x01, 0x00, 0xb9, 0xa7, 0x69, 0x5d, 0x00, 0x00, 0x00, 0x5d, 0x5d, 0x00,
 	0x03, 0x00, 0xff, 0x5d, 0x00, 0x01, 0x00, 0x5d, 0x00, 0x02, 0x00, 0xec, 0x00, 0x00, 0x63, 0x00,
 	0x76, 0x00, 0x00, 0x00, 0x63, 0x00, 0x77, 0x00, 0x00, 0x00, 0x63, 0x00, 0x78, 0x00, 0x00, 0x00,
 	0x63, 0x00, 0x79, 0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_94[] = {
+static constexpr byte ROOMDATA_94[] = {
 	0x02, 0x02, 0x62, 0x00, 0x06, 0x00, 0x55, 0x50, 0xff, 0x5e, 0x00, 0x00, 0x00, 0x1c, 0x5e, 0x00,
 	0x02, 0x00, 0xff, 0x5e, 0x00, 0x01, 0x00, 0x5e, 0x00, 0x03, 0x00, 0x6c, 0x00, 0x00, 0x63, 0x00,
 	0x2d, 0x00, 0x01, 0x00, 0x63, 0x00, 0x1a, 0x00, 0x01, 0x00, 0x63, 0x00, 0x35, 0x00, 0x01, 0x00,
 	0xff, 0xff,
 };
-static const byte ROOMDATA_95[] = {
+static constexpr byte ROOMDATA_95[] = {
 	0x03, 0x02, 0x62, 0x00, 0x06, 0x00, 0x96, 0x64, 0xff, 0x5f, 0x00, 0x00, 0x00, 0x5f, 0x5f, 0x00,
 	0x03, 0x00, 0xff, 0x5f, 0x00, 0x01, 0x00, 0x5f, 0x00, 0x02, 0x00, 0xbf, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_96[] = {
+static constexpr byte ROOMDATA_96[] = {
 	0x03, 0x02, 0x62, 0x00, 0x26, 0x00, 0x96, 0x64, 0xff, 0x60, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00,
 	0x03, 0x00, 0x61, 0x60, 0x00, 0x04, 0x00, 0xff, 0x60, 0x00, 0x01, 0x00, 0x60, 0x00, 0x02, 0x00,
 	0xbf, 0x00, 0x44, 0x41, 0x52, 0x4b, 0x2f, 0x56, 0x49, 0x44, 0x2f, 0x41, 0x34, 0x49, 0x4e, 0x32,
 	0x39, 0x2e, 0x56, 0x49, 0x44, 0x00, 0x00, 0x63, 0x00, 0x46, 0x00, 0x00, 0x00, 0x63, 0x00, 0x47,
 	0x00, 0x00, 0x00, 0xff, 0xff,
 };
-static const byte ROOMDATA_97[] = {
+static constexpr byte ROOMDATA_97[] = {
 	0x81, 0x01, 0x62, 0x00, 0x26, 0x00, 0x32, 0x2e, 0x2b, 0x61, 0x00, 0x00, 0x00, 0x61, 0x61, 0x00,
 	0x03, 0x00, 0xff, 0x61, 0x00, 0x01, 0x00, 0x61, 0x00, 0x02, 0x00, 0x3f, 0x00, 0x44, 0x41, 0x52,
 	0x4b, 0x2f, 0x4f, 0x4f, 0x50, 0x53, 0x2f, 0x42, 0x4c, 0x30, 0x32, 0x30, 0x31, 0x2e, 0x56, 0x49,
@@ -1570,12 +1570,12 @@ static const byte ROOMDATA_97[] = {
 ///////////////////////////////////////////////////////////////
 
 
-static const int CURSOR_HEIGHTS[] = {
+static constexpr int CURSOR_HEIGHTS[] = {
 	16, 13, 14, 14, 14, 14, 14, 14, 14, 14, 27
 };
 
 
-static const byte CURSOR_0_DATA[] = {
+static constexpr byte CURSOR_0_DATA[] = {
 	0x00, 0x00, 0x00, 0x00,   // hot x,y
 	0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -1594,7 +1594,7 @@ static const byte CURSOR_0_DATA[] = {
 	0x00, 0x00, 0x00, 0xee, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0x00, 0x00, 0x00, 0x00, 0xee, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
-static const byte CURSOR_1_DATA[] = {
+static constexpr byte CURSOR_1_DATA[] = {
 	0x07, 0x00, 0x07, 0x00,   // hot x,y
 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0x00, 0x00, 0x00, 0x00, 0xfb, 0xfb, 0x00, 0xfb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -1610,7 +1610,7 @@ static const byte CURSOR_1_DATA[] = {
 	0x00, 0x00, 0x00, 0x00, 0xfb, 0xfb, 0x00, 0xfb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
-static const byte CURSOR_2_DATA[] = {
+static constexpr byte CURSOR_2_DATA[] = {
 	0x00, 0x00, 0x00, 0x00,   // hot x,y
 	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -1627,7 +1627,7 @@ static const byte CURSOR_2_DATA[] = {
 	0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7,
 	0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0x00, 0xf7,
 };
-static const byte CURSOR_3_DATA[] = {
+static constexpr byte CURSOR_3_DATA[] = {
 	0x00, 0x00, 0x00, 0x00,   // hot x,y
 	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -1644,7 +1644,7 @@ static const byte CURSOR_3_DATA[] = {
 	0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7,
 	0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0x00, 0xf7,
 };
-static const byte CURSOR_4_DATA[] = {
+static constexpr byte CURSOR_4_DATA[] = {
 	0x00, 0x00, 0x00, 0x00,   // hot x,y
 	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -1661,7 +1661,7 @@ static const byte CURSOR_4_DATA[] = {
 	0xff, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0x00, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0x00,
 	0x00, 0xf7, 0x00, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0xf7, 0x00, 0x00, 0xf7, 0xf7, 0xf7,
 };
-static const byte CURSOR_5_DATA[] = {
+static constexpr byte CURSOR_5_DATA[] = {
 	0x00, 0x00, 0x00, 0x00,   // hot x,y
 	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -1678,7 +1678,7 @@ static const byte CURSOR_5_DATA[] = {
 	0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
-static const byte CURSOR_6_DATA[] = {
+static constexpr byte CURSOR_6_DATA[] = {
 	0x00, 0x00, 0x00, 0x00,   // hot x,y
 	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -1695,7 +1695,7 @@ static const byte CURSOR_6_DATA[] = {
 	0x00, 0xff, 0xf7, 0x00, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0xff, 0xf7, 0xff, 0xf7,
 	0x00, 0x00, 0xf7, 0x00, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0x00, 0xf7,
 };
-static const byte CURSOR_7_DATA[] = {
+static constexpr byte CURSOR_7_DATA[] = {
 	0x00, 0x00, 0x00, 0x00,   // hot x,y
 	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -1712,7 +1712,7 @@ static const byte CURSOR_7_DATA[] = {
 	0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00,
 };
-static const byte CURSOR_8_DATA[] = {
+static constexpr byte CURSOR_8_DATA[] = {
 	0x00, 0x00, 0x00, 0x00,   // hot x,y
 	0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0xff, 0xff, 0xff, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -1729,7 +1729,7 @@ static const byte CURSOR_8_DATA[] = {
 	0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0x00, 0xff, 0xf7, 0x00, 0xff, 0xff, 0xff, 0xf7,
 	0x00, 0xf7, 0xf7, 0xf7, 0x00, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0xf7, 0x00, 0x00, 0xf7, 0xf7, 0xf7,
 };
-static const byte CURSOR_9_DATA[] = {
+static constexpr byte CURSOR_9_DATA[] = {
 	0x00, 0x00, 0x00, 0x00,   // hot x,y
 	0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0xf4, 0xf4, 0xf4, 0xf7, 0xf7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -1746,7 +1746,7 @@ static const byte CURSOR_9_DATA[] = {
 	0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00,
 	0xf4, 0xf4, 0xf4, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0xf4, 0xf4, 0xf4, 0x00, 0x00, 0xf4, 0x00, 0x00,
 };
-static const byte CURSOR_10_DATA[] = {
+static constexpr byte CURSOR_10_DATA[] = {
 	0x00, 0x00, 0x00, 0x00,   // hot x,y
 	0x00, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
 	0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa,
@@ -1789,14 +1789,14 @@ static const byte CURSOR_10_DATA[] = {
 };
 
 
-static const char *INVNAMES[4][76] = {
+static constexpr const char *INVNAMES[4][76] = {
 {" ", "      MORE ITEMS", "      MORE ITEMS", "      FENCE SPIRE", "     SILVER TOKEN", "      GOLD TOKEN", "       NOTICES", "     TICKET STUB", "    DIVORCE PAPERS", "       POSTCARD", "    BANK STATEMENT", "    LOTTERY LETTER", "       NEWSPAPER", "     BUTTER KNIFE", "         WIRE", "       DETONATOR", "PLASTIC EXPLOSIVE STATUE", "        CHALICE", "       COFFIN KEY", "         BILLS", "     SCRAP OF LACE", "         NOTE", "         DIARY", "   LIQUIDARK GRENADE", "       NEWSPAPERS", "   DARKSHEER HISTORY", "      GLASS CUTTER", "     SHARD OF GLASS", "       CLIPBOARD", "     ELEVATOR PASS", "         CLOCK", "  QUICKGROW SOLUTION", "         BONE", "     SACK OF SEEDS", "    THROWING KNIVES", "      MAGIC WAND", "      SCREWDRIVER", "       LOG BOOK", "        OIL CAN", "          LENS", "       MAKEUP KIT", "        JEWELRY", "        HAMMER", "        CHISEL", "    BUTCHER KNIFE", "      MEAT HOOK", "        BEAKER", "         ACID", "     VALVE WHEEL", "         ROPE", "        RE-BAR", "         NET", "         RAT", "         FORK", "         MATCH", "         PAINT", "      PAINT BRUSH", "        PEPPER", "      DENTAL PICK", "         SPEAR", "       EGG SACK", "       DIAMOND", "        COMIC", "          WEB", "   WROUGHT IRON SHAFT", "   CHALICE WITH WATER", "      BROKEN CHAIR", "       SAUSAGE", "        POSTER", "        BRICK", "      NOCTROGLYPH", "       DUCT TAPE", "         BROOM", "        OIL LAMP", "     BROOM AND HOOK", "    ROPE AND SAUSAGE"},
 {" ", "      AUTRES OBJETS", "      AUTRES OBJETS", "      MONTANT DE GRILLE", "     PIECE D'ARGENT", "      PIECE D'OR", "       AVERTISSEMENTS", "     SOUCHE DE TICKET", "    PAPIERS DE DIVORCE", "    CARTE POSTALE", "    RELEVE BANCAIRE", "    LETTRE DU CONCOURS", "       JOURNAL", "     COUTEAU A BEURRE", "         CABLE", "       DETONATEUR", "STATUETTE EXPLOSIVE", "        CALICE", "   CLEF DE CERCUEIL", "      FACTURES", " MORCEAU DE DENTELLE", "       MESSAGE", "      JOURNAL", "  GRENADE DE LIQUIDARK", "       JOURNAL", " HISTOIRE DE DARKSHEER", "      DIAMANT A VITRES", "     ECLAT DE VERRE", "       BLOC-NOTES", "  CARTE MAGNETIQUE", "         REVEIL", "  ENGRAIS MIRACLE", "         MACHOIRE", "     SAC DE GRAINES", "    COUTEAUX", "  BAGUETTE MAGIQUE", "     TOURNEVIS", "     JOURNAL", "       HUILE", "       LENTILLE", " TROUSSE DE MAQUILLAGE", "      BIJOUX", "      MARTEAU", "       BURIN", "   COUTEAU DE BOUCHER", "     CROCHET A VIANDE", "        FIOLE", "         ACIDE", "     VANNE", "         CORDE", "      FER A BETON", "        FILET", "         RAT", "      FOURCHETTE", "      ALLUMETTE", "         PEINTURE", "      PINCEAU", "        POIVRE", "      CURE-DENTS", "        LANCE", "       OEUFS", "       DIAMANT", "   BANDE DESSINEE", "        TOILE", "   TIGE D'ACIER ROUILLEE", "   CALICE PLEIN D'EAU", "      CHAISE CASSEE", "       SAUCISSE", "       AFFICHE", "        BRIQUE", "      NOCTROGLYPHE", "       TEFLON", "         BALAI", "      LAMPE A HUILE", "     BALAI ET CROCHET", "    CORDE ET SAUCISSE"},
 {" ", "      MAS OBJETOS", "      MAS OBJETOS", "  HIERRO DE VERJA", "  MONEDA PLATEADA", "   MONEDA DORADA", "         NOTAS", "     COMPROBANTE", " DEMANDA DE DIVORCIO", "         POSTAL", "   CARTA DEL BANCO", " CARTA DE LA LOTERIA", "      PERIODICO", " CUCHILLO MANTEQUILLA", "      ALAMBRE", "       DETONADOR", "ESTATUA EXPLOSIVA", "        CALIZ", "   LLAVE DE ATAUD", "      FACTURAS", "  TIRA DE ENCAJE", "         NOTA", "         DIARIO", "  GRANADA DE LIQUIOSCURO", "      PERIODICOS", "  TRATADO DE TINIEBLAS", "  CORTADOR DE CRISTAL", "   PEDAZO DE CRISTAL", "     PORTAPAPELES", "  PASE DE ELEVADOR", "         RELOJ", " SOLUCION DE CRECIMIENTO", "        HUESO", "        SEMILLAS", " CUCHILLOS ARROJADIZOS", "     VARA MAGICA", "    DESTORNILLADOR", "       REGISTRO", "  LATA DE ACEITE", "         LENTE", "      MAQUILLAJE", "          JOYAS", "      MARTILLO", "        CINCEL", " CUCHILLO DE CARNE", "  GANCHO DE CARNE", "         JARRA", "        ACIDO", " RUEDA DE VALVULA", "         SOGA", "      PALANCA", "         RED", "        RATA", "      TENEDOR", "       CERILLA", "      PINTURA", "        BROCHA", "      PIMIENTA", "     PICO DENTAL", "         LANZA", "  SACO DE HUEVOS", "       DIAMANTE", "        COMIC", "         TELA", "   ASTA DE HIERRO", "   CALIZ CON AGUA", "     SILLA ROTA", "    SALCHICHA", "        CARTEL", "     LADRILLO", "      NOCTROGLIFO", " CINTA ADHESIVA", "        ESCOBA", " LAMPARA DE ACEITE", "  ESCOBA CON GANCHO", "  SOGA CON SALCHICHA"},
 {" ", "  WEITERE GEGENST\x8E""NDE", "  WEITERE GEGENST\x8E""NDE", "      ZAUNSTREBE", "   SILBERNES SYMBOL", "   GOLDENES SYMBOL", "       MAHNUNGEN", "     LOSABSCHNITT", "  SCHEIDUNGSPAPIERE", "      POSTKARTE", "     KONTOAUSZUG", "   WETTBEWERBSBRIEF", "       ZEITUNG", "    BUTTERMESSER", "        KABEL", "       Z\x9A""NDER", "STATUE AUS PLASTIKSPRENGSTOFF", "       KELCH", "   SARGSCHL\x9A""SSEL", "     RECHNUNGEN", "       SPITZE", "       ZETTEL", "      TAGEBUCH", "   DUSTER\x99""L-GRANATE", "      ZEITUNG", "DIE GESCHICHTE VON DARKSHEER", "   GLASSCHNEIDER", "      SCHERBE", "     KLEMMBRETT", "     MAGNETKARTE", "       WECKER", "  WUCHSBESCHLEUNIGER", "       KNOCHEN", "     SAMENBEUTEL", "      WURFMESSER", "      ZAUBERSTAB", "   SCHRAUBENDREHER", "       LOGBUCH", "      \x99""LK\x8E""NNCHEN", "        LINSE", "     SCHMINKSET", "        SCHMUCK", "        HAMMER", "        MEISSEL", "        MESSER", "    FLEISCHERHAKEN", "       MESSBECHER", "        S\x8E""URE", "    VENTILSTELLRAD", "         SEIL", "     MONIEREISEN", "         NETZ", "        RATTE", "        GABEL", "     STREICHHOLZ", "         LACK", "        PINSEL", "        PFEFFER", "      ZAHNSTOCHER", "         SPEER", "       EIERSACK", "        DIAMANT", "        COMIC", "         NETZ", "  SCHMIEDEEISERNE STANGE", "    KELCH MIT WASSER", "      STUHLTR\x9A""MMER", "       W\x9A""RSTCHEN", "        PLAKAT", "        ZIEGEL", "      NOCTROGLYPH", "      ISOLIERBAND", "         BESEN", "        \x99""LLAMPE", "     STIEL MIT HAKEN", "    SEIL MIT W\x9A""RSTCHEN"},
 };
 
-static const char *ASKITEMS[4][33] = {
+static constexpr const char *ASKITEMS[4][33] = {
 {"      NOCTROPOLIS", "       DARKSHEER", "       STILETTO", "    FATHER DESMOND", "       SUCCUBUS", "        CYGNUS", "      SAM JENKINS", "       MS. SHOTO", "      GREENTHUMB", "        TOPHAT", "        BUTCHER", "    MASTER MACABRE", "       DREALMER", "         FLUX", "    SUNSPIRE TOWER", "      LIQUIDARK", "      SHADESKIN", "      SHADOWLAIR", "     OBSERVATORY", "      CATHEDRAL", "     BEN HUTCHINS", "      MAUSOLEUM", "CENTRAL PARK GREENHOUSE", "      WHISPERMAN", "      OPERA- NEX", "      OPERAHOUSE", "     SUBTERRAINIA", "       CREATURE", "        WARDS", "    PETER BORNICK", "  INCARNATE/DYNATEK", "      JIM DRAKE", "      DISASTERS"},
 {"      NOCTROPOLIS", "       DARKSHEER", "       STILETTO", "    PERE DESMOND", "       SUCCUBE", "        CYGNE", "      SAM JENKINS", "       MME SHOTO", "      MAINVERTE", "        TOPHAT", "        BOUCHER", "    MAITRE MACABRE", "       DREALMER", "         FLUX", "    TOUR SUNSPIRE", "      LIQUIDARK", "    PEAU D'OMBRE", "    ANTRE D'OMBRE", "     OBSERVATOIRE", "      CATHEDRALE", "     BEN HUTCHINS", "      MAUSOLEE", " SERRE DE CENTRAL PARK", "      CHUCHOTEUR", "      OPERA-NEX", "         OPERA", "     SUBTERRAINIA", "       CREATURE", "      PUPILLES", "    PETER BORNICK", "  INCARNATE/DYNATEK", "      JIM DRAKE", "     CATASTROPHES"},
 {"      NOCTROPOLIS", "       TENEBROSO", "       STILETTO", "     PADRE DESMOND", "       SUCCUBUS", "        CYGNUS", "      SAM JENKINS", "      SRA. SHOTO", "       DEDOVERDE", "          DIVA", "      CARNICERO", "   MAESTRO MACABRO", "       MORFEICO", "         FLUX", "       TORRE SOLAR", "    LIQUIOSCURO", "   PIEL SOMBRIA", "   CUEVA SOMBRIA", "    OBSERVATORIO", "       CATEDRAL", "     BEN HUTCHINS", "       MAUSOLEO", "        INVERNADERO", "      WHISPERMAN", "      OPERA- NEX", "           OPERA", "      SUBTERRANIA", "       CRIATURA", "   GUARDIANES", "    PETER BORNICK", " ENCARNADAS/DYNATEK", "      JIM DRAKE", "      DESASTRES"},
@@ -2037,7 +2037,7 @@ const byte *NoctropolisResources::getCursor(int num) const {
 	}
 }
 
-static const char *const NOCT_GENERAL_MESSAGES[4][10] = {
+static constexpr const char *NOCT_GENERAL_MESSAGES[4][10] = {
 {
 	"Looking there reveals nothing of interest.",
 	"That doesn't open.",
@@ -2088,49 +2088,49 @@ static const char *const NOCT_GENERAL_MESSAGES[4][10] = {
 }
 };
 
-static const char *const END_MESSAGE[4] = {
+static constexpr const char *END_MESSAGE[4] = {
 	"Don't look at me, you're the city's new champion.",
 	"Ne me regardez pas. C'est vous le nouveau\nchampion de la ville.",
 	"No me mires. Eres tu el nuevo campeon.",
 	"Schau mich nicht an, du bist der neue Held der Stadt.",
 };
 
-static const char *const MEANWHILE_MESSAGE[4] = {
+static constexpr const char *MEANWHILE_MESSAGE[4] = {
 	"MEANWHILE...",
 	"PENDANT CE TEMPS...",
 	"MIENTRAS...",
 	"INZWISCHEN...",
 };
 
-static const char *const SHOTO_NAME[4] = {
+static constexpr const char *SHOTO_NAME[4] = {
 	"MS. SHOTO",
 	"Mme SHOTO",
 	"SRA. SHOTO",
 	"MS. SHOTO",
 };
 
-static const char *const SHOTO_TEXT[4] = {
+static constexpr const char *SHOTO_TEXT[4] = {
 	"He was just here....\nHe's better than we thought.",
 	"Il sort d'ici ... l'instant...\nIl est meilleur que nous pensions.",
 	"Ha estado aqui...\nEsta mejor de lo que pensabamos.",
 	"Er war gerade hier...\nEr ist besser, als wir dachten.",
 };
 
-static const char *const STIL_MSG[4] = {
+static constexpr const char *STIL_MSG[4] = {
 	"Don't worry about me, Peter. You know I'll\nsupport whatever you've got planned.",
 	"Ne vous inqui\x82tez pas pour moi, Peter. Vous\nsavez que je supporterai tous vos plans.",
 	"No te preocupes por mi, Peter. Te ayudare\nen cualquier cosa que intentes.",
 	"K\x81mmer' dich nicht um mich, Peter. Du wei\xe1t, ich\nunterst\x81tze dich bei allem, was du vorhast.",
 };
 
-static const char *const RESPONSE_TITLE[4] = {
+static constexpr const char *RESPONSE_TITLE[4] = {
 	"RESPONSE %d",
 	"REPONSE %d",
 	"RESPUESA %d",
 	"ANTWORT %d",
 };
 
-static const char *const MORE_ITEMS_TITLE[4] = {
+static constexpr const char *MORE_ITEMS_TITLE[4] = {
 	"       MORE ITEMS       ",
 	"    PLUS D'ARTICLES     ",
 	"       MAS OBJETOS      ",
diff --git a/engines/access/video/movie_decoder.cpp b/engines/access/video/movie_decoder.cpp
index cdf96f33478..ad1028fc262 100644
--- a/engines/access/video/movie_decoder.cpp
+++ b/engines/access/video/movie_decoder.cpp
@@ -100,7 +100,7 @@ bool AccessVIDMovieDecoder::loadStream(Common::SeekableReadStream *stream) {
 	//warning("width %d, height %d", videoWidth, videoHeight);
 
 	// Look through the first few packets
-	static const int maxPacketCheckCount = 10;
+	static constexpr int maxPacketCheckCount = 10;
 
 	for (int i = 0; i < maxPacketCheckCount; i++) {
 		byte chunkId = _stream->readByte();


Commit: 8e8f4ecd4aefe040e03962830a280d27d0b9f928
    https://github.com/scummvm/scummvm/commit/8e8f4ecd4aefe040e03962830a280d27d0b9f928
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add frame to video playback

Changed paths:
    engines/access/asurface.cpp
    engines/access/asurface.h
    engines/access/scripts.cpp
    engines/access/video.h


diff --git a/engines/access/asurface.cpp b/engines/access/asurface.cpp
index e40e08c0e8f..ac95244c992 100644
--- a/engines/access/asurface.cpp
+++ b/engines/access/asurface.cpp
@@ -26,7 +26,7 @@
 #include "access/asurface.h"
 
 // for frame contents debugging
-#define DEBUG_FRAME_DUMP 1
+//#define DEBUG_FRAME_DUMP 1
 
 #ifdef DEBUG_FRAME_DUMP
 #include "graphics/paletteman.h"
@@ -38,7 +38,7 @@
 
 namespace Access {
 
-const int TRANSPARENCY = 0;
+static constexpr int TRANSPARENCY = 0;
 
 SpriteResource::SpriteResource(const AccessEngine *vm, Resource *res) {
 	Common::Array<uint32> offsets;
@@ -224,10 +224,14 @@ void BaseSurface::drawLine() {
 }
 
 void BaseSurface::drawBox() {
-	Graphics::ManagedSurface::hLine(_orgX1, _orgY1, _orgX2, _lColor);
-	Graphics::ManagedSurface::hLine(_orgX1, _orgY2, _orgX2, _lColor);
-	Graphics::ManagedSurface::vLine(_orgX1, _orgY1, _orgY2, _lColor);
-	Graphics::ManagedSurface::vLine(_orgX2, _orgY1, _orgY2, _lColor);
+	drawBox(_orgX1, _orgY1, _orgX2, _orgY2, _lColor);
+}
+
+void BaseSurface::drawBox(int x1, int y1, int x2, int y2, int color) {
+	Graphics::ManagedSurface::hLine(x1, y1, x2, color);
+	Graphics::ManagedSurface::hLine(x1, y2, x2, color);
+	Graphics::ManagedSurface::vLine(x1, y1, y2, color);
+	Graphics::ManagedSurface::vLine(x2, y1, y2, color);
 }
 
 void BaseSurface::flipHorizontal(BaseSurface &dest) {
diff --git a/engines/access/asurface.h b/engines/access/asurface.h
index 46767a5acf4..bd252ca7923 100644
--- a/engines/access/asurface.h
+++ b/engines/access/asurface.h
@@ -102,6 +102,8 @@ public:
 
 	virtual void drawBox();
 
+	virtual void drawBox(int x1, int y1, int x2, int y2, int color);
+
 	virtual void copyBuffer(Graphics::ManagedSurface *src);
 
 	void copyTo(BaseSurface *dest);
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 3cd699c96d8..3bb5dda3685 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -891,7 +891,7 @@ void Scripts::cmdSetVideo_v3() {
 	short rawx = _data->readSint16LE();
 	pt.y = _data->readSint16LE();
 	int cellIndex = _data->readUint16LE();
-	int rate = _data->readUint16LE();
+	int noFrame = _data->readUint16LE();
 
 	if (cellIndex > 0x3f)
 		error("Invalid room video number %d", cellIndex);
@@ -909,11 +909,17 @@ void Scripts::cmdSetVideo_v3() {
 	else
 		pt.x = rawx;
 
-	debugC(1, kDebugScripts, "cmdSetVideo_v3(x=%d, y=%d, cellIndex=%d, rate=%d)", pt.x, pt.y, cellIndex, rate);
-	warning("TODO: cmdSetVideo_v3: Use flag value (%d)", flag);
+	debugC(1, kDebugScripts, "cmdSetVideo_v3(x=%d, y=%d, cellIndex=%d, noFrame=%d)", pt.x, pt.y, cellIndex, noFrame);
+
 	// Hack: Skip the "DARK/"
 	Common::Path vidpath(_vm->_extraCells[cellIndex]._vidFilename.substr(5));
-	_vm->_video->setVideo(_vm->_screen, pt, vidpath, rate);
+	_vm->_video->setVideo(_vm->_screen, pt, vidpath, 0);
+
+	if (noFrame == 0) {
+		_vm->_screen->ASurface::drawBox(pt.x - 1, pt.y - 1, pt.x + _vm->_video->getWidth(), pt.y + _vm->_video->getHeight(), 249);
+		_vm->_screen->ASurface::drawBox(pt.x - 2, pt.y - 2, pt.x + _vm->_video->getWidth() + 1, pt.y + _vm->_video->getHeight() + 1, 248);
+		_vm->_screen->ASurface::drawBox(pt.x - 3, pt.y - 3, pt.x + _vm->_video->getWidth() + 2, pt.y + _vm->_video->getHeight() + 2, 247);
+	}
 
 	if (cellIndex == 1 && roomNum == 0x36)
 		_vm->_screen->setIconPalette();
diff --git a/engines/access/video.h b/engines/access/video.h
index 45e62de457b..f4d7b0179a8 100644
--- a/engines/access/video.h
+++ b/engines/access/video.h
@@ -62,6 +62,10 @@ public:
 	 */
 	void playToEnd();
 
+	virtual int getWidth() = 0;
+
+	virtual int getHeight() = 0;
+
 protected:
 	virtual void setVideo(const Common::Point &pt) = 0;
 
@@ -110,6 +114,11 @@ public:
 	void playVideo() override;
 
 	void copyVideo() override;
+
+	int getWidth() override { return _header._width; }
+
+	int getHeight() override { return _header._height; }
+
 };
 
 class VideoPlayer_v2 : public VideoPlayer {
@@ -152,6 +161,11 @@ public:
 	void copyVideo() override {};
 
 	void closeVideo() override;
+
+	int getWidth() override { return _header._width; }
+
+	int getHeight() override { return _header._height; }
+
 };
 
 


Commit: 051c1de0b0c95cb40383f3843fdff9170e275682
    https://github.com/scummvm/scummvm/commit/051c1de0b0c95cb40383f3843fdff9170e275682
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix some compiler warnings, more const

Changed paths:
    engines/access/amazon/amazon_resources.cpp
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_comicviewer.h
    engines/access/noctropolis/noctropolis_last_comic.cpp
    engines/access/noctropolis/noctropolis_special_comic.cpp
    engines/access/room.cpp
    engines/access/scripts.cpp


diff --git a/engines/access/amazon/amazon_resources.cpp b/engines/access/amazon/amazon_resources.cpp
index f7c65e4c44e..741b2c49ba1 100644
--- a/engines/access/amazon/amazon_resources.cpp
+++ b/engines/access/amazon/amazon_resources.cpp
@@ -158,7 +158,7 @@ const int DEATH_CELLS[13][3] = {
 	{ 0, 94, 14 }
 };
 
-constexpr int CHAPTER_CELLS[17][3] = {
+const int CHAPTER_CELLS[17][3] = {
 	{ 1, 96, 18 },
 	{ 2, 96, 19 },
 	{ 3, 96, 20 },
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index 8dcabfb57c5..3a8d4833a8e 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -25,34 +25,6 @@ namespace Access {
 
 namespace Noctropolis {
 
-int PolygonResource::findPolygonAt(int16 x, int16 y) const {
-	for (uint i = 0; i < _polygons.size(); i++) {
-		if (_polygons[i].pointInside(x, y))
-			return i;
-	}
-	return -1;
-}
-
-void PolygonResource::internalLoad(Common::SeekableReadStream &source, uint32 size) {
-	int polygonCount = source.readUint32LE();
-	while (polygonCount--) {
-		Polygon polygon;
-		int pointsCount = source.readUint16LE();
-		while (pointsCount--) {
-			Common::Point point;
-			point.x = source.readUint16LE();
-			point.y = source.readUint16LE();
-			polygon.points.push_back(point);
-		}
-		_polygons.push_back(polygon);
-	}
-}
-
-void PolygonResource::free() {
-	_polygons.clear();
-}
-
-////////////////
 
 ComicResource::ComicResource(const ComicPage *pages[], int npages) {
 	for (int i = 0; i < npages; i++)
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.h b/engines/access/noctropolis/noctropolis_comicviewer.h
index bdae418da69..96f648e1325 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.h
+++ b/engines/access/noctropolis/noctropolis_comicviewer.h
@@ -41,17 +41,8 @@ struct ComicBox {
 	const char *msgDe;
 };
 
-class PolygonResource : public Resource {
-public:
-	int findPolygonAt(int16 x, int16 y) const;
-	void free();
-protected:
-	PolygonArray _polygons;
-	void internalLoad(Common::SeekableReadStream &source, uint32 size);
-};
-
 struct ComicBlock {
-	struct Polygon *polygon;
+	const struct Polygon *polygon;
 	int32 soundFileIndex, soundResIndex;
 	const struct ComicBox *boxes;
 	int32 numBoxes;
diff --git a/engines/access/noctropolis/noctropolis_last_comic.cpp b/engines/access/noctropolis/noctropolis_last_comic.cpp
index ffd54570484..2a709131c41 100644
--- a/engines/access/noctropolis/noctropolis_last_comic.cpp
+++ b/engines/access/noctropolis/noctropolis_last_comic.cpp
@@ -9,158 +9,158 @@ namespace Access {
 
 namespace Noctropolis {
 
-static struct Polygon poly_p1_b0 = { {
+static const struct Polygon poly_p1_b0 = { {
     { 105, 247 },
     { 580, 247 },
     { 580, 321 },
     { 105, 321 },
 } };
 
-static struct ComicBox block_p1_b0_boxes[] = {
+static const struct ComicBox block_p1_b0_boxes[] = {
     { 0, 246, 105, 318, "IN THE OUTSKIRTS OF NOCTROPOLIS CITY, THREE SILHOUETTES\nDETACH THEMSELVES FROM THE NIGHTSCAPE AND STRUGGLE TO FIND\nFORM BENEATH THE WAN LIGHTING OF THE CITY AMUSEMENT PARK.\nSTARTLED TO ENCOUNTER EACH OTHER, THE PREDATORS PAUSE JUST\nLONG ENOUGH TO DEMAND ANSWERS....", "DANS LA BANLIEUE DE NOCTROPOLIS CITY, TROIS SILHOUETTES\nSE DETACHENT DANS LA NUIT ET LUTTENT POUR PRENDRE FORME\nDANS LA LUMIERE BLAFARDE DU PARC D'ATTRACTIONS DE LA VILLE.\nFASCINES PAR CETTE RENCONTRE, LES PREDATEURS S'ARRETENT A\nPEINE LE TEMPS DE DEMANDER QUELQUES REPONSES...", "EN LA OSCURIDAD DE NOCTROPOLIS, TRES SILUETAS\nINTENTAN ORIENTARSE EN MEDIO DEL PARQUE DE ATRACCIONES.\nABSORTOS EN BUSCARSE ENTRE SI, LOS MERODEADORES NO\nATIENDEN A NADA MAS...", "IN EINEM RANDBEZIRK VON NOCTROPOLIS L\x99""SEN SICH DREI\nSILHOUETTEN AUS DER NACHT UND GEWINNEN M\x9a""HSAM KLARE UMRISSE IN\nDER SCHWACHEN BELEUCHTUNG DES ST\x8e""DTISCHEN VERGN\x9a""GUNGSPARKS. IN\nIHRER \x9a""BERRASCHUNG, SICH HIER ZU TREFFEN, UNTERBRECHEN DIESE\nRAUBTIERE IHREN BEUTEZUG GERADE LANGE GENUG,\nUM EIN PAAR ANTWORTEN ZU VERLANGEN..." },
 };
 
-static struct ComicBlock block_p1_0 = { &poly_p1_b0, -1, -1, block_p1_b0_boxes, 1 };
+static const struct ComicBlock block_p1_0 = { &poly_p1_b0, -1, -1, block_p1_b0_boxes, 1 };
 
-static struct Polygon poly_p1_b1 = { {
+static const struct Polygon poly_p1_b1 = { {
     { 58, 0 },
     { 580, 0 },
     { 580, 399 },
     { 58, 399 },
 } };
 
-static struct ComicBox block_p1_b1_boxes[] = {
+static const struct ComicBox block_p1_b1_boxes[] = {
     { 0, 246, 10, 50, "A SADISTIC MAGICIAN...\n\nA RUTHLESS GUNSLINGER...\n\nA WANTON CANNIBAL...\n\nEACH SUMMONED FROM DARKNESS BY THE STROKE OF MIDNIGHT.", "UNE MAGICIENNE SADIQUE...\n\nUN MALFRAT CRUEL...\n\nUN CANNIBALE PERVERS...\n\nTOUS ONT  ETE  INVOQUES PAR LES TENEBRES \nLORSQUE MINUIT A SONNE", "UNA MAGA SADICA...\n\nUN ASESINO DESPIADADO...\n\nUNA CANIBAL OBSESA...\n\nLOS TRES PARECEN INVOCADOS POR LAS TINIEBLAS.", "EINE SADISTISCHE MAGIERIN...\n\nEIN GNADENLOSER REVOLVERHELD...\n\nEINE B\x99""SARTIGE KANNIBALIN...\n\nSCHLAG MITTERNACHT WERDEN SIE ALLE AUS DEM DUNKEL GERUFEN..." },
 };
 
-static struct ComicBlock block_p1_1 = { &poly_p1_b1, 99, 123, block_p1_b1_boxes, 1 };
+static const struct ComicBlock block_p1_1 = { &poly_p1_b1, 99, 123, block_p1_b1_boxes, 1 };
 
-static struct ComicBlock page_1_blocks[] = {
+static const struct ComicBlock page_1_blocks[] = {
     block_p1_0,
     block_p1_1,
 };
 
 static struct ComicPage page_1 = { "DARK/COMDATA/LEPG1_2.SCN", 98, 41, 1, 0, page_1_blocks, 2 };
 
-static struct Polygon poly_p2_b0 = { {
+static const struct Polygon poly_p2_b0 = { {
     { 106, 0 },
     { 146, 0 },
     { 146, 186 },
     { 106, 186 },
 } };
 
-static struct ComicBox block_p2_b0_boxes[] = {
+static const struct ComicBox block_p2_b0_boxes[] = {
     { 0, 246, 114, 178, "TOPHAT... A DANGEROUS MIX OF MISCHIEF AND MAGIC.", "TOPHAT... UN DANGEREUX MELANGE DE MECHANCETE ET DE MAGIE.", "LA DIVA... PELIGROSA MEZCLA DE MAGIA Y CRUELDAD.", "MISS ZYLINDERCHEN...EINE GEF\x8e""HRLICHE MISCHUNG AUS\nBOSHEIT UND ZAUBEREI." },
 };
 
-static struct ComicBlock block_p2_0 = { &poly_p2_b0, -1, -1, block_p2_b0_boxes, 1 };
+static const struct ComicBlock block_p2_0 = { &poly_p2_b0, -1, -1, block_p2_b0_boxes, 1 };
 
-static struct Polygon poly_p2_b1 = { {
+static const struct Polygon poly_p2_b1 = { {
     { 165, 0 },
     { 207, 0 },
     { 207, 186 },
     { 165, 186 },
 } };
 
-static struct ComicBox block_p2_b1_boxes[] = {
+static const struct ComicBox block_p2_b1_boxes[] = {
     { 0, 246, 176, 178, "DESPERADO... A HARDENED GUNMAN WITH A QUICK TEMPER\nAND LIGHTNING DRAW.", "DESPERADO... UN TIREUR ENTRAINE, QUI SE FACHE VITE ET\nDEGAINE ENCORE PLUS VITE.", "DESESPERADO... ASESINO SIEMPRE DISPUESTO A SACAR\nSU ARMA.", "SHOWDOWN... EIN ERFAHRENER PISTOLENSCH\x9a""TZE, DER\nBLITZSCHNELL ZIEHT." },
 };
 
-static struct ComicBlock block_p2_1 = { &poly_p2_b1, -1, -1, block_p2_b1_boxes, 1 };
+static const struct ComicBlock block_p2_1 = { &poly_p2_b1, -1, -1, block_p2_b1_boxes, 1 };
 
-static struct Polygon poly_p2_b2 = { {
+static const struct Polygon poly_p2_b2 = { {
     { 224, 0 },
     { 265, 0 },
     { 256, 186 },
     { 224, 186 },
 } };
 
-static struct ComicBox block_p2_b2_boxes[] = {
+static const struct ComicBox block_p2_b2_boxes[] = {
     { 0, 246, 235, 178, "WIDOWMARK... A NYMPHOMANIAC THAT DEVOURS HER MATES.", "WIDOWMARK... UNE NYMPHOMANE QUI DEVORE SES AMANTS.", "VIUDA NEGRA... NINFOMANIACA Y CANIBAL.", "DIE SCHWARZE WITWE...EINE NYMPHOMANIN, DIE IHRE\nGELIEBTEN AUFREISST." },
 };
 
-static struct ComicBlock block_p2_2 = { &poly_p2_b2, -1, -1, block_p2_b2_boxes, 1 };
+static const struct ComicBlock block_p2_2 = { &poly_p2_b2, -1, -1, block_p2_b2_boxes, 1 };
 
-static struct Polygon poly_p2_b3 = { {
+static const struct Polygon poly_p2_b3 = { {
     { 126, 356 },
     { 253, 356 },
     { 227, 399 },
     { 152, 399 },
 } };
 
-static struct ComicBox block_p2_b3_boxes[] = {
+static const struct ComicBox block_p2_b3_boxes[] = {
     { 0, 246, 150, 350, "DARKSHEER... VIGILANTE. SENTINEL. EYES OF THE NIGHT.", "DARKSHEER... LE VIGILE. LA SENTINELLE. LES YEUX DE LA NUIT.", "TENEBROSO... VIGILANTE, CENTINELA.", "DARKSHEER...DER W\x8e""CHTER. DER BESCH\x9a""TZER. DIE AUGEN\nDER NACHT." },
 };
 
-static struct ComicBlock block_p2_3 = { &poly_p2_b3, -1, -1, block_p2_b3_boxes, 1 };
+static const struct ComicBlock block_p2_3 = { &poly_p2_b3, -1, -1, block_p2_b3_boxes, 1 };
 
-static struct Polygon poly_p2_b4 = { {
+static const struct Polygon poly_p2_b4 = { {
     { 60, 0 },
     { 317, 0 },
     { 317, 399 },
     { 60, 399 },
 } };
 
-static struct ComicBox block_p2_b4_boxes[] = {
+static const struct ComicBox block_p2_b4_boxes[] = {
     { 3, 244, 250, 218, "     TOPHAT? WIDOWMARK! WHAT\nTHE HELL ARE YOU TWO DOIN'\n             HERE?", "      TOPHAT? WIDOWMARK!\n QU'EST-CE QUE VOUS FAITES ICI\n        TOUTES LES DEUX?", "     DIVA? VIUDA NEGRA! QUE\nDEMONIOS HACEIS \n             AQUI?", "           ZYLINDERCHEN?\n SCHWARZE WITWE? WAS ZUR H\x99""LLE\n       MACHT IHR BEIDE HIER?" },
 };
 
-static struct ComicBlock block_p2_4 = { &poly_p2_b4, -1, -1, block_p2_b4_boxes, 1 };
+static const struct ComicBlock block_p2_4 = { &poly_p2_b4, -1, -1, block_p2_b4_boxes, 1 };
 
-static struct Polygon poly_p2_b5 = { {
+static const struct Polygon poly_p2_b5 = { {
     { 319, 0 },
     { 377, 0 },
     { 409, 105 },
     { 318, 147 },
 } };
 
-static struct ComicBox block_p2_b5_boxes[] = {
+static const struct ComicBox block_p2_b5_boxes[] = {
     { 4, 244, 129, 18, "      YOU LADIES BETTER TALK\n  FAST, 'CAUSE I GOT OTHER\nBUSINESS HERE, AND MY FINGER'S\n  JUST ITCHIN' FOR THE TRIGGER!", "      VOUS FERIEZ MIEUX DE\n  VOUS EXPLIQUER , ET VITE, J'AI\nAUTRE CHOSE A FAIRE, ET MON DOIGT\n   ME DEMANGE SUR LA GACHETTE!", "     MEJOR HABLAD RAPIDO\n  PORQUE TENGO UN ASUNTO\nQUE LIQUIDAR Y MIS DEDOS ESTAN\n ANSIOSOS POR DISPARAR!", "          ALSO, LADIES, IHR\n     REDET BESSER SCHNELL, DENN\nICH HABE HEIR ETWAS ZU ERLEDIGEN,\n       UND MEIN ABZUGSFINGER\n       JUCKT SCHON GEWALTIG!" },
 };
 
-static struct ComicBlock block_p2_5 = { &poly_p2_b5, -1, -1, block_p2_b5_boxes, 1 };
+static const struct ComicBlock block_p2_5 = { &poly_p2_b5, -1, -1, block_p2_b5_boxes, 1 };
 
-static struct Polygon poly_p2_b6 = { {
+static const struct Polygon poly_p2_b6 = { {
     { 377, 0 },
     { 530, 0 },
     { 453, 244 },
 } };
 
-static struct ComicBox block_p2_b6_boxes[] = {
+static const struct ComicBox block_p2_b6_boxes[] = {
     { 2, 244, 240, 132, "     STAY OUT OF MY WAY\nGUNSLINGER! I WAS INVITED!", "     HORS DE MON CHEMIN!\n      JE SUIS INVITEE!", "   APARTATE DE MI\nCAMINO! ESTOY INVITADA!", "       HALT DICH BLO\xe1"" AUS\n  MEINEN ANGELEGENHEITEN RAUS!\n      ICH WURDE EINGELADEN!" },
 };
 
-static struct ComicBlock block_p2_6 = { &poly_p2_b6, -1, -1, block_p2_b6_boxes, 1 };
+static const struct ComicBlock block_p2_6 = { &poly_p2_b6, -1, -1, block_p2_b6_boxes, 1 };
 
-static struct Polygon poly_p2_b7 = { {
+static const struct Polygon poly_p2_b7 = { {
     { 530, 0 },
     { 580, 0 },
     { 580, 145 },
     { 496, 105 },
 } };
 
-static struct ComicBox block_p2_b7_boxes[] = {
+static const struct ComicBox block_p2_b7_boxes[] = {
     { 2, 244, 320, 108, "     INDEED, MY DEAR. IT WOULD\nSEEM THAT OUR MEETING IS NOT SO\n     CIRCUMSTANTIAL, AFTER ALL.", "      VRAIMENT, TRES CHERE...\n   IL ME SEMBLE QUE NOTRE\n  RENCONTRE N'EST PAS TOUT A FAIT\n       FORTUITE, FINALEMENT...", "  CARAMBA, QUERIDA. PARECE\nQUE NUESTRO ENCUENTRO NO HA\n   SIDO TAN CASUAL.", "           WIRKLICH, MEINE\n     LIEBE? ES SCHEINT, ALS SEI\n    UNSER ZUSAMMENTREFFEN HIER\n         NICHT GANZ ZUF\x8e""LLIG." },
 };
 
-static struct ComicBlock block_p2_7 = { &poly_p2_b7, -1, -1, block_p2_b7_boxes, 1 };
+static const struct ComicBlock block_p2_7 = { &poly_p2_b7, -1, -1, block_p2_b7_boxes, 1 };
 
-static struct Polygon poly_p2_b8 = { {
+static const struct Polygon poly_p2_b8 = { {
     { 349, 232 },
     { 445, 233 },
     { 445, 334 },
     { 339, 334 },
 } };
 
-static struct ComicBox block_p2_b8_boxes[] = {
+static const struct ComicBox block_p2_b8_boxes[] = {
     { 3, 244, 459, 168, "        THAT'S VERY POSSIBLE,\n   DESPERADO. LATELY, DARKSHEER'S\n BEEN QUITE INTENT UPON ELIMINATING\nHIS ENEMIES, AND I DARE SAY WE THREE\nARE THE LAST LEFT. BUT CONSIDER THE\n GORGEOUS POSSIBILITIES IF THE\n    THREE OF US ELECTED TO JOIN\n           AGAINST HIM!", "         C'EST TRES POSSIBLE,\n   DESPERADO. DERNIEREMENT,\n  DARKSHEER A MIS TOUTE SON\n ENERGIE DANS LA DESTRUCTION DE SES\n   ENNEMIS, ET J'OSE DIRE QUE NOUS\n         SOMMES LES DERNIERS.", "             ES MUY PROBABLE,\n  DESESPERADO. TENEBROSO QUIERE\n INTENTAR ELIMINAR A SUS ENEMIGOS\nY ME PARECE QUE SOLO QUEDAMOS \nNOSOTROS TRES. PERO TE IMAGINAS QUE\n PASARIA SI UNIERAMOS NUESTRAS\n    FUERZAS PARA ACABAR CON\n           EL?", "               DAS IST GUT\n        M\x99""GLICH, SHOWDOWN. IN\n     LETZTER ZEIT LEGT DARKSHEER\n   ES DARAUF AN, ALLE SEINE FEINDE\n  AUSZUSCHALTEN. UND ICH WAGE MAL\n    ZU BEHAUPTEN, WIR DREI SIND DIE\n         LETZTEN \x9a""BERLEBENDEN." },
     { 3, 244, 459, 168, nullptr, "          MAIS PENSEZ AUX\n   POSSIBILITES FASCINANTES QUI\n   S'OFFRENT A NOUS SI NOUS NOUS\n        UNISSONS CONTRE LUI!", nullptr, "       ABER MALT EUCH BLO\xe1""\n   MAL DIE M\x99""GLICHKEITEN AUS,\n    WENN WIR DREI UNS GEGEN IHN\n          VERB\x9a""NDETEN!" },
     { 4, 244, 137, 260, "     THREE AGAINST ONE... LADY,\nI LIKE THEM ODDS.", "      TROIS CONTRE UN...\n  JE PREFERE L'EQUILIBRE.", "     TRES CONTRA UNO... ME\n GUSTA COMO SUENA.", "       DREI GEGEN EINEN...\nLADY, DAS VERH\x8e""LTNIS GEF\x8e""LLT MIR." },
 };
 
-static struct ComicBlock block_p2_8 = { &poly_p2_b8, -1, -1, block_p2_b8_boxes, 3 };
+static const struct ComicBlock block_p2_8 = { &poly_p2_b8, -1, -1, block_p2_b8_boxes, 3 };
 
-static struct Polygon poly_p2_b9 = { {
+static const struct Polygon poly_p2_b9 = { {
     { 318, 147 },
     { 409, 105 },
     { 439, 203 },
@@ -168,54 +168,54 @@ static struct Polygon poly_p2_b9 = { {
     { 317, 238 },
 } };
 
-static struct ComicBox block_p2_b9_boxes[] = {
+static const struct ComicBox block_p2_b9_boxes[] = {
     { 1, 244, 451, 160, "     I RECEIVED ONE OF\nDARKSHEER'S PRETTY INVITATIONS\n          AS WELL.", "     J'AI MOI AUSSI RE\x80""U\nUNE DES INVITATIONS DE DARKSHEER.", "   RECIBI UNA DE LAS\nPRECIOSAS INVITACIONES DE\n       TENEBROSO.", "         ICH HABE AUCH EINE\n    VON DARKSHEERS H\x9a""BSCHEN\n      EINLADUNGEN BEKOMMEN." },
 };
 
-static struct ComicBlock block_p2_9 = { &poly_p2_b9, -1, -1, block_p2_b9_boxes, 1 };
+static const struct ComicBlock block_p2_9 = { &poly_p2_b9, -1, -1, block_p2_b9_boxes, 1 };
 
-static struct Polygon poly_p2_b10 = { {
+static const struct Polygon poly_p2_b10 = { {
     { 472, 221 },
     { 566, 222 },
     { 566, 292 },
     { 472, 292 },
 } };
 
-static struct ComicBox block_p2_b10_boxes[] = {
+static const struct ComicBox block_p2_b10_boxes[] = {
     { 4, 244, 319, 196, "     ALL RIGHT, WE FIGHT\n  TOGETHER. BUT NO MATTER WHO\n  BRINGS HIM DOWN, I GET\n      DARKSHEER'S BODY.", "      D'ACCORD, NOUS NOUS\n  BATTRONS ENSEMBLE. MAIS JE\n  VEUX LE CORPS DE DARKSHEER,\n    MEME SI CE N'EST PAS\n       MOI QUI LE TUE.", "   ESTA BIEN, PELEAREMOS\n  JUNTOS. PERO NO IMPORTA QUIEN\n  LO MATE. YO QUIERO SU\n    CADAVER PARA MI.", "             IN ORDNUNG,\n    TUN WIR UNS ZUSAMMEN. ABER\n   EGAL, WER IHN FERTIGMACHT, ICH\n         BEKOMME DARKSHEERS\n                K\x99""RPER!" },
 };
 
-static struct ComicBlock block_p2_10 = { &poly_p2_b10, -1, -1, block_p2_b10_boxes, 1 };
+static const struct ComicBlock block_p2_10 = { &poly_p2_b10, -1, -1, block_p2_b10_boxes, 1 };
 
-static struct Polygon poly_p2_b11 = { {
+static const struct Polygon poly_p2_b11 = { {
     { 496, 105 },
     { 580, 145 },
     { 580, 233 },
     { 466, 200 },
 } };
 
-static struct ComicBox block_p2_b11_boxes[] = {
+static const struct ComicBox block_p2_b11_boxes[] = {
     { 2, 244, 312, 188, "     THAT STINKIN' WEASEL SENT\nME ONE TOO... THIS WHOLE DAMN\n    THING STINKS LIKE A SET-UP!", "     CE RAT PUANT M'EN A AUSSI\nENVOYE UNE...TOUTE CETTE HISTOIRE\n        SENT LE COUP MONTE!", "   ESE CERDO ME ENVIO UNA\nTAMBIEN...  ESTE ASUNTO\n   HUELE A ENCERRONA!", "         DIESES STINKENDE\n     WIESEL HAT MIR AUCH EINE\n   GESCHICKT...DAS GANZE RIECHT\n         NACH EINER FALLE." },
 };
 
-static struct ComicBlock block_p2_11 = { &poly_p2_b11, -1, -1, block_p2_b11_boxes, 1 };
+static const struct ComicBlock block_p2_11 = { &poly_p2_b11, -1, -1, block_p2_b11_boxes, 1 };
 
-static struct Polygon poly_p2_b12 = { {
+static const struct Polygon poly_p2_b12 = { {
     { 459, 320 },
     { 583, 320 },
     { 581, 375 },
     { 458, 375 },
 } };
 
-static struct ComicBox block_p2_b12_boxes[] = {
+static const struct ComicBox block_p2_b12_boxes[] = {
     { 4, 244, 302, 262, "        OH, WIDOWMARK, HOW\n   DELICIOUSLY MORBID! OF COURSE\n YOU MAY CLAIM YOUR TROPHY. TELL\nME, DON'T YOU BOTH JUST ADORE THE\n   INVITATIONS? I SIMPLY LOVE\n    DARKSHEER'S FLAIR FOR THE\n            DRAMATIC!", "        OH, WIDOWMARK, QUELLE\n   CHARMANTE ATTENTION MORBIDE!\n BIEN SUR, VOUS POURREZ RECLAMER\n  VOTRE TROPHEE. DITES-MOI, VOUS\n   N'ADOREZ PAS LES INVITATIONS?\n    J'ADORE LE FLAIR DE DARKSHEER\n       POUR LES HISTOIRES\n              DRAMATIQUES!", "        QUE DELICIOSAMENTE\n  MORBOSA ERES, VIUDA NEGRA! POR\n SUPUESTO QUE TE DAREMOS EL TROFEO.\n NO OS ENCANTA LA AFICION QUE\n SIENTE TENEBROSO POR LO\n            DRAMATICO?", "         OH, SCHWARZE WITWE,\n    WIE HERRLICH MORBID! NAT\x9a""RLICH\n   SOLLST DU DEINE TROPH\x8e""E HABEN!\nSAGT MAL, GEFALLEN EUCH DARKSHEERS\n    EINLADUNGEN AUCH SO GUT? ICH\n        BEWUNDERE SEIN FLAIR\n          F\x9a""R DAS DRAMATISCHE." },
     { 2, 244, 270, 342, "     YEAH, WHATEVER, TOPHAT.\nDARK BOY MUST BE WAITIN' INSIDE\n             FOR US....", "     OUI, PEUT-ETRE, TOPHAT.\n     IL DOIT NOUS ATTENDRE A\n         L'INTERIEUR...", "     LO QUE TU DIGAS, DIVA.\nADELANTE. EL CHICO OSCURO DEBE\n    ESTAR ESPERANDO...", "       JAJA, WAS AUCH IMMER,\n    ZYLINDERCHEN. DER FINSTERE\n  BUBE MU\xe1"" WOHL DRINNEN AUF UNS\n              WARTEN..." },
     { 4, 244, 340, 275, "     THEN LET'S GET GOING...\n       I WANT TO FEED!", "     ALLONS-Y... JE DOIS\n       ME NOURRIR!", "   ENTONCES VANOS...\n       TENGO HAMBRE!", "      DANN LA\xe1""T UNS GEHEN...\n   ICH WILL HEUTE ZEITIG ESSEN!" },
 };
 
-static struct ComicBlock block_p2_12 = { &poly_p2_b12, -1, -1, block_p2_b12_boxes, 3 };
+static const struct ComicBlock block_p2_12 = { &poly_p2_b12, -1, -1, block_p2_b12_boxes, 3 };
 
-static struct ComicBlock page_2_blocks[] = {
+static const struct ComicBlock page_2_blocks[] = {
     block_p2_0,
     block_p2_1,
     block_p2_2,
@@ -233,7 +233,7 @@ static struct ComicBlock page_2_blocks[] = {
 
 static struct ComicPage page_2 = { "DARK/COMDATA/LEPG3_4.SCN", 98, 42, 1, 0, page_2_blocks, 13 };
 
-static struct Polygon poly_p3_b0 = { {
+static const struct Polygon poly_p3_b0 = { {
     { 59, 265 },
     { 110, 265 },
     { 79, 232 },
@@ -245,43 +245,43 @@ static struct Polygon poly_p3_b0 = { {
     { 59, 399 },
 } };
 
-static struct ComicBox block_p3_b0_boxes[] = {
+static const struct ComicBox block_p3_b0_boxes[] = {
     { 7, 246, 265, 225, "      ONE LITTLE, TWO LITTLE,\nTHREE LITTLE INDIANS...WELCOME TO\n          THRILLSVILLE.", "       UN PETIT INDIEN, DEUX\n   PETITS INDIENS, TROIS PETITS\n    INDIENS... BIENVENUE DANS LA\n         VILLE DES FRISSONS!", "   UN INDIECITO, DOS\nINDIECITOS, TRES INDIECITOS EN\n      EL PARQUECITO.", "          EINS, ZWEI, DREI\n  KLEINE NEGERLEIN...WILLKOMMEN\n          IN RISIKOHAUSEN." },
     { 3, 244, 234, 318, "       WHERE IS HE?", "\n           OU EST-IL?", "       DONDE ESTA?", "\n             WO IST ER?" },
     { 3, 244, 254, 319, "      HE'S WATCHING US FROM\nTHE SHADOWS, OF COURSE... HONEY,\n           WE'RE HOME!", "      IL NOUS REGARDE DANS\nL'OMBRE, EVIDEMMENT. CHERIE, NOUS\n         SOMMES CHEZ NOUS!", "    MIRANDONOS DESDE LAS\nSOMBRAS, POR SUPUESTO. AQUI\n    ESTAMOS, QUERIDO!", "        ER BEOBACHTET UNS\n    NAT\x9a""RLICH AUS DEM SCHATTEN.\n     SCHATZ, WIR SIND ZU HAUSE!" },
     { 3, 244, 272, 325, "      THAT BASTARD'S MORE\n     YELLA THAN I THOUGHT!", "     CE BATARD CRIE PLUS\n   FORT QUE JE NE CROYAIS!", "   ESE BASTARDO ES PEOR\n QUE UNA PATADA EN EL TRASERO!", "        DER BASTARD IST NOCH\n      FEIGER, ALS ICH DACHTE!" },
 };
 
-static struct ComicBlock block_p3_0 = { &poly_p3_b0, -1, -1, block_p3_b0_boxes, 4 };
+static const struct ComicBlock block_p3_0 = { &poly_p3_b0, -1, -1, block_p3_b0_boxes, 4 };
 
-static struct Polygon poly_p3_b1 = { {
+static const struct Polygon poly_p3_b1 = { {
     { 325, 0 },
     { 479, 0 },
     { 479, 133 },
     { 325, 133 },
 } };
 
-static struct ComicBox block_p3_b1_boxes[] = {
+static const struct ComicBox block_p3_b1_boxes[] = {
     { 1, 244, 475, 70, "      YOU-HOO, DARKSHEER!\nCOME OUT, COME OUT WHEREVER\n           YOU ARE!", "      YOU-HOU, DARKSHEER!\n     VENEZ! ALLEZ, SORTEZ\n           DE LA...!", "      HOLA, TENEBROSO!\nDONDEQUIERA QUE ESTES, DEJATE\n           VER!", "       JUHUUH, DARKSHEER!\n   KOMM RAUS, KOMM RAUS, WO\n          IMMER DU BIST!" },
     { 2, 244, 130, 84, "    SHUDDUP TOPHAT! NO REASON\nTHE WHOLE DAMN WORLD'S GOTTA\n          KNOW WE'RE COMIN'!", "    LA FERME,TOPHAT! LE MONDE\nENTIER N'A PAS BESOIN DE SAVOIR\n        QUE NOUS ARRIVONS!", "    CALLATE, DIVA! NO HAY\nRAZON PARA REVELARLE NUESTRA\n          POSICION!", "             SCHNAUZE, \n     ZYLINDERCHEN! ES MU\xe1"" JA\n NICHT GLEICH DIE GANZE VERDAMMTE\n        WELT H\x99""REN, DA\xe1"" WIR\n              KOMMEN!" },
 };
 
-static struct ComicBlock block_p3_1 = { &poly_p3_b1, -1, -1, block_p3_b1_boxes, 2 };
+static const struct ComicBlock block_p3_1 = { &poly_p3_b1, -1, -1, block_p3_b1_boxes, 2 };
 
-static struct Polygon poly_p3_b2 = { {
+static const struct Polygon poly_p3_b2 = { {
     { 325, 133 },
     { 479, 133 },
     { 479, 196 },
     { 325, 196 },
 } };
 
-static struct ComicBox block_p3_b2_boxes[] = {
+static const struct ComicBox block_p3_b2_boxes[] = {
     { 2, 244, 208, 198, "      THIS IS BULL-DIP! HIDE 'N\n  SEEK IS A SISSY-BOY KID-GAME!\nA MAN OUGHTA DO HIS FIGHTIN' OUT IN\n        THE OPEN, I TELL YA.", "      C'EST NUL! LES JEUX DE\n  CACHE-CACHE, C'EST BON POUR LA\nMATERNELLE! UN HOMME DOIT SAVOIR\n     SE BATTRE A DECOUVERT, MOI\n         JE VOUS LE DIS.", "      ESTO APESTA! SOLO LOS\n  COBARDES SE ESCONDEN ASI!\nUN HOMBRE VERDADERO DA LA CARA Y\n        PELEA.", "\n         DAS IST DOCH ALLES\n        BULLENSCHEI\xe1""E HIER!\n  VERSTECKSPIELEN IST WAS F\x9a""R FEIGE\n   JUNGS! EIN MANN SOLLTE SEINE\n        K\x8e""MPFE GANZ OFFEN\n           AUSTRAGEN!" },
 };
 
-static struct ComicBlock block_p3_2 = { &poly_p3_b2, -1, -1, block_p3_b2_boxes, 1 };
+static const struct ComicBlock block_p3_2 = { &poly_p3_b2, -1, -1, block_p3_b2_boxes, 1 };
 
-static struct Polygon poly_p3_b3 = { {
+static const struct Polygon poly_p3_b3 = { {
     { 325, 196 },
     { 478, 196 },
     { 478, 212 },
@@ -292,14 +292,14 @@ static struct Polygon poly_p3_b3 = { {
     { 325, 229 },
 } };
 
-static struct ComicBox block_p3_b3_boxes[] = {
+static const struct ComicBox block_p3_b3_boxes[] = {
     { 3, 244, 460, 182, "      I KNOW HE'S HERE...\n      I CAN SMELL HIM!", "      JE SAIS QU'IL EST LA... \n      JE LE SENS!", "  SE QUE ESTA AQUI...\n      PUEDO OLERLO!", "       ICH WEI\xe1"", DA\xe1"" ER HIER\n    IST....ICH KANN IHN WITTERN!" },
     { 4, 244, 247, 139, "      OH, HE'S HERE, LUSCIOUS,\n AND HE'S CLOSER THAN YOU KNOW.\n I DO BELIEVE I'VE FOUND OUR\n          SLIPPERY PREY...", "      OH, IL EST LA, MA BELLE,\n  ET PLUS PRES QUE VOUS NE\n CROYEZ. JE CROIS QUE J'AI TROUVE\n     NOTRE PROIE INSSAISISSABLE.", "      SI, ESTA AQUI,\n Y MAS CERCA DE LO QUE CREES.\n CREO QUE DE UN MOMENTO A\n OTRO SE DEJARA VER...", "        OH, ER IST SOGAR\n   GANZ BESTIMMT HIER, S\x9a""\xe1""E, UND\n N\x8e""HER, ALS DU AHNST. ICH GLAUBE,\n    ICH HABE UNSERE BEUTE\n           ENTDECKT." },
 };
 
-static struct ComicBlock block_p3_3 = { &poly_p3_b3, -1, -1, block_p3_b3_boxes, 2 };
+static const struct ComicBlock block_p3_3 = { &poly_p3_b3, -1, -1, block_p3_b3_boxes, 2 };
 
-static struct Polygon poly_p3_b4 = { {
+static const struct Polygon poly_p3_b4 = { {
     { 325, 229 },
     { 458, 312 },
     { 439, 340 },
@@ -308,13 +308,13 @@ static struct Polygon poly_p3_b4 = { {
     { 325, 394 },
 } };
 
-static struct ComicBox block_p3_b4_boxes[] = {
+static const struct ComicBox block_p3_b4_boxes[] = {
     { 3, 244, 471, 265, "    SHOW ME A TARGET, TOPHAT!\n I'M GONNA DOUBLE THAT SCUM'S\n       WEIGHT WITH HOT LEAD!", "      MONTREZ-MOI LA CIBLE,\n TOPHAT! QUAND JE L'AURAI CRIBLE\n  DE BALLES, IL PESERA DEUX FOIS\n            PLUS LOURD!", "   DIME DONDE, DIVA!\n MANDARE A ESA PESTE AL\n       CEMENTERIO!", "      WENN DU IHN GEFUNDEN\n    HAST, DANN ZEIG MIR DAS ZIEL,\n ZYLINDERCHEN! ICH VERDOPPLE DAS\n   GEWICHT DIESES ST\x9a""CKS ABSCHAUM\n               MIT BLEI!" },
 };
 
-static struct ComicBlock block_p3_4 = { &poly_p3_b4, -1, -1, block_p3_b4_boxes, 1 };
+static const struct ComicBlock block_p3_4 = { &poly_p3_b4, -1, -1, block_p3_b4_boxes, 1 };
 
-static struct Polygon poly_p3_b5 = { {
+static const struct Polygon poly_p3_b5 = { {
     { 458, 312 },
     { 511, 290 },
     { 588, 290 },
@@ -324,13 +324,13 @@ static struct Polygon poly_p3_b5 = { {
     { 439, 340 },
 } };
 
-static struct ComicBox block_p3_b5_boxes[] = {
+static const struct ComicBox block_p3_b5_boxes[] = {
     { 4, 244, 290, 294, "     CERTAINLY, DESPERADO, BUT\nIT IS PERHAPS MORE ACCURATE TO\n     SAY THAT HE HAS FOUND US!", "\n     BIEN SUR, DESPERADO. MAIS\nIL SERAIT PEUT-ETRE PLUS JUSTE DE\n   DIRE QUE C'EST LUI QUI NOUS\n            A TROUVES!", "     SEGURO, DESESPERADO.\nPERO ME TEMO QUE SERA EL QUIEN\n     NOS DESCUBRA PRIMERO!", "\n        SICHER, SHOWDOWN.\n  ABER ES W\x8e""RE VIELLEICHT PR\x8e""ZISER,\n       ZU SAGEN, DA\xe1"" ER UNS\n            GEFUNDEN HAT." },
 };
 
-static struct ComicBlock block_p3_5 = { &poly_p3_b5, -1, -1, block_p3_b5_boxes, 1 };
+static const struct ComicBlock block_p3_5 = { &poly_p3_b5, -1, -1, block_p3_b5_boxes, 1 };
 
-static struct ComicBlock page_3_blocks[] = {
+static const struct ComicBlock page_3_blocks[] = {
     block_p3_0,
     block_p3_1,
     block_p3_2,
@@ -341,71 +341,71 @@ static struct ComicBlock page_3_blocks[] = {
 
 static struct ComicPage page_3 = { "DARK/COMDATA/LEPG5_6.SCN", 98, 43, 0, 0, page_3_blocks, 6 };
 
-static struct Polygon poly_p4_b0 = { {
+static const struct Polygon poly_p4_b0 = { {
     { 62, 0 },
     { 147, 137 },
     { 62, 137 },
 } };
 
-static struct ComicBox block_p4_b0_boxes[] = {
+static const struct ComicBox block_p4_b0_boxes[] = {
     { 1, 244, 135, 92, "     WHAT THE HELL...?", "\n     MAIS QU'EST-CE QUE...?", "     QUE DEMONIOS...?", "\n        WAS ZUR H\x99""LLE...?" },
 };
 
-static struct ComicBlock block_p4_0 = { &poly_p4_b0, -1, -1, block_p4_b0_boxes, 1 };
+static const struct ComicBlock block_p4_0 = { &poly_p4_b0, -1, -1, block_p4_b0_boxes, 1 };
 
-static struct Polygon poly_p4_b1 = { {
+static const struct Polygon poly_p4_b1 = { {
     { 62, 0 },
     { 238, 0 },
     { 147, 137 },
 } };
 
-static struct ComicBox block_p4_b1_boxes[] = {
+static const struct ComicBox block_p4_b1_boxes[] = {
     { 5, 246, 182, 46, "    SHOWTIME KIDDIES...\n        GERONIMO!", "\n  QUE LE SPECTACLE COMMENCE...\n        GERONIMO!", "    HOLA, CHICOS...\n        SORPRESA!", "\n JETZT IST SHOWTIME, KINDERCHEN...\n            GERONIMO!" },
 };
 
-static struct ComicBlock block_p4_1 = { &poly_p4_b1, -1, -1, block_p4_b1_boxes, 1 };
+static const struct ComicBlock block_p4_1 = { &poly_p4_b1, -1, -1, block_p4_b1_boxes, 1 };
 
-static struct Polygon poly_p4_b2 = { {
+static const struct Polygon poly_p4_b2 = { {
     { 238, 0 },
     { 322, 0 },
     { 322, 137 },
     { 147, 137 },
 } };
 
-static struct ComicBox block_p4_b2_boxes[] = {
+static const struct ComicBox block_p4_b2_boxes[] = {
     { 4, 244, 15, 28, "    HOO-HOO! BOGEY AT\n     TWELVE O'CLOCK HIGH!", "      HO HO! ENNEMI A\n   12 HEURES DROIT DESSUS!", "    TAN PUNTUAL COMO\n     SIEMPRE!", "             HO-HO!\n     FEINDFLIEGER OBEN AUF\n           ZW\x99""LF UHR!" },
     { 2, 244, 65, 55, "    IT'S A FREAKIN' AMBUSH!", "\n     C'EST UNE EMBUSCADE!", "    ESTO ES UNA EMBOSCADA!", " \n      DAS IST EIN VERDAMMTER\n           HINTERHALT!" },
 };
 
-static struct ComicBlock block_p4_2 = { &poly_p4_b2, -1, -1, block_p4_b2_boxes, 2 };
+static const struct ComicBlock block_p4_2 = { &poly_p4_b2, -1, -1, block_p4_b2_boxes, 2 };
 
-static struct Polygon poly_p4_b3 = { {
+static const struct Polygon poly_p4_b3 = { {
     { 62, 137 },
     { 147, 137 },
     { 147, 399 },
     { 62, 399 },
 } };
 
-static struct ComicBox block_p4_b3_boxes[] = {
+static const struct ComicBox block_p4_b3_boxes[] = {
     { 3, 246, 161, 233, "    UNHHH... TOUCHDOWN!", "\n    UNHHH... ATTERRISSAGE!", "    EXACTO!", "\n  UFF...DER ADLER IST GELANDET!" },
 };
 
-static struct ComicBlock block_p4_3 = { &poly_p4_b3, -1, -1, block_p4_b3_boxes, 1 };
+static const struct ComicBlock block_p4_3 = { &poly_p4_b3, -1, -1, block_p4_b3_boxes, 1 };
 
-static struct Polygon poly_p4_b4 = { {
+static const struct Polygon poly_p4_b4 = { {
     { 147, 137 },
     { 322, 137 },
     { 322, 399 },
     { 147, 399 },
 } };
 
-static struct ComicBox block_p4_b4_boxes[] = {
+static const struct ComicBox block_p4_b4_boxes[] = {
     { 2, 244, 5, 193, "    YOU TWO STAY BACK!\n       HE'S MINE!", "       RESTEZ EN ARRIERE!\n         IL EST A MOI!!", "    RETROCEDED!\n       ES MIO!", "        IHR BEIDEN HALTET\n     EUCH RAUS! ER GEH\x99""RT MIR!" },
 };
 
-static struct ComicBlock block_p4_4 = { &poly_p4_b4, -1, -1, block_p4_b4_boxes, 1 };
+static const struct ComicBlock block_p4_4 = { &poly_p4_b4, -1, -1, block_p4_b4_boxes, 1 };
 
-static struct Polygon poly_p4_b5 = { {
+static const struct Polygon poly_p4_b5 = { {
     { 474, 176 },
     { 514, 193 },
     { 528, 226 },
@@ -416,13 +416,13 @@ static struct Polygon poly_p4_b5 = { {
     { 432, 195 },
 } };
 
-static struct ComicBox block_p4_b5_boxes[] = {
+static const struct ComicBox block_p4_b5_boxes[] = {
     { 4, 244, 250, 187, "   HOLY #@*$!! NOOOOOO!", "\n   SAINT #@*$!! NOOOOOON!", "  #@*$!! NOOOOOO!", "\n VERDAMMTE #@*$!! NEEEEEEIIIIN!" },
 };
 
-static struct ComicBlock block_p4_5 = { &poly_p4_b5, -1, -1, block_p4_b5_boxes, 1 };
+static const struct ComicBlock block_p4_5 = { &poly_p4_b5, -1, -1, block_p4_b5_boxes, 1 };
 
-static struct Polygon poly_p4_b6 = { {
+static const struct Polygon poly_p4_b6 = { {
     { 322, 103 },
     { 583, 103 },
     { 583, 251 },
@@ -430,42 +430,42 @@ static struct Polygon poly_p4_b6 = { {
     { 321, 251 },
 } };
 
-static struct ComicBox block_p4_b6_boxes[] = {
+static const struct ComicBox block_p4_b6_boxes[] = {
     { 3, 244, 464, 108, "     I'M GOING TO EAT YOU\n        UP LITTLE BOY!", "     JE VAIS TE MANGER TOUT\n       CRU, PETIT HOMME!", "    TE DEVORARE,\n        MUCHACHITO!", "        KOMM, KLEINER, ICH\n   HAB' DICH ZUM FRESSEN GERN!" },
     { 4, 246, 256, 83, "    BE CAREFUL, WIDOWMARK,\nTHIS TIME YOU MAY BITE OFF MORE\n    THAN YOU CAN CHEW!", "     ATTENTION, WIDOWMARK,\n  CETTE FOIS-CI, VOUS RISQUEZ\n    D'AVOIR LES YEUX PLUS GROS\n       QUE LE VENTRE!", "    CUIDADO, VIUDA,\nESTE BOCADO TE PUEDE RESULTAR\n    INDIGESTO!", "     VORSICHT, WITWE, BEI\xe1""\n   NICHT MEHR AB, ALS DU AUCH\n         KAUEN KANNST!" },
 };
 
-static struct ComicBlock block_p4_6 = { &poly_p4_b6, -1, -1, block_p4_b6_boxes, 2 };
+static const struct ComicBlock block_p4_6 = { &poly_p4_b6, -1, -1, block_p4_b6_boxes, 2 };
 
-static struct Polygon poly_p4_b7 = { {
+static const struct Polygon poly_p4_b7 = { {
     { 321, 251 },
     { 457, 282 },
     { 457, 399 },
     { 321, 399 },
 } };
 
-static struct ComicBox block_p4_b7_boxes[] = {
+static const struct ComicBox block_p4_b7_boxes[] = {
     { 3, 244, 444, 243, "   HELP ME! OH MY G-MMMRPH....", "\n   A L'AIDE! OH MON D-MMMRPH...", "   AYUDADME! MI D-MMMRPH....", "\n   HILFE! OH MEIN G-MMMRPH..." },
 };
 
-static struct ComicBlock block_p4_7 = { &poly_p4_b7, 99, 58, block_p4_b7_boxes, 1 };
+static const struct ComicBlock block_p4_7 = { &poly_p4_b7, 99, 58, block_p4_b7_boxes, 1 };
 
-static struct Polygon poly_p4_b8 = { {
+static const struct Polygon poly_p4_b8 = { {
     { 457, 282 },
     { 583, 251 },
     { 583, 399 },
     { 457, 399 },
 } };
 
-static struct ComicBox block_p4_b8_boxes[] = {
+static const struct ComicBox block_p4_b8_boxes[] = {
     { 4, 244, 283, 260, "    DAMN... WRAPPED HER UP\nSLICK AS SNOT AND DISAPPEARED\n   FASTER 'N SANTY CLAUS!", "    ZUT... IL L'A EMBALLEE\nCOMME UNE MOMIE ET IL A DISPARU\n  PLUS VITE QUE LE PERE NOEL!", "   ESA HA BAJADO CON\nMAS VELOCIDAD QUE\n   PAPA NOEL!", "       VERDAMMT...WICKELT\n    SIE EIN WIE DER BLITZ UND\n VERSCHWINDET SCHNELLER ALS DER\n          WEIHNACHTSMANN!" },
     { 4, 244, 326, 284, "       IT WOULD SEEM THAT\n  WIDOWMARK GOT IN OVER HER\nHEAD. I'D NO IDEA HE COULD\n USE HIS CLOAK LIKE THAT....", "        IL ME SEMBLE QUE\n  WIDOWMARK S'EST FAIT AVOIR. JE\nNE SAVAIS PAS QU'IL POUVAIT UTILISER\n        SA CAPE COMME \x80""A....", "      PARECE QUE VIUDA\n  NEGRA HA PERDIDO LAS PATAS.\n NO SABIA QUE EL PODIA USAR\n SU CAPA DE ESA FORMA...", "\n         SCHEINT SO, ALS\n   STECKTE DIE WITWE BIS \x9a""BER BEIDE\nOHREN IN DER SACHE DRIN. ICH HATTE\n   JA KEINE AHNUNG, WAS ER MIT\n        SEINEM CAPE ALLES\n        ANSTELLEN KANN..." },
     { 4, 244, 326, 284, "      I GUESS WE OUGHTA GO\n   FIND 'EM... WE CAN COVER MORE\n GROUND IF WE SPLIT UP. WATCH\n     YOUR BACK, LADY.", "      JE CROIS QU'IL FAUT LES\n   RETROUVER. NOUS COUVRIRONS\n  PLUS DE TERRAIN SI NOUS NOUS\n    SEPARONS. FAITES ATTENTION A\n           VOUS, MADAME.", "     VAYAMOS A POR\n  EL. CUBRIREMOS MAS TERRENO\n SI NOS SEPARAMOS. CUIDA\n    TU ESPALDA.", "        SCH\x8e""TZE, WIR M\x9a""SSEN\n    IHN SUCHEN GEHEN. WIR HABEN\n  BESSERE CHANCEN, WENN WIR UNS\n     AUFTEILEN. HALT' DIR DEN\n        R\x9a""CKEN FREI, LADY..." },
 };
 
-static struct ComicBlock block_p4_8 = { &poly_p4_b8, -1, -1, block_p4_b8_boxes, 3 };
+static const struct ComicBlock block_p4_8 = { &poly_p4_b8, -1, -1, block_p4_b8_boxes, 3 };
 
-static struct ComicBlock page_4_blocks[] = {
+static const struct ComicBlock page_4_blocks[] = {
     block_p4_0,
     block_p4_1,
     block_p4_2,
@@ -479,7 +479,7 @@ static struct ComicBlock page_4_blocks[] = {
 
 static struct ComicPage page_4 = { "DARK/COMDATA/LEPG7_8.SCN", 98, 44, 0, 0, page_4_blocks, 9 };
 
-static struct Polygon poly_p5_b0 = { {
+static const struct Polygon poly_p5_b0 = { {
     { 168, 83 },
     { 184, 55 },
     { 185, 63 },
@@ -489,13 +489,13 @@ static struct Polygon poly_p5_b0 = { {
     { 192, 100 },
 } };
 
-static struct ComicBox block_p5_b0_boxes[] = {
+static const struct ComicBox block_p5_b0_boxes[] = {
     { 2, 246, 22, 70, "     QUIET WITCH, OR I'LL PULL\n  IT ALL OUT! I'M TAKING YOU DOWN,\nWIDOWMARK. IF YOU COOPERATE, I\n       MAY LET YOU LIVE.", "     DU CALME, SORCIERE, OU\n  JE VAIS M'ENERVER! JE SUIS LE\nPLUS FORT, WIDOWMARK. SI VOUS\n   COOPEREZ, JE VOUS LAISSERAI\n         PEUT-ETRE LA VIE SAUVE.", "    QUIETA, BRUJA, O TE HARE\n  CAER! TE TENGO,\nVIUDA NEGRA. SI COOPERAS,\n     QUIZAS VIVAS.", "        RUHE, ELENDE HEXE,\n  ODER ICH REI\xe1""E DIR JEDES DAVON\n EINZELN AUS! H\x99""R ZU, WITWE, WENN\n     DU MIR HILFST, LASSE ICH DICH\n         VIELLEICHT AM LEBEN!" },
 };
 
-static struct ComicBlock block_p5_0 = { &poly_p5_b0, -1, -1, block_p5_b0_boxes, 1 };
+static const struct ComicBlock block_p5_0 = { &poly_p5_b0, -1, -1, block_p5_b0_boxes, 1 };
 
-static struct Polygon poly_p5_b1 = { {
+static const struct Polygon poly_p5_b1 = { {
     { 59, 2 },
     { 322, 2 },
     { 322, 116 },
@@ -506,53 +506,53 @@ static struct Polygon poly_p5_b1 = { {
     { 59, 128 },
 } };
 
-static struct ComicBox block_p5_b1_boxes[] = {
+static const struct ComicBox block_p5_b1_boxes[] = {
     { 3, 244, 200, 30, "    OUCH! MY HAIR...!", "\n      AIE! MES CHEVEUX!", "    OH! MI PELO...!", "\n         AUA! MEINE HAARE...!" },
 };
 
-static struct ComicBlock block_p5_1 = { &poly_p5_b1, -1, -1, block_p5_b1_boxes, 1 };
+static const struct ComicBlock block_p5_1 = { &poly_p5_b1, -1, -1, block_p5_b1_boxes, 1 };
 
-static struct Polygon poly_p5_b2 = { {
+static const struct Polygon poly_p5_b2 = { {
     { 59, 128 },
     { 186, 128 },
     { 186, 194 },
     { 59, 194 },
 } };
 
-static struct ComicBox block_p5_b2_boxes[] = {
+static const struct ComicBox block_p5_b2_boxes[] = {
     { 7, 244, 215, 85, "      HAH, FOUND YA WEASEL!\n MUCH AS I'D LIKE TO SEE WHAT\nHE'D DO TA WIDOWMARK, NOW'S THE\n  PERFECT TIME TA CALL HIM OUT...", "      HAH, JE T'AI TROUVE,\n SALE PUTOIS! J'AIMERAIS BEAUCOUP\nVOIR CE QU'IL VA FAIRE A WIDOWMARK,\n  MAIS C'EST LE MOMENT PARFAIT...", "      ESTA ENTRETENIDO.\n AUNQUE ME GUSTARIA VER LO\nQUE LE HARA A VIUDA NEGRA, ES\n  EL MOMENTO PERFECTO...", "        HA, DA IST DIE RATTE!\n    SO GERNE ICH AUCH SEHEN\n  W\x9a""RDE, WAS ER MIT DER SCHWARZEN\n WITWE ANSTELLT, JETZT IST DIE RICHTIGE\n      ZEIT, DIE SACHE HINTER\n          UNS ZU BRINGEN..." },
 };
 
-static struct ComicBlock block_p5_2 = { &poly_p5_b2, -1, -1, block_p5_b2_boxes, 1 };
+static const struct ComicBlock block_p5_2 = { &poly_p5_b2, -1, -1, block_p5_b2_boxes, 1 };
 
-static struct Polygon poly_p5_b3 = { {
+static const struct Polygon poly_p5_b3 = { {
     { 186, 134 },
     { 235, 134 },
     { 235, 194 },
     { 186, 194 },
 } };
 
-static struct ComicBox block_p5_b3_boxes[] = {
+static const struct ComicBox block_p5_b3_boxes[] = {
     { 3, 244, 275, 80, "    LET THE LADY GO,\nDUNG-LICKER! YOU N' I GOT\n  BUSINESS TA TEND TO!", "    LAISSE PARTIR LA\nFEMME, LECHE-BOUSE! TOI ET MOI,\n  IL FAUT QU'ON DISCUTE!", "   QUE LA DAMA SE\nLAS ARREGLE COMO PUEDA. YO\n  TENGO ALGO QUE HACER.", "      LA\xe1"" DIE LADY GEHEN,\n  DUNGFRESSER! DU UND ICH, WIR\n    HABEN WAS ZU ERLEDIGEN!" },
 };
 
-static struct ComicBlock block_p5_3 = { &poly_p5_b3, -1, -1, block_p5_b3_boxes, 1 };
+static const struct ComicBlock block_p5_3 = { &poly_p5_b3, -1, -1, block_p5_b3_boxes, 1 };
 
-static struct Polygon poly_p5_b4 = { {
+static const struct Polygon poly_p5_b4 = { {
     { 230, 116 },
     { 322, 116 },
     { 322, 249 },
     { 230, 249 },
 } };
 
-static struct ComicBox block_p5_b4_boxes[] = {
+static const struct ComicBox block_p5_b4_boxes[] = {
     { 4, 246, 71, 96, "    WHA...? OOOOPH!", "\n       QU...? OOOOUPH!", "    QUE...? OOOOH!", "\n           WAS...? UFF!" },
     { 3, 244, 318, 113, "    I'M GOING TO NAIL YOU\nJUST LIKE THIS FOR EVERY STRAND\n      OF HAIR I LOST!", "    JE VAIS TE DONNER UN\nCOUP POUR CHAQUE CHEVEU QUE\n         J'AI PERDU!", "    TE HARE UNA HERIDA\nCOMO ESTA POR CADA CABELLO QUE\n      PERDI!", "    F\x9a""R JEDE EINZELNE LOCKE,\nDIE ICH VERLOREN HABE, ZAHLE ICH\n           ES DIR HEIM!" },
 };
 
-static struct ComicBlock block_p5_4 = { &poly_p5_b4, 99, 25, block_p5_b4_boxes, 2 };
+static const struct ComicBlock block_p5_4 = { &poly_p5_b4, 99, 25, block_p5_b4_boxes, 2 };
 
-static struct Polygon poly_p5_b5 = { {
+static const struct Polygon poly_p5_b5 = { {
     { 59, 194 },
     { 92, 199 },
     { 111, 221 },
@@ -562,117 +562,117 @@ static struct Polygon poly_p5_b5 = { {
     { 59, 268 },
 } };
 
-static struct ComicBox block_p5_b5_boxes[] = {
+static const struct ComicBox block_p5_b5_boxes[] = {
     { 3, 246, 145, 190, "    GETTING AWAY! WIDOWMARK'S\n  GETTING AWAY....", "       ELLE S'ENFUIT!\n     WIDOWMARK S'ENFUIT...", "    ADIOS, VIUDA NEGRA!", "         SIE ENTKOMMT!\n     DIE SCHWARZE WITWE\n         ENTKOMMT MIR!" },
 };
 
-static struct ComicBlock block_p5_5 = { &poly_p5_b5, -1, -1, block_p5_b5_boxes, 1 };
+static const struct ComicBlock block_p5_5 = { &poly_p5_b5, -1, -1, block_p5_b5_boxes, 1 };
 
-static struct Polygon poly_p5_b6 = { {
+static const struct Polygon poly_p5_b6 = { {
     { 98, 258 },
     { 181, 257 },
     { 138, 398 },
 } };
 
-static struct ComicBox block_p5_b6_boxes[] = {
+static const struct ComicBox block_p5_b6_boxes[] = {
     { 3, 244, 198, 273, "    TIME TO DIE, RATMEAT!\n       MAKE YER MOVE!", "      TON HEURE EST VENUE,\n  RAT PUANT! A TOI DE JOUER!", "  ES HORA DE MORIR, RATA!\n      DEFIENDETE!", "       ZEIT ZUM STERBEN,\nRATTENGESICHT! MACH DEINEN ZUG!" },
 };
 
-static struct ComicBlock block_p5_6 = { &poly_p5_b6, -1, -1, block_p5_b6_boxes, 1 };
+static const struct ComicBlock block_p5_6 = { &poly_p5_b6, -1, -1, block_p5_b6_boxes, 1 };
 
-static struct Polygon poly_p5_b7 = { {
+static const struct Polygon poly_p5_b7 = { {
     { 59, 194 },
     { 230, 194 },
     { 230, 268 },
     { 59, 268 },
 } };
 
-static struct ComicBox block_p5_b7_boxes[] = {
+static const struct ComicBox block_p5_b7_boxes[] = {
     { 5, 246, 220, 247, "  ...LET HER GO...CONCENTRATE!\nDON'T GIVE DESPERADO THE TIME HE\n           NEEDS.", "    ... LA LAISSER PARTIR...\n  SE CONCENTRER! NE PAS LAISSER\n     A DESPERADO LE TEMPS DONT\n         IL A BESOIN.", "  ...AHORA DEBO\nCONCENTRARME Y NO DARLE TIEMPO\n  A DESESPERADO.", "      ... LA\xe1"" SIE GEHEN... \n  KONZENTRIER' DICH! DU DARFST\n SHOWDOWN NICHT DIE ZEIT GEBEN,\n         DIE ER BRAUCHT." },
 };
 
-static struct ComicBlock block_p5_7 = { &poly_p5_b7, -1, -1, block_p5_b7_boxes, 1 };
+static const struct ComicBlock block_p5_7 = { &poly_p5_b7, -1, -1, block_p5_b7_boxes, 1 };
 
-static struct Polygon poly_p5_b8 = { {
+static const struct Polygon poly_p5_b8 = { {
     { 323, 0 },
     { 478, 0 },
     { 503, 97 },
     { 323, 97 },
 } };
 
-static struct ComicBox block_p5_b8_boxes[] = {
+static const struct ComicBox block_p5_b8_boxes[] = {
     { 6, 246, 174, 66, "    I'M HIT! NEVER MIND -\nKEEP FOCUSED! THE GRENADE HAS\n    GOT TO HIT CLOSE....", "    JE SUIS TOUCHE! RESTER\nCONCENTRE! LA GRENADE DOIT\n    TOMBER ASSEZ PRES... ", "   ESTOY HERIDO! PERO NO\nIMPORTA. LA GRANADA GOLPEARA\n    Y...", "    ICH BIN GETROFFEN...EGAL,\nKONZENTRATION! DIE GRANATE MU\xe1""\n   DICHT NEBEN IHM TREFFEN..." },
 };
 
-static struct ComicBlock block_p5_8 = { &poly_p5_b8, 99, 13, block_p5_b8_boxes, 1 };
+static const struct ComicBlock block_p5_8 = { &poly_p5_b8, 99, 13, block_p5_b8_boxes, 1 };
 
-static struct Polygon poly_p5_b9 = { {
+static const struct Polygon poly_p5_b9 = { {
     { 478, 0 },
     { 588, 0 },
     { 588, 97 },
     { 503, 97 },
 } };
 
-static struct ComicBox block_p5_b9_boxes[] = {
+static const struct ComicBox block_p5_b9_boxes[] = {
     { 6, 246, 356, 52, "    DAMN, HURTS LIKE THE\nMOTHER OF ALL PAIN! LET IT BLEED.", "         AIE, \x80""A FAIT\n      TRES MAL! JE SAIGNE.", "   MALDITA SEA, COMO\nDUELE! NO DEBO PENSAR EN ESO.", "    VERDAMMT, DAS SCHMERZT\n  WIE VERR\x9a""CKT. EGAL, LA\xe1"" ES\n          BLUTEN..." },
 };
 
-static struct ComicBlock block_p5_9 = { &poly_p5_b9, -1, -1, block_p5_b9_boxes, 1 };
+static const struct ComicBlock block_p5_9 = { &poly_p5_b9, -1, -1, block_p5_b9_boxes, 1 };
 
-static struct Polygon poly_p5_b10 = { {
+static const struct Polygon poly_p5_b10 = { {
     { 323, 97 },
     { 453, 97 },
     { 453, 206 },
     { 323, 206 },
 } };
 
-static struct ComicBox block_p5_b10_boxes[] = {
+static const struct ComicBox block_p5_b10_boxes[] = {
     { 8, 244, 156, 69, "     OH, $%#@! I'M BLIND AS A\n  FRIGGIN' BAT! WHAT THE HELL'S HE\n      PUT IN THOSE DAMNED\n          GRENADES?!", "     OH, $%#@! JE SUIS AUSSI\n  AVEUGLE QU'UNE TAUPE! MAIS\n  QU'EST-CE QU'IL PEUT BIEN METTRE\n    DANS CES MAUDITES GRENADES?", "    $%#@! ESTOY CIEGO\n  COMO UNA RATA! QUE DEMONIOS\n      PUSO EN ESA\n          GRANADA?!", "       OH, $%#@! ICH BIN\n    BLIND WIE 'NE VERFLUCHTE\n  FLEDERMAUS! WAS ZUR H\x99""LLE HAT\n     ER IN DIESE VERDAMMTEN\n        GRANATEN GEPACKT?" },
 };
 
-static struct ComicBlock block_p5_10 = { &poly_p5_b10, 99, 10, block_p5_b10_boxes, 1 };
+static const struct ComicBlock block_p5_10 = { &poly_p5_b10, 99, 10, block_p5_b10_boxes, 1 };
 
-static struct Polygon poly_p5_b11 = { {
+static const struct Polygon poly_p5_b11 = { {
     { 453, 97 },
     { 588, 97 },
     { 588, 143 },
     { 454, 143 },
 } };
 
-static struct ComicBox block_p5_b11_boxes[] = {
+static const struct ComicBox block_p5_b11_boxes[] = {
     { 6, 244, 303, 150, "    CAN'T LET HIM CIRCLE\n       'ROUND ON ME!", "    JE NE PEUX PAS LE\nLAISSER TOURNER AUTOUR DE MOI!", "   NO DEBO DEJAR QUE ME\n       SORPRENDA!", "      ICH DARF IHN NICHT IN\n     MEINEN R\x9a""CKEN LASSEN!" },
     { 2, 244, 303, 155, "      YER TRICKS DON'T MAKE\n NO DIFFERENCE! SO COME 'N GET\nME YA FREAKIN' DEVIL, 'CAUSE\n   I'M GONNA BLOW YA TO HELL!", "         VOS RUSES NE\n   M'IMPRESSIONNENT PAS! ALORS\nVENEZ ME CHERCHER, SALE DEMON,\n     JE VAIS VOUS RENVOYER\n           EN ENFER!", "    TUS TRUCOS NO TE SERVIRAN\n DE NADA! VEN A DONDE PUEDA\nVERTE PARA VOLARTE LA CABEZA", "      DEINE TRICKS HELFEN DIR\n AUCH NICHT! LOS, KOMM DOCH HER\nUND HOL' MICH, DU TEUFEL, DAMIT ICH\n   DICH ZUR H\x99""LLE PUSTEN KANN!" },
 };
 
-static struct ComicBlock block_p5_11 = { &poly_p5_b11, -1, -1, block_p5_b11_boxes, 2 };
+static const struct ComicBlock block_p5_11 = { &poly_p5_b11, -1, -1, block_p5_b11_boxes, 2 };
 
-static struct Polygon poly_p5_b12 = { {
+static const struct Polygon poly_p5_b12 = { {
     { 401, 206 },
     { 504, 206 },
     { 481, 296 },
     { 427, 296 },
 } };
 
-static struct ComicBox block_p5_b12_boxes[] = {
+static const struct ComicBox block_p5_b12_boxes[] = {
     { 8, 246, 242, 207, "    HE'S COMPLETELY\nDISORIENTED. FIRING BLIND...NOW.\n   TAKE HIM OUT NOW!", "    IL EST COMPLETEMENT\nDESORIENTE. IL TIRE AU HASARD...JE\n VAIS M'EN OCCUPER, MAINTENANT!", "  ESTA DESORIENTADO\nY DISPARA A CIEGAS. ESTA ES MI\n   OPORTUNIDAD!", "       ER HAT V\x99""LLIG DIE\n    ORIENTIERUNG VERLOREN,\n   FEUERT BLINDLINGS DRAUFLOS.\n      JETZT...SCHALTE IHN\n            JETZT AUS!" },
 };
 
-static struct ComicBlock block_p5_12 = { &poly_p5_b12, -1, -1, block_p5_b12_boxes, 1 };
+static const struct ComicBlock block_p5_12 = { &poly_p5_b12, -1, -1, block_p5_b12_boxes, 1 };
 
-static struct Polygon poly_p5_b13 = { {
+static const struct Polygon poly_p5_b13 = { {
     { 504, 206 },
     { 588, 206 },
     { 588, 320 },
     { 481, 296 },
 } };
 
-static struct ComicBox block_p5_b13_boxes[] = {
+static const struct ComicBox block_p5_b13_boxes[] = {
     { 4, 244, 325, 179, "    WHERE THE HELL ARE\nYOU NIGHTBREED? WHEN I FIND YOU,\n    I'M GONNA - UNNNGH!!!", "     OU DIABLE ETES-VOUS\n DONC, SUPPOT DE LA NUIT? SI JE\n    VOUS ATTRAPE, JE VAIS--\n           UNNNGH!!!", "    DONDE ESTAS, DEMONIO?\nCUANDO TE ENCUENTRE TE... UNNNGH!!!", "    WO ZUR H\x99""LLE STECKST\nDU NACHTBRUT? WENN ICH DICH FINDE,\n    WERDE ICH DI---UMMMPF!!!" },
 };
 
-static struct ComicBlock block_p5_13 = { &poly_p5_b13, -1, -1, block_p5_b13_boxes, 1 };
+static const struct ComicBlock block_p5_13 = { &poly_p5_b13, -1, -1, block_p5_b13_boxes, 1 };
 
-static struct ComicBlock page_5_blocks[] = {
+static const struct ComicBlock page_5_blocks[] = {
     block_p5_0,
     block_p5_1,
     block_p5_2,
@@ -691,46 +691,46 @@ static struct ComicBlock page_5_blocks[] = {
 
 static struct ComicPage page_5 = { "DARK/COMDATA/LEPG9_10.SCN", 98, 45, 0, 0, page_5_blocks, 14 };
 
-static struct Polygon poly_p6_b0 = { {
+static const struct Polygon poly_p6_b0 = { {
     { 255, 0 },
     { 324, 0 },
     { 324, 83 },
     { 269, 83 },
 } };
 
-static struct ComicBox block_p6_b0_boxes[] = {
+static const struct ComicBox block_p6_b0_boxes[] = {
     { 5, 246, 335, 59, "    ...AND THEN THERE WERE TWO.", "\n     ... ET ILS FURENT DEUX.", "    ...Y SOLO QUEDARON DOS.", "\n  ... DA WAREN'S NUR NOCH ZWEI..." },
 };
 
-static struct ComicBlock block_p6_0 = { &poly_p6_b0, -1, -1, block_p6_b0_boxes, 1 };
+static const struct ComicBlock block_p6_0 = { &poly_p6_b0, -1, -1, block_p6_b0_boxes, 1 };
 
-static struct Polygon poly_p6_b1 = { {
+static const struct Polygon poly_p6_b1 = { {
     { 192, 83 },
     { 324, 83 },
     { 324, 199 },
     { 192, 199 },
 } };
 
-static struct ComicBox block_p6_b1_boxes[] = {
+static const struct ComicBox block_p6_b1_boxes[] = {
     { 8, 246, 5, 39, "    TOUGH LUCK, GUNSLINGER,\n   CAN'T SAY I'LL MISS YOU.", "    PAS DE CHANCE, MAIS JE NE\n  PENSE PAS QUE TU ME MANQUES\n          A L'AVENIR.", "  MALA SUERTE, PISTOLERO,\n NO TE ECHARE DE MENOS.", "    TJA, PECH, REVOLVERHELD,\n ABER ICH KANN NICHT BEHAUPTEN,\n  DA\xe1"" ICH DICH VERMISSEN WERDE." },
 };
 
-static struct ComicBlock block_p6_1 = { &poly_p6_b1, -1, -1, block_p6_b1_boxes, 1 };
+static const struct ComicBlock block_p6_1 = { &poly_p6_b1, -1, -1, block_p6_b1_boxes, 1 };
 
-static struct Polygon poly_p6_b2 = { {
+static const struct Polygon poly_p6_b2 = { {
     { 74, 185 },
     { 156, 185 },
     { 156, 243 },
     { 73, 243 },
 } };
 
-static struct ComicBox block_p6_b2_boxes[] = {
+static const struct ComicBox block_p6_b2_boxes[] = {
     { 1, 246, 160, 250, "    WIDOWMARK!", "\n         WIDOWMARK!", "  VIUDA NEGRA!", "\r         SCHWARZE WITWE!" },
 };
 
-static struct ComicBlock block_p6_2 = { &poly_p6_b2, -1, -1, block_p6_b2_boxes, 1 };
+static const struct ComicBlock block_p6_2 = { &poly_p6_b2, -1, -1, block_p6_b2_boxes, 1 };
 
-static struct Polygon poly_p6_b3 = { {
+static const struct Polygon poly_p6_b3 = { {
     { 199, 278 },
     { 225, 253 },
     { 265, 246 },
@@ -741,13 +741,13 @@ static struct Polygon poly_p6_b3 = { {
     { 208, 300 },
 } };
 
-static struct ComicBox block_p6_b3_boxes[] = {
+static const struct ComicBox block_p6_b3_boxes[] = {
     { 8, 244, 52, 216, "    ...PAY! HE'S GOING TO\n  PAY BIG! WITH HIS HEART, AND HIS\n BLOOD, AND HIS FEAR... OH, HIS\n   FEAR! HE'S GOING TO PAY....", "     ...PAYER! IL VA PAYER\n  TRES CHER! AVEC SON COEUR, ET\n SON SANG, ET SA PEUR... OH, SA\n          PEUR! IL VA PAYER....", "    ...LO PAGARAS, CERDO!\n  PAGARAS CON TU CORAZON, TU\n SANGRE Y TU ANGUSTIA... OH, SU\n  ANGUSTIA! EL PAGARA...", "    ...BEZAHLEN! UND WIE ER\n  BEZAHLEN WIRD DAF\x9a""R! MIT SEINEM\nHERZEN, SEINEM BLUT, SEINER ANGST...\n   OH JA, SEINER PANISCHEN ANGST.\n     ER WIRD DAF\x9a""R BEZAHLEN..." },
 };
 
-static struct ComicBlock block_p6_3 = { &poly_p6_b3, -1, -1, block_p6_b3_boxes, 1 };
+static const struct ComicBlock block_p6_3 = { &poly_p6_b3, -1, -1, block_p6_b3_boxes, 1 };
 
-static struct Polygon poly_p6_b4 = { {
+static const struct Polygon poly_p6_b4 = { {
     { 60, 300 },
     { 283, 300 },
     { 276, 316 },
@@ -756,27 +756,27 @@ static struct Polygon poly_p6_b4 = { {
     { 60, 399 },
 } };
 
-static struct ComicBox block_p6_b4_boxes[] = {
+static const struct ComicBox block_p6_b4_boxes[] = {
     { 3, 244, 175, 290, "    DESPERADO...?!", "\n        DESPERADO...?!", "    DESESPERADO...?!", "\n         SHOWDOWN...?!" },
 };
 
-static struct ComicBlock block_p6_4 = { &poly_p6_b4, -1, -1, block_p6_b4_boxes, 1 };
+static const struct ComicBlock block_p6_4 = { &poly_p6_b4, -1, -1, block_p6_b4_boxes, 1 };
 
-static struct Polygon poly_p6_b5 = { {
+static const struct Polygon poly_p6_b5 = { {
     { 216, 316 },
     { 324, 316 },
     { 324, 399 },
     { 251, 399 },
 } };
 
-static struct ComicBox block_p6_b5_boxes[] = {
+static const struct ComicBox block_p6_b5_boxes[] = {
     { 3, 246, 250, 338, "    HE GOT WHAT HE DESERVED.", "\n   IL A EU CE QU'IL MERITAIT...", "   TUVO LO QUE MERECIA.", "         ER HAT BEKOMMEN,\n       WAS ER VERDIENT HAT." },
     { 4, 244, 52, 295, "    YOU...!", "\n          VOUS...!", "    TU...!", "\n                 DU...!" },
 };
 
-static struct ComicBlock block_p6_5 = { &poly_p6_b5, -1, -1, block_p6_b5_boxes, 2 };
+static const struct ComicBlock block_p6_5 = { &poly_p6_b5, -1, -1, block_p6_b5_boxes, 2 };
 
-static struct Polygon poly_p6_b6 = { {
+static const struct Polygon poly_p6_b6 = { {
     { 324, 0 },
     { 586, 0 },
     { 586, 99 },
@@ -787,13 +787,13 @@ static struct Polygon poly_p6_b6 = { {
     { 347, 52 },
 } };
 
-static struct ComicBox block_p6_b6_boxes[] = {
+static const struct ComicBox block_p6_b6_boxes[] = {
     { 2, 244, 242, 69, "    I DON'T KNOW HOW YOU\nREACHED THE TOP BEFORE ME, BUT\n  I'M NOT IMPRESSED.", "    JE NE SAIS PAS COMMENT\n VOUS AVEZ PU ARRIVER ICI AVANT\n    MOI, MAIS JE NE SUIS\n     PAS IMPRESSIONNEE.", "   NO SE COMO LLEGASTE\nAQUI ANTES QUE YO, PERO NO ME\n  IMPRESIONAS.", "       ICH WEI\xe1"" ZWAR NICHT,\n  WIE DU VOR MIR RAUFGEKOMMEN\n     BIST, ABER ES BEEINDRUCKT\n           MICH NICHT." },
 };
 
-static struct ComicBlock block_p6_6 = { &poly_p6_b6, -1, -1, block_p6_b6_boxes, 1 };
+static const struct ComicBlock block_p6_6 = { &poly_p6_b6, -1, -1, block_p6_b6_boxes, 1 };
 
-static struct Polygon poly_p6_b7 = { {
+static const struct Polygon poly_p6_b7 = { {
     { 324, 0 },
     { 347, 52 },
     { 362, 34 },
@@ -806,13 +806,13 @@ static struct Polygon poly_p6_b7 = { {
     { 324, 245 },
 } };
 
-static struct ComicBox block_p6_b7_boxes[] = {
+static const struct ComicBox block_p6_b7_boxes[] = {
     { 2, 246, 132, 71, "        I'M SURPRISED YOU\n    HAVEN'T LEARNED THAT THE\n TAPESTRY OF NIGHT IS WOVEN WITH\nSURPRISES, WIDOWMARK. BUT, IF YOU\n  UNDERESTIMATE IT, THE DARKNESS\n    WILL SWALLOW YOU WHOLE.", "       JE SUIS SURPRIS DE\n    VOIR QUE VOUS NE SAVEZ PAS\n QUE LA TAPISSERIE DE LA NUIT EST\nTISSEE DE SURPRISES, WIDOWMARK. SI\n VOUS LA SOUS-ESTIMEZ, LA NUIT VOUS\n     ENGLOUTIRA TOUTE ENTIERE.", "    ES CURIOSO QUE AUN\n  NO SEPAS QUE LA NOCHE ESTA\n LLENA DE SORPRESAS, VIUDA NEGRA.\n  SI SUBESTIMAS A LAS TINIEBLAS,\n    PEOR PARA TI.", "          ICH BIN ERSTAUNT,\n     DA\xe1"" DU IMMER NOCH NICHT\n GELERNT HAST, DA\xe1"" DER STOFF DER\nNACHT AUS \x9a""BERRASCHUNGEN GEWOBEN\n  WIRD, SCHWARZE WITWE. ABER WENN\n    DU DIE FINSTERNIS UNTERSCH\x8e""TZT,\n      WIRD SIE DICH VERSCHLINGEN." },
 };
 
-static struct ComicBlock block_p6_7 = { &poly_p6_b7, -1, -1, block_p6_b7_boxes, 1 };
+static const struct ComicBlock block_p6_7 = { &poly_p6_b7, -1, -1, block_p6_b7_boxes, 1 };
 
-static struct Polygon poly_p6_b8 = { {
+static const struct Polygon poly_p6_b8 = { {
     { 389, 86 },
     { 433, 99 },
     { 586, 99 },
@@ -821,14 +821,14 @@ static struct Polygon poly_p6_b8 = { {
     { 405, 124 },
 } };
 
-static struct ComicBox block_p6_b8_boxes[] = {
+static const struct ComicBox block_p6_b8_boxes[] = {
     { 2, 244, 242, 138, "    VERY POETIC!", "\n       TRES POETIQUE!", "    MUY POETICO!", "\n   WIE AUSGESPROCHEN POETISCH!" },
     { 4, 246, 337, 55, "    I'M GLAD YOU LIKE IT,\n  BUT IT'S NOT POETRY, IT'S A\n   FUNDAMENTAL MAXIM THAT-", "      SI VOUS AIMEZ, TANT\n   MIEUX, MAIS CE N'EST PAS DE\n  LA POESIE, C'EST UNE MAXIME\n       FONDAMENTALE QUI --", "   ME ALEGRA QUE TE GUSTE,\n  PERO NO ES POESIA. ES UNA\n  REGLA BASICA QUE-", "       SCH\x99""N, DA\xe1"" ES DIR\n   GEF\x8e""LLT, ABER ES IST KEINE\n POESIE. ES IST EINE FUNDAMENTALE\n          MAXIME, DIE..." },
 };
 
-static struct ComicBlock block_p6_8 = { &poly_p6_b8, -1, -1, block_p6_b8_boxes, 2 };
+static const struct ComicBlock block_p6_8 = { &poly_p6_b8, -1, -1, block_p6_b8_boxes, 2 };
 
-static struct Polygon poly_p6_b9 = { {
+static const struct Polygon poly_p6_b9 = { {
     { 402, 150 },
     { 586, 150 },
     { 586, 245 },
@@ -836,13 +836,13 @@ static struct Polygon poly_p6_b9 = { {
     { 418, 197 },
 } };
 
-static struct ComicBox block_p6_b9_boxes[] = {
+static const struct ComicBox block_p6_b9_boxes[] = {
     { 6, 244, 261, 201, "       I DON'T GIVE A RAT'S ASS\n   ABOUT YOUR MAXIMS! I LIVE BY MY\n OWN RULES AND I'VE WAITED A LONG\nTIME FOR YOUR HEAD. I NEVER EAT\n   THE HEAD, YOU KNOW? I KEEP IT\n        IN A SAFE PLACE....", "             JE ME FOUS\n   COMPLETEMENT DE VOS MAXIMES!\n JE VIS SELON MES PROPRES REGLES,\n  ET J'ATTENDS VOTRE TETE DEPUIS\n LONGTEMPS. JE NE MANGE JAMAIS LES\n  TETES, VOUS SAVEZ... JE LES GARDE\n         DANS UN ENDROIT SUR...", "    ME IMPORTAN POCO TUS\n  REGLAS! YO TENGO LAS MIAS Y HE\n ESPERADO MUCHO POR TU CABEZA.\n  NUNCA LAS COMO, SABES? LAS\n   GUARDO EN LUGAR SEGURO...", "           ICH GEBE KEINEN\n   RATTENFURZ AUF DEINE MAXIMEN!\n ICH LEBE NACH MEINEN EIGENEN REGELN,\nUND ICH HABE SCHON VIEL ZU LANGE AUF\n  DEINEN KOPF GEWARTET. ICH ESSE DEN\n   KOPF NIEMALS AUF, WEI\xe1""T DU. DEN \n    BEWAHRE ICH AN EINEM\n         EHRENPLATZ AUF..." },
 };
 
-static struct ComicBlock block_p6_9 = { &poly_p6_b9, -1, -1, block_p6_b9_boxes, 1 };
+static const struct ComicBlock block_p6_9 = { &poly_p6_b9, -1, -1, block_p6_b9_boxes, 1 };
 
-static struct Polygon poly_p6_b10 = { {
+static const struct Polygon poly_p6_b10 = { {
     { 324, 245 },
     { 586, 245 },
     { 586, 290 },
@@ -850,13 +850,13 @@ static struct Polygon poly_p6_b10 = { {
     { 324, 399 },
 } };
 
-static struct ComicBox block_p6_b10_boxes[] = {
+static const struct ComicBox block_p6_b10_boxes[] = {
     { 2, 244, 176, 303, "    IT'S PAYBACK TIME!", "\n    IL EST TEMPS DE PAYER!", "  LA HORA HA LLEGADO!", "\n             ZAHLTAG!" },
 };
 
-static struct ComicBlock block_p6_10 = { &poly_p6_b10, -1, -1, block_p6_b10_boxes, 1 };
+static const struct ComicBlock block_p6_10 = { &poly_p6_b10, -1, -1, block_p6_b10_boxes, 1 };
 
-static struct ComicBlock page_6_blocks[] = {
+static const struct ComicBlock page_6_blocks[] = {
     block_p6_0,
     block_p6_1,
     block_p6_2,
@@ -872,7 +872,7 @@ static struct ComicBlock page_6_blocks[] = {
 
 static struct ComicPage page_6 = { "DARK/COMDATA/LEPG1112.SCN", 98, 46, 0, 0, page_6_blocks, 11 };
 
-static struct Polygon poly_p7_b0 = { {
+static const struct Polygon poly_p7_b0 = { {
     { 112, 50 },
     { 206, 50 },
     { 164, 91 },
@@ -881,13 +881,13 @@ static struct Polygon poly_p7_b0 = { {
     { 158, 92 },
 } };
 
-static struct ComicBox block_p7_b0_boxes[] = {
+static const struct ComicBox block_p7_b0_boxes[] = {
     { 7, 244, 220, 49, "     SUCKER!", "\n             SALAUD !", "  CHUPA ESTA!", "\n           PENNER!" },
 };
 
-static struct ComicBlock block_p7_0 = { &poly_p7_b0, 99, 104, block_p7_b0_boxes, 1 };
+static const struct ComicBlock block_p7_0 = { &poly_p7_b0, 99, 104, block_p7_b0_boxes, 1 };
 
-static struct Polygon poly_p7_b1 = { {
+static const struct Polygon poly_p7_b1 = { {
     { 175, 102 },
     { 254, 102 },
     { 186, 208 },
@@ -895,13 +895,13 @@ static struct Polygon poly_p7_b1 = { {
     { 216, 136 },
 } };
 
-static struct ComicBox block_p7_b1_boxes[] = {
+static const struct ComicBox block_p7_b1_boxes[] = {
     { 7, 246, 254, 107, "     DAMN HER....", "\n          MAUDITE SOIT...!", "     MALDITA...", "\n        DIESE VERDAMMTE...!" },
 };
 
-static struct ComicBlock block_p7_1 = { &poly_p7_b1, -1, -1, block_p7_b1_boxes, 1 };
+static const struct ComicBlock block_p7_1 = { &poly_p7_b1, -1, -1, block_p7_b1_boxes, 1 };
 
-static struct Polygon poly_p7_b2 = { {
+static const struct Polygon poly_p7_b2 = { {
     { 59, 119 },
     { 129, 119 },
     { 161, 168 },
@@ -909,39 +909,39 @@ static struct Polygon poly_p7_b2 = { {
     { 59, 268 },
 } };
 
-static struct ComicBox block_p7_b2_boxes[] = {
+static const struct ComicBox block_p7_b2_boxes[] = {
     { 5, 246, 171, 205, "     VENOM!!!", "\n           DU VENIN!!!", "    VENENO!!!", "\n             GIFT!!!" },
 };
 
-static struct ComicBlock block_p7_2 = { &poly_p7_b2, 99, 126, block_p7_b2_boxes, 1 };
+static const struct ComicBlock block_p7_2 = { &poly_p7_b2, 99, 126, block_p7_b2_boxes, 1 };
 
-static struct Polygon poly_p7_b3 = { {
+static const struct Polygon poly_p7_b3 = { {
     { 161, 190 },
     { 322, 190 },
     { 322, 282 },
     { 161, 281 },
 } };
 
-static struct ComicBox block_p7_b3_boxes[] = {
+static const struct ComicBox block_p7_b3_boxes[] = {
     { 7, 244, 323, 172, "   ...GAINING! THE BASTARD'S\n   GAINING ON ME!", "     ...IL ME RATTRAPE! CE\n      CHIEN ME RATTRAPE!", "   ...ME PILLO! EL BASTARDO\n  ME HA PILLADO!", "    ...FERTIG! DIESER BASTARD\n  MACHT MICH WIRKLICH FERTIG!" },
 };
 
-static struct ComicBlock block_p7_3 = { &poly_p7_b3, -1, -1, block_p7_b3_boxes, 1 };
+static const struct ComicBlock block_p7_3 = { &poly_p7_b3, -1, -1, block_p7_b3_boxes, 1 };
 
-static struct Polygon poly_p7_b4 = { {
+static const struct Polygon poly_p7_b4 = { {
     { 323, 0 },
     { 487, 0 },
     { 464, 168 },
     { 322, 157 },
 } };
 
-static struct ComicBox block_p7_b4_boxes[] = {
+static const struct ComicBox block_p7_b4_boxes[] = {
     { 2, 246, 176, 48, "      I TOLD YOU TO BEHAVE!\n  EITHER SETTLE DOWN NOW, OR\n YOU CAN JOIN DESPERADO ON THE\n       BODY BAG EXPRESS!", "\n      JE VOUS AI DIT DE VOUS\n  TENIR TRANQUILLE! SOIT VOUS\n VOUS CALMEZ TOUT DE SUITE, SOIT\n VOUS ALLEZ REJOINDRE DESPERADO\n       AU RAYON DES CHERS\n            DISPARUS!", "    TE LO DIJE!\n  RINDETE O IRAS A UNIRTE A\n DESESPERADO EN EL EXPRESO AL\n       INFIERNO!", "      ICH HABE DIR GESAGT,\n  DU SOLLST DICH BENEHMEN! H\x99""R\n    JETZT AUF, ODER DU KANNST\n    SHOWDOWN IM LEICHENSACK\n         GESELLSCHAFT LEISTEN!" },
 };
 
-static struct ComicBlock block_p7_4 = { &poly_p7_b4, -1, -1, block_p7_b4_boxes, 1 };
+static const struct ComicBlock block_p7_4 = { &poly_p7_b4, -1, -1, block_p7_b4_boxes, 1 };
 
-static struct Polygon poly_p7_b5 = { {
+static const struct Polygon poly_p7_b5 = { {
     { 428, 193 },
     { 464, 168 },
     { 522, 157 },
@@ -951,13 +951,13 @@ static struct Polygon poly_p7_b5 = { {
     { 431, 230 },
 } };
 
-static struct ComicBox block_p7_b5_boxes[] = {
+static const struct ComicBox block_p7_b5_boxes[] = {
     { 4, 244, 319, 99, "    WAIT...!", "\n         ATTENDEZ...!", "  ESPERA...!", "\n            WARTE...!" },
 };
 
-static struct ComicBlock block_p7_5 = { &poly_p7_b5, -1, -1, block_p7_b5_boxes, 1 };
+static const struct ComicBlock block_p7_5 = { &poly_p7_b5, -1, -1, block_p7_b5_boxes, 1 };
 
-static struct Polygon poly_p7_b6 = { {
+static const struct Polygon poly_p7_b6 = { {
     { 322, 157 },
     { 464, 168 },
     { 428, 193 },
@@ -966,26 +966,26 @@ static struct Polygon poly_p7_b6 = { {
     { 322, 249 },
 } };
 
-static struct ComicBox block_p7_b6_boxes[] = {
+static const struct ComicBox block_p7_b6_boxes[] = {
     { 1, 246, 433, 251, "    AHHHH! THAT'S IT WITCH,\nTIME TO PUNCH YOUR TICKET...\n  ALL ABOARD!", "       AHHHH! C'EST \x80""A,\n    SORCIERE, IL EST TEMPS...\n           ALLONS-Y!", "  BIEN! TOMA TU BOLETO \nAL INFIERNO. TODOS A\n  BORDO!", "     NA GUT, ALTE HEXE, DAS\n   WAR'S! ZEIT ZUM EINT\x9a""TEN!" },
 };
 
-static struct ComicBlock block_p7_6 = { &poly_p7_b6, -1, -1, block_p7_b6_boxes, 1 };
+static const struct ComicBlock block_p7_6 = { &poly_p7_b6, -1, -1, block_p7_b6_boxes, 1 };
 
-static struct Polygon poly_p7_b7 = { {
+static const struct Polygon poly_p7_b7 = { {
     { 530, 258 },
     { 586, 240 },
     { 586, 399 },
     { 530, 399 },
 } };
 
-static struct ComicBox block_p7_b7_boxes[] = {
+static const struct ComicBox block_p7_b7_boxes[] = {
     { 8, 246, 330, 290, "   AND THEN THERE WAS ONE...", "\n  ET IL N'EN RESTA PLUS QU'UNE...", "   Y SOLO UNO QUEDO...", "\n   ...DA WAR ES NUR NOCH EINER...." },
 };
 
-static struct ComicBlock block_p7_7 = { &poly_p7_b7, -1, -1, block_p7_b7_boxes, 1 };
+static const struct ComicBlock block_p7_7 = { &poly_p7_b7, -1, -1, block_p7_b7_boxes, 1 };
 
-static struct ComicBlock page_7_blocks[] = {
+static const struct ComicBlock page_7_blocks[] = {
     block_p7_0,
     block_p7_1,
     block_p7_2,
@@ -998,7 +998,7 @@ static struct ComicBlock page_7_blocks[] = {
 
 static struct ComicPage page_7 = { "DARK/COMDATA/LEPG1314.SCN", 98, 47, 0, 0, page_7_blocks, 8 };
 
-static struct Polygon poly_p8_b0 = { {
+static const struct Polygon poly_p8_b0 = { {
     { 59, 0 },
     { 324, 0 },
     { 324, 45 },
@@ -1008,13 +1008,13 @@ static struct Polygon poly_p8_b0 = { {
     { 59, 124 },
 } };
 
-static struct ComicBox block_p8_b0_boxes[] = {
+static const struct ComicBox block_p8_b0_boxes[] = {
     { 5, 246, 218, 54, "   ...SO WEAK. IT'S THE VENOM...\n NOT SURE I CAN MAKE IT. STOP IT!\nSTAY ALERT!  I'M TWO DOWN WITH\n    ONE TO GO... WONDER WHERE\n           SHE IS...", "\n   ...SI FAIBLE. C'EST LE VENIN...\n JE NE SAIS PAS SI JE TIENDRAI LE\nCOUP. STOP! RESTER EVEILLE! JE\nSUIS AU BOUT DU ROULEAU... JE ME\n    DEMANDE OU ELLE PEUT\n          BIEN ETRE....", "   ...ESTOY DEBIL. ES EL VENENO...\n NO SE SI PODRE. BASTA!\nESTATE ALERTA! AUN TE QUEDA\n    UNA... DONDE\n           ESTARA?", "\n   ...SO SCHWACH. DAS IST DAS\n GIFT...WEI\xe1"" NICHT, OB ICH ES SCHAFFE.\nH\x99""R AUF! BLEIB WACH! ZWEI SIND SCHON\n  ABGEFR\x9a""HST\x9a""CKT, EINE IST NOCH AUF\n   DER WARTELISTE! ICH FRAGE\n      MICH, WO SIE STECKT..." },
 };
 
-static struct ComicBlock block_p8_0 = { &poly_p8_b0, -1, -1, block_p8_b0_boxes, 1 };
+static const struct ComicBlock block_p8_0 = { &poly_p8_b0, -1, -1, block_p8_b0_boxes, 1 };
 
-static struct Polygon poly_p8_b1 = { {
+static const struct Polygon poly_p8_b1 = { {
     { 324, 45 },
     { 278, 49 },
     { 214, 80 },
@@ -1022,67 +1022,67 @@ static struct Polygon poly_p8_b1 = { {
     { 324, 149 },
 } };
 
-static struct ComicBox block_p8_b1_boxes[] = {
+static const struct ComicBox block_p8_b1_boxes[] = {
     { 3, 244, 252, 74, "    HELLO HANDSOME, BUY A\n       GIRL A DRINK?", "     SALUT, BEAU GOSSE, TU\n      M'OFFRES UN VERRE?", "    HOLA, HERMOSO. ME\n     PAGAS UNA COPA?", "    HALLO, H\x9a""BSCHER. L\x8e""DST\n  DU MICH ZU 'NEM DRINK EIN?" },
     { 1, 246, 354, 151, "    TOPHAT...!", "\n          TOPHAT...!", "    DIVA...", "\n          ZYLINDERCHEN..!" },
 };
 
-static struct ComicBlock block_p8_1 = { &poly_p8_b1, -1, -1, block_p8_b1_boxes, 2 };
+static const struct ComicBlock block_p8_1 = { &poly_p8_b1, -1, -1, block_p8_b1_boxes, 2 };
 
-static struct Polygon poly_p8_b2 = { {
+static const struct Polygon poly_p8_b2 = { {
     { 129, 215 },
     { 245, 216 },
     { 245, 315 },
     { 129, 315 },
 } };
 
-static struct ComicBox block_p8_b2_boxes[] = {
+static const struct ComicBox block_p8_b2_boxes[] = {
     { 3, 244, 255, 199, "      YOU MAY BE DARKNESS\n INCARNATE, DEARY, BUT YOU BLEED\n   JUST LIKE ANY MISERABLE\n            STOOGE.", "      VOUS ETES PEUT-ETRE\n L'INCARNATION DES TENEBRES, TRES\n CHER, MAIS VOUS SAIGNEZ COMME\n     LE PREMIER CRETIN VENU!", "     SERAS LA ENCARNACION\n DE LA NOCHE, PERO TU SANGRE ES\n  ROJA COMO LA DE CUALQUIER\n            IDIOTA.", "        DU MAGST JA DIE\n   VERK\x99""RPERTE DUNKELHEIT SEIN,\n  SCHATZI, ABER DU BLUTEST GENAU\n    WIE JEDES ARME SCHWEIN." },
 };
 
-static struct ComicBlock block_p8_2 = { &poly_p8_b2, -1, -1, block_p8_b2_boxes, 1 };
+static const struct ComicBlock block_p8_2 = { &poly_p8_b2, -1, -1, block_p8_b2_boxes, 1 };
 
-static struct Polygon poly_p8_b3 = { {
+static const struct Polygon poly_p8_b3 = { {
     { 59, 124 },
     { 324, 149 },
     { 324, 209 },
     { 59, 232 },
 } };
 
-static struct ComicBox block_p8_b3_boxes[] = {
+static const struct ComicBox block_p8_b3_boxes[] = {
     { 1, 244, 195, 174, "    CORRECT! YOU WIN THE\n     PRIZE, BABY FACE!", "    EXACT! TU AS GAGNE LE\n  GROS LOT, GUEULE D'AMOUR!", "    EXACTO! HAS GANADO\n   EL PRECIO, NENE!", "    STIMMT! DER KANDIDAT HAT\n HUNDERT PUNKTE, MILCHGESICHT!" },
 };
 
-static struct ComicBlock block_p8_3 = { &poly_p8_b3, 99, 27, block_p8_b3_boxes, 1 };
+static const struct ComicBlock block_p8_3 = { &poly_p8_b3, 99, 27, block_p8_b3_boxes, 1 };
 
-static struct Polygon poly_p8_b4 = { {
+static const struct Polygon poly_p8_b4 = { {
     { 60, 303 },
     { 181, 303 },
     { 181, 399 },
     { 59, 399 },
 } };
 
-static struct ComicBox block_p8_b4_boxes[] = {
+static const struct ComicBox block_p8_b4_boxes[] = {
     { 3, 244, 196, 298, "        I WATCHED YOU TAKE\n   OUT DESPERADO AND WIDOWMARK...\n    YOU WERE MARVY! BUT I CAN'T\n  IMAGINE WHY YOU'RE WORKING SO\n  HARD TO REMOVE THE COMPETITION.\n       WE NEED EACH OTHER...", "        JE VOUS AI OBSERVE\n     PENDANT QUE VOUS VOUS\n    OCCUPIEZ DE DESPERADO ET DE\n      WIDOWMARK... VOUS ETIEZ\n           MERVEILLEUX!", "    FUISTE MUY HABIL PARA\n  MATAR A DESESPERADO Y VIUDA\n  NEGRA. PERO NO CONTASTE CON\n  MI ASTUCIA.\n   RECUERDA QUE SOMOS UNO...", "        ICH HABE ZUGESCHAUT,\n     WIE DU SHOWDOWN UND DIESE\n SPINNE AUSGESCHALTET HAST...DU BIST\n SUPERSUPERSUPER, BABIIIEE! ABER ICH\n  WEI\xe1"" GAR NICHT, WARUM DU DICH SO\n     ANSTRENGST MIT MIR. WIR\n     BRAUCHEN EINANDER DOCH..." },
     { 3, 244, 196, 298, nullptr, "\n      MAIS JE NE COMPRENDS\n   PAS POURQUOI VOUS FAITES\n  TOUS CES EFFORTS POUR VOUS\n DEBARRASSER DE VOS ADVERSAIRES.\n   NOUS AVONS BESOIN DE CETTE\n           RIVALITE...", nullptr, nullptr },
 };
 
-static struct ComicBlock block_p8_4 = { &poly_p8_b4, -1, -1, block_p8_b4_boxes, 2 };
+static const struct ComicBlock block_p8_4 = { &poly_p8_b4, -1, -1, block_p8_b4_boxes, 2 };
 
-static struct Polygon poly_p8_b5 = { {
+static const struct Polygon poly_p8_b5 = { {
     { 191, 305 },
     { 324, 305 },
     { 324, 399 },
     { 191, 399 },
 } };
 
-static struct ComicBox block_p8_b5_boxes[] = {
+static const struct ComicBox block_p8_b5_boxes[] = {
     { 4, 244, 12, 285, "     ...LIKE DIFFERENT SIDES\n  OF THE SAME COIN, SWEET CHEEKS,\n WE DEFINE OUR OPPOSITE! MMMMM,\n   YUMMY... TASTES JUST LIKE\n            CHICKEN!", "    ... COMME LES DEUX COTES\n  D'UNE PIECE, NOUS DEFINISSONS\n NOTRE CONTRAIRE! MMMMM, MIAM...\n       ON DIRAIT DU POULET!", "     ...COMO LAS DOS CARAS\n  DE UNA MONEDA. SOMOS LOS\n OPUESTOS QUE NO PUEDEN VIVIR\n  EL UNO SIN EL OTRO...", "     ...WIE DIE BEIDEN SEITEN\n  DERSELBEN M\x9a""NZE, KNUDDELB\x8e""R.\n OHNE DEN ANDEREN G\x8e""BE ES KEINEN\n   VON UNS. HMMMM, LECKER...\n        SCHMECKT WIE H\x9a""HNCHEN!" },
 };
 
-static struct ComicBlock block_p8_5 = { &poly_p8_b5, -1, -1, block_p8_b5_boxes, 1 };
+static const struct ComicBlock block_p8_5 = { &poly_p8_b5, -1, -1, block_p8_b5_boxes, 1 };
 
-static struct Polygon poly_p8_b6 = { {
+static const struct Polygon poly_p8_b6 = { {
     { 324, 0 },
     { 562, 0 },
     { 524, 30 },
@@ -1090,13 +1090,13 @@ static struct Polygon poly_p8_b6 = { {
     { 322, 102 },
 } };
 
-static struct ComicBox block_p8_b6_boxes[] = {
+static const struct ComicBox block_p8_b6_boxes[] = {
     { 6, 246, 200, 83, "    STAY CONSCIOUS... JUST\n       STAY AWAKE...!", "      RESTER CONSCIENT...\n       RESTER EVEILLE...!", "   MANTENTE DESPIERTO...\n    NO TE DUERMAS...!", "     BLEIB' BEI BEWU\xe1""TSEIN....\n      BLEIB' BLO\xe1"" WACH...!" },
 };
 
-static struct ComicBlock block_p8_6 = { &poly_p8_b6, -1, -1, block_p8_b6_boxes, 1 };
+static const struct ComicBlock block_p8_6 = { &poly_p8_b6, -1, -1, block_p8_b6_boxes, 1 };
 
-static struct Polygon poly_p8_b7 = { {
+static const struct Polygon poly_p8_b7 = { {
     { 562, 0 },
     { 524, 30 },
     { 523, 102 },
@@ -1104,13 +1104,13 @@ static struct Polygon poly_p8_b7 = { {
     { 589, 135 },
 } };
 
-static struct ComicBox block_p8_b7_boxes[] = {
+static const struct ComicBox block_p8_b7_boxes[] = {
     { 2, 244, 340, 81, "    NOW FOR SOME REAL FUN!", "          ON VA ENFIN\n       POUVOIR S'AMUSER!", "   AHORA NOS DIVERTIREMOS!", "        UND JETZT ZU ETWAS\n         RICHTIG SPA\xe1""IGEM!" },
 };
 
-static struct ComicBlock block_p8_7 = { &poly_p8_b7, -1, -1, block_p8_b7_boxes, 1 };
+static const struct ComicBlock block_p8_7 = { &poly_p8_b7, -1, -1, block_p8_b7_boxes, 1 };
 
-static struct Polygon poly_p8_b8 = { {
+static const struct Polygon poly_p8_b8 = { {
     { 324, 102 },
     { 523, 102 },
     { 558, 131 },
@@ -1119,39 +1119,39 @@ static struct Polygon poly_p8_b8 = { {
     { 324, 260 },
 } };
 
-static struct ComicBox block_p8_b8_boxes[] = {
+static const struct ComicBox block_p8_b8_boxes[] = {
     { 4, 244, 227, 82, "     YEE-HAW, RIDE'M COWBOY!\n  I REALLY DON'T THINK YOU'RE\n INTO THIS, DEAR...I WONDER IF\nIT WOULD HELP IF I SHOVED ANOTHER\n      COIN IN YOUR SLOT!", "\n     YIPPY, ALLEZ GO! JE CROIS\n   VRAIMENT QUE VOUS N'AVEZ PAS\n  LA TETE A CE QUE VOUS FAITES,\n MON CHER! JE ME DEMANDE SI VOUS\n   N'AURIEZ PAS BESOIN D'UN\n        PETIT COUP DE MAIN!", "    VENGA, VAQUERO!\n  VEAMOS SI SABES JUGAR A\n ESTO... BAILARAS MEJOR SI\nPONGO OTRA MONEDA EN LA\n      MAQUINA?", "             JUHUUH, LOS,\n         REITE SIE ZU, COWBOY!\n  IRGENDWIE SCHEINT DIR DAS NICHT SO\n RICHTIG ZU GEFALLEN, SCHATZ. OB\nES WOHL HELFEN W\x9a""RDE, WENN ICH\n NOCH EINE WEITERE M\x9a""NZE IN DEINEN\n     SCHLITZ EINWERFE?" },
 };
 
-static struct ComicBlock block_p8_8 = { &poly_p8_b8, -1, -1, block_p8_b8_boxes, 1 };
+static const struct ComicBlock block_p8_8 = { &poly_p8_b8, -1, -1, block_p8_b8_boxes, 1 };
 
-static struct Polygon poly_p8_b9 = { {
+static const struct Polygon poly_p8_b9 = { {
     { 324, 260 },
     { 461, 260 },
     { 461, 399 },
     { 324, 399 },
 } };
 
-static struct ComicBox block_p8_b9_boxes[] = {
+static const struct ComicBox block_p8_b9_boxes[] = {
     { 4, 244, 181, 258, "    AND TO THINK YOU WANTED\nTO STAY IN TONIGHT! OH, YOU\n         SILLY BOY!", "      ET DIRE QUE VOUS NE\n  PENSIEZ PAS SORTIR CE SOIR!\n        PAUVRE IMBECILE!", "  Y PENSAR QUE IBAS A\nQUEDARTE EN CASA HOY,\n    CHICO TONTO!", "    NA BITTE, UND DU WOLLTEST\nHEUTE ABEND ZU HAUSE BLEIBEN!\n         DUMMERLE....!" },
 };
 
-static struct ComicBlock block_p8_9 = { &poly_p8_b9, -1, -1, block_p8_b9_boxes, 1 };
+static const struct ComicBlock block_p8_9 = { &poly_p8_b9, -1, -1, block_p8_b9_boxes, 1 };
 
-static struct Polygon poly_p8_b10 = { {
+static const struct Polygon poly_p8_b10 = { {
     { 461, 260 },
     { 589, 260 },
     { 589, 399 },
     { 461, 399 },
 } };
 
-static struct ComicBox block_p8_b10_boxes[] = {
+static const struct ComicBox block_p8_b10_boxes[] = {
     { 4, 244, 314, 253, "      WELL I'M SURE WE COULD\n  HAVE MORE FUN, BUT IT IS A\nSCHOOL NIGHT...SO, I'LL JUST\n       MURDER YOU NOW!!", "      JE SUIS SURE QUE NOUS\n  POURRIONS NOUS AMUSER ENCORE\nPLUS, MAIS C'EST UNE NUIT SPECIALE...\n     ALORS JE VAIS VOUS TUER!", "   ME GUSTARIA DIVERTIRME\n  UN POCO MAS, PERO DEBO IRME,\n ASI QUE TE MATARE YA!", "\n        NAJA, ALSO ICH SCH\x8e""TZE,\n    WIR K\x99""NNTEN NOCH MEHR SPA\xe1""\n  MITEINANDER HABEN, ABER ICH MU\xe1""\n    ZEITIG HEIM. ALSO WERDE ICH\n      DICH JETZT EINFACH\n       KURZ UMBRINGEN!!" },
 };
 
-static struct ComicBlock block_p8_10 = { &poly_p8_b10, -1, -1, block_p8_b10_boxes, 1 };
+static const struct ComicBlock block_p8_10 = { &poly_p8_b10, -1, -1, block_p8_b10_boxes, 1 };
 
-static struct ComicBlock page_8_blocks[] = {
+static const struct ComicBlock page_8_blocks[] = {
     block_p8_0,
     block_p8_1,
     block_p8_2,
@@ -1167,7 +1167,7 @@ static struct ComicBlock page_8_blocks[] = {
 
 static struct ComicPage page_8 = { "DARK/COMDATA/LEPG1516.SCN", 98, 48, 1, 0, page_8_blocks, 11 };
 
-static struct Polygon poly_p9_b0 = { {
+static const struct Polygon poly_p9_b0 = { {
     { 187, 0 },
     { 306, 0 },
     { 334, 35 },
@@ -1176,13 +1176,13 @@ static struct Polygon poly_p9_b0 = { {
     { 187, 83 },
 } };
 
-static struct ComicBox block_p9_b0_boxes[] = {
+static const struct ComicBox block_p9_b0_boxes[] = {
     { 2, 255, 75, 40, "    BACK OFF, TOPHAT!", "\n        RECULE, TOPHAT!", "    ATRAS, DIVA!", "\n      ZUR\x9a""CK, ZYLINDERLADY!" },
 };
 
-static struct ComicBlock block_p9_0 = { &poly_p9_b0, 99, 25, block_p9_b0_boxes, 1 };
+static const struct ComicBlock block_p9_0 = { &poly_p9_b0, 99, 25, block_p9_b0_boxes, 1 };
 
-static struct Polygon poly_p9_b1 = { {
+static const struct Polygon poly_p9_b1 = { {
     { 187, 83 },
     { 247, 95 },
     { 308, 102 },
@@ -1193,15 +1193,15 @@ static struct Polygon poly_p9_b1 = { {
     { 187, 399 },
 } };
 
-static struct ComicBox block_p9_b1_boxes[] = {
+static const struct ComicBox block_p9_b1_boxes[] = {
     { 2, 255, 10, 150, "        TOPHAT'S OUT FOR THE\n   COUNT. I FOUND DESPERADO AND I\n ASSUME THAT MOUND OF HAIR AND\nBLOOD IS WHAT'S LEFT OF WIDOWMARK.\n YOU SURE AS HELL WERE THOROUGH...\n         ARE YOU O.K.?", "\n        TOPHAT EST ELIMINEE.\n   J'AI TROUVE DESPERADO ET JE\nSUPPOSE QU'IL NE RESTE DE WIDOWMARK\nQUE CES TAS DE CHEVEUX COUVERTS DE\n     SANG. TU AS FAIT DU BEAU\n         TRAVAIL... \x80""A VA?", "      LA DIVA ESTA FUERA DE\n   COMBATE. VI A DESESPERADO Y\n SUPONGO QUE AQUELLOS RESTOS\n ES LO QUE QUEDA DE VIUDA NEGRA.\n PARECE QUE TE HAS DIVERTIDO...\n        ESTAS BIEN?", "        MISS ZYLINDERCHEN IST\n   AUSGEZ\x8e""HLT. ICH HABE SHOWDOWN\n   GEFUNDEN, UND ICH VERMUTE MAL,\n  DIESER HAUFEN BLUTIGER HAARE IST\n   ALLES, WAS VON DER SCHWARZEN\n   WITWE \x9a""BRIGGEBLIEBEN IST." },
     { 2, 255, 10, 150, nullptr, nullptr, nullptr, "      ALSO DU ARBEITEST\n    SCHON VERDAMMT GR\x9a""NDLICH.\n       HE, BIST DU OK?" },
     { 4, 246, 44, 208, "    I'M FINE! YOU'VE GOT A\nLOT OF NERVE, STILETTO, BUTTING\n  IN WHERE YOU DON'T BELONG!", "\n    JE VAIS TRES BIEN! TU AS\nDU CRAN, STILETTO D'INTERVENIR DANS\n   DES AFFAIRES QUI NE TE\n        REGARDENT PAS!", "   PERFECTAMENTE! NO SE\n POR QUE TE METES DONDE NO TE\n LLAMAN, STILETTO!", "\n    MIR GEHT'S GUT. DU HAST\nVIELLEICHT NERVEN, STILETTO, HIER\n  EINFACH REINZUPLATZEN, WO DU\n    GAR NICHTS VERLOREN HAST!" },
 };
 
-static struct ComicBlock block_p9_1 = { &poly_p9_b1, -1, -1, block_p9_b1_boxes, 3 };
+static const struct ComicBlock block_p9_1 = { &poly_p9_b1, -1, -1, block_p9_b1_boxes, 3 };
 
-static struct Polygon poly_p9_b2 = { {
+static const struct Polygon poly_p9_b2 = { {
     { 278, 153 },
     { 309, 102 },
     { 451, 102 },
@@ -1210,40 +1210,40 @@ static struct Polygon poly_p9_b2 = { {
     { 289, 230 },
 } };
 
-static struct ComicBox block_p9_b2_boxes[] = {
+static const struct ComicBox block_p9_b2_boxes[] = {
     { 1, 255, 443, 168, "        I'M YOUR PARTNER! I\n   DON'T KNOW WHAT YOUR PROBLEM\n IS LATELY. YOU'RE OBVIOUSLY ON\nSOME EGO TRIP, TAKING OUT ALL THE\n BUTTHEADS SINGLE-HANDEDLY, BUT IF\n  I HADN'T SHOWN, TOPHAT WOULD'VE\n    FINISHED YOU OFF, HERO!", "       JE SUIS TA PARTENAIRE!\n   JE NE SAIS PAS QUEL EST TON\n     PROBLEME DEPUIS QUELQUE\n              TEMPS.", "        SOMOS SOCIOS! NO\n   SE QUE TE PASA ULTIMAMENTE.\n TE HAS VUELTO EGOISTA, NO CUENTAS\n CONMIGO PARA NADA... PERO DE NO\n SER POR MI, LA DIVA TE HUBIERA\n    MATADO, HEROE!", "       ICH BIN DEINE PARTNERIN!\n    ICH WEI\xe1"" NICHT, WAS IN LETZTER\n        ZEIT MIT DIR LOS IST!" },
     { 1, 255, 443, 168, nullptr, "\n     TU ES APPAREMMENT DANS\n  UN TRIP SOLITAIRE, TU ESSAYES\n  D'ELIMINER TOUS LES MALFRATS\n  DE LA VILLE D'UNE SEULE MAIN.\n   MAIS SANS MON INTERVENTION,\n     TOPHAT T'AURAIT REGLE TON\n           COMPTE, HEROS! ", nullptr, "           DU BIST WOHL AUF\n       EINEM EGO-TRIP, DA\xe1"" DU\n   ALLE MISTBACKEN GANZ ALLEINE\n AUSSCHALTEN WILLST, ABER WENN ICH\n    NICHT AUFGETAUCHT W\x8e""RE, H\x8e""TTE\n        MISS ZYLINDERCHEN DICH\n          HELDEN ABSERVIERT!" },
 };
 
-static struct ComicBlock block_p9_2 = { &poly_p9_b2, -1, -1, block_p9_b2_boxes, 2 };
+static const struct ComicBlock block_p9_2 = { &poly_p9_b2, -1, -1, block_p9_b2_boxes, 2 };
 
-static struct Polygon poly_p9_b3 = { {
+static const struct Polygon poly_p9_b3 = { {
     { 319, 261 },
     { 353, 277 },
     { 329, 399 },
     { 255, 399 },
 } };
 
-static struct ComicBox block_p9_b3_boxes[] = {
+static const struct ComicBox block_p9_b3_boxes[] = {
     { 3, 246, 384, 308, "      YOU ARE FULL OF CRAP,\n  GIRL! I HAD EVERYTHING UNDER\nCONTROL...JUST DROP IT BECAUSE THIS\n     DISCUSSION IS OVER!", "      TU NE RACONTES QUE DES\n  CONNERIES, FEMME. JE CONTROLAIS\nPARFAITEMENT LA SITUATION... LAISSE\n  TOMBER, DE TOUTE MANIERE, CETTE\n      DISCUSSION EST TERMINEE!", "  TE DAS MUCHA IMPORTANCIA,\n MUCHACHITA! TODO ESTABA BAJO\n CONTROL... LARGATE YA! NO HAY\n NADA DE QUE HABLAR!", "          DU ERZ\x8e""HLST NUR\n  BL\x99""DSINN, STILETTO! ICH HATTE\nALLES WUNDERBAR UNTER KONTROLLE...\n  VERGI\xe1"" ES, DIE DISKUSSION IST\n             GELAUFEN!" },
 };
 
-static struct ComicBlock block_p9_3 = { &poly_p9_b3, -1, -1, block_p9_b3_boxes, 1 };
+static const struct ComicBlock block_p9_3 = { &poly_p9_b3, -1, -1, block_p9_b3_boxes, 1 };
 
-static struct Polygon poly_p9_b4 = { {
+static const struct Polygon poly_p9_b4 = { {
     { 353, 277 },
     { 451, 251 },
     { 451, 399 },
     { 329, 399 },
 } };
 
-static struct ComicBox block_p9_b4_boxes[] = {
+static const struct ComicBox block_p9_b4_boxes[] = {
     { 4, 246, 198, 243, "      TAKE TOPHAT TO THE\n  POLICE, AND DON'T FORGET\nABOUT THE OTHER BODIES. I'M\n    GOING TO SHADOWLAIR.", "      EMMENE TOPHAT A LA\n  POLICE, ET N'OUBLIE PAS LES\n  AUTRES CADAVRES. JE VAIS A\n       L'ANTRE D'OMBRE.", "   LLEVA A LA DIVA A LA\n  POLICIA Y NO OLVIDES LOS\n DOS CADAVERES. YO VOY A\n LA CUEVA SOMBRIA.", "     BRING ZYLINDERCHEN ZUR\n  POLIZEI, UND VERGI\xe1"" DIE ANDEREN\nLEICHEN NICHT. ICH GEHE ZUM\n    SCHATTENHORT ZUR\x9a""CK." },
 };
 
-static struct ComicBlock block_p9_4 = { &poly_p9_b4, -1, -1, block_p9_b4_boxes, 1 };
+static const struct ComicBlock block_p9_4 = { &poly_p9_b4, -1, -1, block_p9_b4_boxes, 1 };
 
-static struct ComicBlock page_9_blocks[] = {
+static const struct ComicBlock page_9_blocks[] = {
     block_p9_0,
     block_p9_1,
     block_p9_2,
@@ -1253,48 +1253,48 @@ static struct ComicBlock page_9_blocks[] = {
 
 static struct ComicPage page_9 = { "DARK/COMDATA/LEPG17.SCN", 98, 49, 1, 0, page_9_blocks, 5 };
 
-static struct Polygon poly_p10_b0 = { {
+static const struct Polygon poly_p10_b0 = { {
     { 59, 0 },
     { 228, 0 },
     { 222, 115 },
     { 59, 115 },
 } };
 
-static struct ComicBox block_p10_b0_boxes[] = {
+static const struct ComicBox block_p10_b0_boxes[] = {
     { 0, 246, 69, 103, "SHADOWLAIR. LOCATED DEEP UNDERGROUND, THE REFORMED\nTEMPLE IS A REMNANT OF AN ERA PASSED. ONCE THE\nHALLOWED SHRINE OF AN ELITE SECRET ORDER OF\nINTELLIGENTSIA, THE TEMPLE NOW SERVES A SINGLE MAN\nAS THE BASTION OF MIDNIGHT... THE REFUGE OF SHADOW...\nTHE SANCTUARY OF DARKSHEER.", "L'ANTRE D'OMBRE.  ENFOUI DANS LES PROFONDEURS DE\nLA VILLE, LE TEMPLE REFORME TEMOIGNE DES SPLENDEURS\nDU PASSE. AUTREFOIS UTILISE COMME SANCTUAIRE POUR UN\nORDRE SECRET, LE TEMPLE NE SERT PLUS AUJOURD'HUI QU'A\nUN SEUL HOMME, QUI S'EN SERT DE BASTION NOCTURNE...\nLE REFUGE DE L'OMBRE... LE SANCTUAIRE DE DARKSHEER.", "LA CUEVA SOMBRIA. REFUGIO SUBTERRANEO HECHO A\nPARTIR DE UN TEMPLO ANTIGUO. LO QUE UNA VEZ FUE\nLA ELITE DE UNA ORDEN SECRETA DE ESTUDIOSOS,\nAHORA ES EL HOGAR DE UN SOLO HOMBRE, EL AMO DE\nLA NOCHE... EL SANTUARIO DE TENEBROSO.", "DER SCHATTENHORT. DER UNTERIRDISCHE EHEMALIGE\nTEMPEL IST DAS \x9a""BERBLEIBSEL EINER LANGE\nVERGANGENEN \x8e""RA. EINST DIENTE ER ALS HEILIGER\nSCHREIN EINES GEHEIMBUNDES DER GEISTIGEN ELITE.\nHEUTE DIENT ER NUR EINEM EINZIGEN MANN ALS BASTION\nDER MITTERNACHT...ALS HORT DER FINSTERNIS...\nALS ZUFLUCHT VON DARKSHEER." },
     { 5, 246, 177, 102, "        LIQUIDARK... SO COLD IT\n    BURNS! IT'S ALWAYS LIKE THAT\n WHEN I'M INJURED. HOW MANY TIMES\nHAVE I DONE THIS? BAPTIZED IN THE\nICY WETNESS OF DISTILLED DARKNESS...\n      IT WORKS EVERY TIME...\n         SAVES MY SKIN.", "        LE LIQUIDARK... IL EST SI\n    FROID QU'IL BRULE! C'EST COMME\n \x80""A QUAND JE SUIS BLESSE, EN TOUT\nCAS. COMMENT AI-JE REUSSI? BAPTISE\nDANS L'HUMIDITE GLACIALE DES TENEBRES\n  DISTILLEES... IL FONCTIONNE TOUT\n       LE TEMPS... ET ME SAUVE\n                LA VIE.", "        LIQUIOSCURO... TAN FRIO\n    QUE QUEMA! SIEMPRE PASA CUANDO\n ESTOY HERIDO. CUANTAS VECES HE\nHECHO ESTO? ES MI BAUTISMO EN LA\nHELADA HUMEDAD DE LAS TINIEBLAS...\n   SIEMPRE FUNCIONA...\n   SIEMPRE ME SALVA.", "         DUSTER\x99""L... SO KALT,\n      DA\xe1"" ES BRENNT. SO IST ES\n  IMMER, WENN ICH VERLETZT BIN. WIE\n  OFT HABE ICH DAS SCHON GETAN?\n GETAUFT IN DER EISIGEN FEUCHTIGKEIT\n   DESTILLIERTER DUNKELHEIT...\n         FUNKTIONIERT JEDESMAL...\n              RETTET MICH." },
 };
 
-static struct ComicBlock block_p10_0 = { &poly_p10_b0, -1, -1, block_p10_b0_boxes, 2 };
+static const struct ComicBlock block_p10_0 = { &poly_p10_b0, -1, -1, block_p10_b0_boxes, 2 };
 
-static struct Polygon poly_p10_b1 = { {
+static const struct Polygon poly_p10_b1 = { {
     { 59, 115 },
     { 222, 115 },
     { 230, 286 },
     { 59, 286 },
 } };
 
-static struct ComicBox block_p10_b1_boxes[] = {
+static const struct ComicBox block_p10_b1_boxes[] = {
     { 7, 246, 153, 252, "        REMEMBERING... HOW IT\n   ALL STARTED. I WAS JUST A PUNK\n ORPHAN. FATHER DESMOND... WHAT A\nSALESMAN! HE HAD US ALL JUMPING TO\n BECOME WARDS... TO HELP CLEAN UP\n   THE STREETS OF NOCTROPOLIS.\n     BIRTH OF A VIGILANTE...", "          JE ME SOUVIENS...\n    COMMENT TOUT A COMMENCE.\n J'ETAIS ORPHELIN. LE PERE DESMOND...\nQUEL VENDEUR! NOUS VOULIONS TOUS\nDEVENIR DES PUPILLES... POUR L'AIDER\n     A NETTOYER LES RUES DE\n     NOCTROPOLIS. LA NAISSANCE\n          D'UN VIGILE....", "        RECUERDO COMO EMPEZO\n  TODO. YO ERA UN PILLUELO DE LAS\n CALLES. EL PADRE DESMOND... QUE\n TIO! NOS TENIA A TODOS SALTANDO\n PARA CONVERTIRNOS EN GUARDIANES Y\n   LIMPIAR LAS CALLES.\n     ASI ME HICE VIGILANTE...", "     ERINNERUNGEN...WIE ALLES\n     BEGANN. ICH WAR NUR EIN\n     STREUNENDER WAISENKNABE." },
     { 7, 246, 153, 252, nullptr, nullptr, nullptr, "          VATER DESMOND...\n   WAS F\x9a""R EIN VERK\x8e""UFER! BRACHTE\n  UNS ALLE DAZU, NICHTS SEHNLICHER\n     ZU WOLLEN, ALS DER WEHR\nANZUGEH\x99""REN... DIE STRA\xe1""EN AUFR\x8e""UMEN.\n       GEBURT EINER B\x9a""RGERWEHR..." },
 };
 
-static struct ComicBlock block_p10_1 = { &poly_p10_b1, -1, -1, block_p10_b1_boxes, 2 };
+static const struct ComicBlock block_p10_1 = { &poly_p10_b1, -1, -1, block_p10_b1_boxes, 2 };
 
-static struct Polygon poly_p10_b2 = { {
+static const struct Polygon poly_p10_b2 = { {
     { 193, 286 },
     { 326, 286 },
     { 326, 399 },
     { 226, 399 },
 } };
 
-static struct ComicBox block_p10_b2_boxes[] = {
+static const struct ComicBox block_p10_b2_boxes[] = {
     { 7, 246, 196, 276, "         YEARS LATER, POKING\n  AROUND: SUBTERRAINIA... STUMBLED\nACROSS THE BROTHERHOOD'S TEMPLE.\nMAN, I DIDN'T KNOW WHAT I'D FOUND!\n       ...TOOK IT SLOW...\n        WORKED IN SECRET...", "         DES ANNEES PLUS TARD,\n  EN EXPLORANT SUBTERRAINIA... J'AI\n RETROUVE PAR HASARD LE TEMPLE DE\nLA CONFRERIE. MAIS JE NE SAVAIS PAS\n CE QUE JE VENAIS DE DECOUVRIR! IL\n    M'A FALLU LONGTEMPS... J'AI\n     TRAVAILLE DANS LE PLUS\n             GRAND SECRET....", "    Y LUEGO DESCUBRI A\n  SUBTERRAINIA Y A ESTE\n TEMPLO OLVIDADO.\n AUN NO SABIA LO QUE HABIA\n   HALLADO! PERO \n   TRABAJE EN SECRETO...", "        JAHRE SP\x8e""TER, ALS ICH\n   IN SUBTERRAINIA HERUMST\x99""BERTE...\n  STOLPERTE \x9a""BER DEN TEMPEL DER\n  BRUDERSCHAFT. MANN, ICH WU\xe1""TE\n     JA NICHT MAL, WAS ICH\n      DA GEFUNDEN HATTE! LIE\xe1""\n       MIR ZEIT...ARBEITETE\n           IM GEHEIMEN..." },
 };
 
-static struct ComicBlock block_p10_2 = { &poly_p10_b2, -1, -1, block_p10_b2_boxes, 1 };
+static const struct ComicBlock block_p10_2 = { &poly_p10_b2, -1, -1, block_p10_b2_boxes, 1 };
 
-static struct Polygon poly_p10_b3 = { {
+static const struct Polygon poly_p10_b3 = { {
     { 326, 0 },
     { 491, 0 },
     { 491, 93 },
@@ -1305,13 +1305,13 @@ static struct Polygon poly_p10_b3 = { {
     { 326, 93 },
 } };
 
-static struct ComicBox block_p10_b3_boxes[] = {
+static const struct ComicBox block_p10_b3_boxes[] = {
     { 6, 246, 195, 85, "        I'VE PROBABLY READ IT A\n   THOUSAND TIMES... THE BIG BOOK...\n     MY BIBLE AND BLUEPRINT: A\n    COMPENDIUM OF KNOWLEDGE AND\n   THEOREMS AS RESEARCHED BY THE\n      BROTHERHOOD OF THE NIGHT.", "\n        J'AI PROBABLEMENT DU LE\n    LIRE UN MILLIER DE FOIS... LE\n   GRAND LIVRE... MA BIBLE... UN\n CONCENTRE DE CONNAISSANCE ET DE\n   THEOREMES TEL QUE LE DICTE\n       LA CONFRERIE DE LA NUIT.", "        LEI EL LIBRO MAS DE\n   MIL VECES... FUE MI BIBLIA...\n     CONTENIA TODOS LOS \n   DESCUBRIMIENTOS DE LA \n     HERMANDAD DE LA NOCHE.", "           ICH MU\xe1"" ES SCHON\n    HUNDERTMAL GELESEN HABEN...\n  DAS GROSSE BUCH... MEINE BIBEL UND\n GEBRAUCHSANWEISUNG - DIE SAMMLUNG\n  ALLEN WISSENS UND DER THEOREME\n       DER BRUDERSCHAFT DER NACHT." },
 };
 
-static struct ComicBlock block_p10_3 = { &poly_p10_b3, -1, -1, block_p10_b3_boxes, 1 };
+static const struct ComicBlock block_p10_3 = { &poly_p10_b3, -1, -1, block_p10_b3_boxes, 1 };
 
-static struct Polygon poly_p10_b4 = { {
+static const struct Polygon poly_p10_b4 = { {
     { 491, 0 },
     { 593, 0 },
     { 593, 157 },
@@ -1321,13 +1321,13 @@ static struct Polygon poly_p10_b4 = { {
     { 491, 93 },
 } };
 
-static struct ComicBox block_p10_b4_boxes[] = {
+static const struct ComicBox block_p10_b4_boxes[] = {
     { 6, 246, 330, 88, "        THE BOOK TAUGHT ME\n   HOW TO DISTILL LIQUIDARK. I\n PUT WHAT I LEARNED TO GOOD USE...\nSPENT COUNTLESS HOURS IN THAT DAMN\n LAB... UNTIL I FOUND A WAY TO BIND\n  THE LIQUIDARK TO FABRIC AND\n           BODY ARMOR.", "        LE LIVRE M'A APPRIS\n   A DISTILLER LE LIQUIDARK. J'AI\n MIS DE MON MIEUX CES CONNAISSANCES\nEN PRATIQUE... DES HEURES INFINIES\n DANS CE LABO AVANT DE... TROUVER\n  UN MOYEN DE LIER LE LIQUIDARK\n    ET LE TISSU DE MON COSTUME.", "        EN EL LIBRO VI COMO\n   DESTILAR EL LIQUIOSCIRO. LE\n DI UN BUEN USO... PASE MUCHAS\nHORAS EN EL LABORATORIO HASTA QUE\n  PUDE CONSTRUIR CON EL MI\n           ARMADURA.", "        DAS BUCH LEHRTE MICH,\n     DUSTER\x99""L ZU DESTILLIEREN.\n   ICH WANDTE MEIN WISSEN GUT AN,\n   VERBRACHTE ENDLOSE STUNDEN IN\n  DIESEM VERDAMMTEN LABOR, BIS ICH\n      EINEN WEG FAND, DUSTER\x99""L\n        AN GEWEBE ZU BINDEN." },
 };
 
-static struct ComicBlock block_p10_4 = { &poly_p10_b4, -1, -1, block_p10_b4_boxes, 1 };
+static const struct ComicBlock block_p10_4 = { &poly_p10_b4, -1, -1, block_p10_b4_boxes, 1 };
 
-static struct Polygon poly_p10_b5 = { {
+static const struct Polygon poly_p10_b5 = { {
     { 326, 93 },
     { 337, 93 },
     { 337, 81 },
@@ -1340,13 +1340,13 @@ static struct Polygon poly_p10_b5 = { {
     { 326, 200 },
 } };
 
-static struct ComicBox block_p10_b5_boxes[] = {
+static const struct ComicBox block_p10_b5_boxes[] = {
     { 5, 246, 439, 161, "         THE NOCTROGLYPH...\n   IT TOOK WEEKS JUST TO FIGURE\n OUT WHAT THE HELL IT WAS, LET\nALONE HOW TO WORK IT! POWERFUL...\n  SAVED MY BUTT MORE THAN A\n           FEW TIMES...", "\n         LE NOCTROGLYPHE...\n   IL M'A FALLU DES SEMAINES POUR\n COMPRENDRE DE QUOI IL S'AGISSAIT,\nSANS MEME PARLER DE L'UTILISER! MAIS\n    IL M'A SAUVE LA VIE PLUS\n          D'UNE FOIS...", "     EL NOCTROGLIFO...\n   ME LLEVO SEMANAS DESCUBRIR\n LO QUE ERA Y HACERLO FUNCIONAR.\n ES MUY PODEROSO... ME HA SACADO\n DE APUROS MAS DE UNA VEZ...", "         DER NOCTROGLYPH...\n    ICH HABE WOCHEN GEBRAUCHT,\n  NUR UM HERAUSZUFINDEN, WAS DAS\n IST, GAR NICHT DAVON ZU REDEN, WIE\n  ER FUNKTIONIERT. M\x8e""CHTIG....HAT\n     MEINEN HINTERN MEHR ALS\n    NUR EIN PAARMAL GERETTET." },
 };
 
-static struct ComicBlock block_p10_5 = { &poly_p10_b5, -1, -1, block_p10_b5_boxes, 1 };
+static const struct ComicBlock block_p10_5 = { &poly_p10_b5, -1, -1, block_p10_b5_boxes, 1 };
 
-static struct Polygon poly_p10_b6 = { {
+static const struct Polygon poly_p10_b6 = { {
     { 426, 200 },
     { 438, 173 },
     { 471, 151 },
@@ -1358,13 +1358,13 @@ static struct Polygon poly_p10_b6 = { {
     { 443, 233 },
 } };
 
-static struct ComicBox block_p10_b6_boxes[] = {
+static const struct ComicBox block_p10_b6_boxes[] = {
     { 6, 246, 279, 203, "        THOUGHT I WAS READY...\n  GONE AND FORGED MYSELF INTO\nONE BAD-ASS HERO! THEN I MET HER\n IN A BLIND ALLEY ONE NIGHT...\n  THOUGHT SHE WAS SOME PUNK THIEF...\n           STILETTO...", "        JE CROYAIS ETRE PRET...\n   JE ME SUIS FORGE UNE IMAGE DE\n HEROS PEU COMMODE! ET PUIS UN\nJOUR, JE L'AI RENCONTREE DANS UNE\n    ALLEE SOMBRE... JE CROYAIS\n     QUE C'ETAIT UNE VOLEUSE...\n            STILETTO....", "    CREI ESTAR LISTO...\n  YA ME HABIA FRAGUADO COMO\n SUPER-HEROE! Y ENTONCES LA\n ENCONTRE A ELLA, A\n ESA VAGABUNDA...\n           STILETTO...", "        DACHTE, ICH W\x8e""RE BEREIT...\n    MACHTE AUS MIR SELBST EINEN\n   VERDAMMTEN SUPERHELDEN. UND\n DANN, EINES ABENDS IN EINER DUNKLEN\n    SEITENSTRA\xe1""E, TRAF ICH SIE...\n     DACHTE, SIE W\x8e""RE NUR\n     EINE DIEBIN...STILETTO..." },
 };
 
-static struct ComicBlock block_p10_6 = { &poly_p10_b6, -1, -1, block_p10_b6_boxes, 1 };
+static const struct ComicBlock block_p10_6 = { &poly_p10_b6, -1, -1, block_p10_b6_boxes, 1 };
 
-static struct Polygon poly_p10_b7 = { {
+static const struct Polygon poly_p10_b7 = { {
     { 326, 200 },
     { 426, 200 },
     { 426, 312 },
@@ -1372,13 +1372,13 @@ static struct Polygon poly_p10_b7 = { {
     { 326, 399 },
 } };
 
-static struct ComicBox block_p10_b7_boxes[] = {
+static const struct ComicBox block_p10_b7_boxes[] = {
     { 8, 246, 156, 213, "        SHE LAID ME OUT FLAT!\n   BEFORE I KNEW WHAT'D HAPPENED,\nSHE HAD A BLADE AT MY THROAT... SHE\n LIKED THE COSTUME THOUGH. GOOD\n THING TOO, OR SHE'D PROBABLY HAVE\n      GUTTED ME RIGHT THERE.", "        ELLE M'A EU! AVANT QUE\n   JE PUISSE COMPRENDRE CE QUI SE\n PASSAIT, ELLE AVAIT DEJA POSE SA\n LAME SUR MA GORGE! ELLE AIMAIT\n  MON COSTUME.. HEUREUSEMENT,\n  SINON ELLE M'AURAIT EGORGE\n             SUR PLACE.", "     ME HIZO CAER Y, ANTES\n DE SABER LO QUE OCURRIA,\n APOYO UN CUCHILLO EN MI GARGANTA.\n QUERIA ROBARME EL DISFRAZ.\n  LA CONVENCI PARA HABLAR.", "         SIE LEGTE MICH AUFS\n    KREUZ! BEVOR ICH WU\xe1""TE, WAS\n MIR GESCHAH, HATTE ICH IHR MESSER\nAN DER KEHLE! ABER DER ANZUG GEFIEL\n IHR; WAS F\x9a""R EIN GL\x9a""CK, SONST H\x8e""TTE\n    SIE MICH WOHL AN ORT UND\n         STELLE AUSGEWEIDET." },
 };
 
-static struct ComicBlock block_p10_7 = { &poly_p10_b7, -1, -1, block_p10_b7_boxes, 1 };
+static const struct ComicBlock block_p10_7 = { &poly_p10_b7, -1, -1, block_p10_b7_boxes, 1 };
 
-static struct Polygon poly_p10_b8 = { {
+static const struct Polygon poly_p10_b8 = { {
     { 326, 399 },
     { 395, 373 },
     { 426, 233 },
@@ -1388,14 +1388,14 @@ static struct Polygon poly_p10_b8 = { {
     { 593, 399 },
 } };
 
-static struct ComicBox block_p10_b8_boxes[] = {
+static const struct ComicBox block_p10_b8_boxes[] = {
     { 8, 246, 240, 282, "        I TOOK HER BACK TO\n  SHADOWLAIR WHERE SHE AGREED TO\n BECOME MY PARTNER. WE PROWLED\nTHE STREETS TOGETHER. UNARMED, SHE'S\n VICIOUS, BUT WITH THOSE BLADES,\n   SHE'S DOWNRIGHT LETHAL! WE\n    BECAME A FORMIDABLE TEAM...\n       DARKSHEER AND STILETTO.", "         JE L'AI RAMENEE A\n    L'ANTRE D'OMBRE, OU ELLE\n ACCEPTA DE DEVENIR MA PARTENAIRE.\n   NOUS AVONS ECUME LES RUES\nENSEMBLE... SANS ARME, ELLE EST\n   RUSEE, MAIS AVEC SES COUTEAUX,\n         ELLE EST MORTELLE!", "        LA TRAJE A LA CUEVA\n  SOMBRIA Y ACEPTO SER MI SOCIA.\n JUNTOS RECORRIMOS LAS CALLES.\n ES MORTAL CON SUS CUCHILLOS.\n ERAMOS UN GRAN EQUIPO...\n       TENEBROSO Y STILETTO.", "      ICH NAHM SIE MIT ZUR\x9a""CK\n  ZUM SCHATTENHORT, UND SIE WILLIGTE\n  EIN, MEINE PARTNERIN ZU WERDEN." },
     { 8, 246, 240, 282, nullptr, "          NOUS FORMIONS\n        UNE EQUIPE UNIQUE...\n        DARKSHEER ET STILETTO.", nullptr, "            WIR TRIEBEN UNS\n    ZUSAMMEN RUM. UNBEWAFFNET\n  IST SIE SCHON GEF\x8e""HRLICH, ABER\n MIT DIESEN KLINGEN IST SIE EINFACH\n    T\x99""DLICH! WIR WURDEN EIN\n       UNSCHLAGBARES TEAM...\n       DARKSHEER UND STILETTO." },
 };
 
-static struct ComicBlock block_p10_8 = { &poly_p10_b8, -1, -1, block_p10_b8_boxes, 2 };
+static const struct ComicBlock block_p10_8 = { &poly_p10_b8, -1, -1, block_p10_b8_boxes, 2 };
 
-static struct Polygon poly_p10_b9 = { {
+static const struct Polygon poly_p10_b9 = { {
     { 491, 245 },
     { 593, 245 },
     { 593, 399 },
@@ -1403,14 +1403,14 @@ static struct Polygon poly_p10_b9 = { {
     { 494, 312 },
 } };
 
-static struct ComicBox block_p10_b9_boxes[] = {
+static const struct ComicBox block_p10_b9_boxes[] = {
     { 8, 246, 305, 212, "        WE'VE BEEN TOGETHER\n   EVER SINCE... WELL, EXCEPT\n LATELY... I GUESS SHE HAS A RIGHT\nTO BE TICKED THAT I'VE BEEN WORKING\n ALONE. THE VENOM'S GONE... AND THE\n   BULLET SCORE'S HEALED... LIKE I\n    SAID, IT WORKS EVERY TIME.", "\n       NOUS SOMMES ENSEMBLE\n   DEPUIS CE JOUR-LA.... EN FAIT,\nUN PEU MOINS DEPUIS QUELQUE TEMPS.\nJE PENSE QU'ELLE A LE DROIT\n  D'ETRE VEXEE PARCE QUE J'AI\n         TRAVAILLE SEUL.", "      DESDE ENTONCES\n   ESTAMOS JUNTOS... HASTA HACE\n POCO... SUPONGO QUE TIENE RAZON\n AL ENFADARSE PORQUE YO TRABAJE\n SOLO. BIEN. EL VENENO SE HA IDO Y\n  LA HERIDA DE BALA ESTA CURADA...\n       SIEMPRE FUNCIONA.", "         SEITDEM SIND WIR\n    ZUSAMMEN...NAJA, BIS AUF DIE\n LETZTE ZEIT. SCH\x8e""TZE, SIE HAT DAS\n RECHT, ETWAS SAUER ZU SEIN, DA\xe1"" ICH\nALLEIN GEARBEITET HABE. DAS GIFT IST\n   FORT...DIE WUNDE VERHEILT...WIE\n    GESAGT, FUNKTIONIERT\n             JEDESMAL." },
     { 8, 246, 305, 212, nullptr, "       LE VENIN EST PARTI... \n  ET LES BLESSURES DES BALLES\nONT ETE GUERIES. COMME JE VOUS\n    L'AI DIT, \x80""A MARCHE A TOUS\n           LES COUPS.", nullptr, nullptr },
 };
 
-static struct ComicBlock block_p10_9 = { &poly_p10_b9, -1, -1, block_p10_b9_boxes, 2 };
+static const struct ComicBlock block_p10_9 = { &poly_p10_b9, -1, -1, block_p10_b9_boxes, 2 };
 
-static struct ComicBlock page_10_blocks[] = {
+static const struct ComicBlock page_10_blocks[] = {
     block_p10_0,
     block_p10_1,
     block_p10_2,
@@ -1425,33 +1425,33 @@ static struct ComicBlock page_10_blocks[] = {
 
 static struct ComicPage page_10 = { "DARK/COMDATA/LEPG1819.SCN", 98, 50, 1, 0, page_10_blocks, 10 };
 
-static struct Polygon poly_p11_b0 = { {
+static const struct Polygon poly_p11_b0 = { {
     { 232, 82 },
     { 323, 83 },
     { 323, 165 },
     { 239, 165 },
 } };
 
-static struct ComicBox block_p11_b0_boxes[] = {
+static const struct ComicBox block_p11_b0_boxes[] = {
     { 7, 246, 332, 32, "         THEY COINED ME THEIR\n   CHAMPION...THE PRESS! JUST A\n     LOT OF GLAMOUR AND WINDOW\n DRESSING. OH, THEY WERE USUALLY\nLOYAL, BUT THERE WERE TIMES THEY\n       TURNED ON ME OVERNIGHT!", "\n        IL M'ONT CONSACRE COMME\n   LEUR CHAMPION... LA PRESSE! EN\nFAIT, BEAUCOUP DE POUDRE AUX YEUX...\nOH, ILS ETAIENT LOYALS, MAIS IL M'ONT\n      PARFOIS ABANDONNE SANS\n           EXPLICATION!", "         ME HICIERON SU\n  CAMPEON LA PRENSA! YO\n  ERA EL MAS FAMOSO DE LA\n CIUDAD. Y POR LO GENERAL ERAN\n LEALES CONMIGO, PERO TAMBIEN\n         ES QUE UNO SE CANSA!", "       SIE HABEN MICH ZU IHREM\n    HELDEN GEMACHT....DIE PRESSE!\n  JEDE MENGE GLAMOUR UND SHOW.\n    NAJA, MEISTENS HABEN SIE MICH\nUNTERST\x9a""TZT, ABER ES GAB AUCH ZEITEN,\n     DA HABEN SIE SICH \x9a""BER NACHT\n        GEGEN MICH GEWANDT!" },
 };
 
-static struct ComicBlock block_p11_0 = { &poly_p11_b0, -1, -1, block_p11_b0_boxes, 1 };
+static const struct ComicBlock block_p11_0 = { &poly_p11_b0, -1, -1, block_p11_b0_boxes, 1 };
 
-static struct Polygon poly_p11_b1 = { {
+static const struct Polygon poly_p11_b1 = { {
     { 61, 0 },
     { 323, 0 },
     { 322, 234 },
     { 62, 234 },
 } };
 
-static struct ComicBox block_p11_b1_boxes[] = {
+static const struct ComicBox block_p11_b1_boxes[] = {
     { 7, 246, 166, 33, "         I'M STILL NOT SURE\n   I'M DOING THE RIGHT THING...\n THIS CITY HAS COUNTED ON ME TO\nALWAYS BE THERE... LURKING IN THE\n       EVER-PRESENT SHADOWS.", "        JE NE SAIS PAS ENCORE\n   SI J'AI PRIS LA BONNE DECISION...\nCETTE VILLE A TOUJOURS COMPTE SUR\n    MOI... RODANT DANS L'OMBRE\n          OMNIPRESENTE.", "         NO ESTOY SEGURO DE\n ESTAR HACIENDO LO CORRECTO...\n ESTA CIUDAD HA CONTADO CONMIGO\n DESDE QUE ME CONVERTI EN\n       TENEBROSO.", "        ICH BIN MIR IMMER NOCH\n       NICHT SICHER, OB ICH DAS\n RICHTIGE TUE. DIE STADT HAT SICH\nDARAUF VERLASSEN, DA\xe1"" ICH IMMER F\x9a""R\n    SIE DA BIN.. IN DEN SCHATTEN,\n          DIE \x9a""BERALL SIND." },
 };
 
-static struct ComicBlock block_p11_1 = { &poly_p11_b1, -1, -1, block_p11_b1_boxes, 1 };
+static const struct ComicBlock block_p11_1 = { &poly_p11_b1, -1, -1, block_p11_b1_boxes, 1 };
 
-static struct Polygon poly_p11_b2 = { {
+static const struct Polygon poly_p11_b2 = { {
     { 322, 234 },
     { 266, 257 },
     { 242, 320 },
@@ -1459,65 +1459,65 @@ static struct Polygon poly_p11_b2 = { {
     { 322, 399 },
 } };
 
-static struct ComicBox block_p11_b2_boxes[] = {
+static const struct ComicBox block_p11_b2_boxes[] = {
     { 8, 246, 84, 219, "       ...I DESERVE MORE!", "\n   ... JE MERITE MIEUX QUE \x80""A!", "       ...MEREZCO MAS!", "\n       ... ICH VERDIENE MEHR!" },
 };
 
-static struct ComicBlock block_p11_2 = { &poly_p11_b2, -1, -1, block_p11_b2_boxes, 1 };
+static const struct ComicBlock block_p11_2 = { &poly_p11_b2, -1, -1, block_p11_b2_boxes, 1 };
 
-static struct Polygon poly_p11_b3 = { {
+static const struct Polygon poly_p11_b3 = { {
     { 62, 235 },
     { 322, 234 },
     { 322, 399 },
     { 62, 399 },
 } };
 
-static struct ComicBox block_p11_b3_boxes[] = {
+static const struct ComicBox block_p11_b3_boxes[] = {
     { 5, 246, 181, 280, "         I'VE WORKED HARD TO\n   BECOME WHAT I AM, BUT I'M SO\n DAMN TIRED! FIGHTING OFF EVERY\nCRACKPOT AND PSYCHO THAT WANTS TO\n   USE NOCTROPOLIS AS THEIR\n     PERSONAL PLAYGROUND...", "         J'AI TRAVAILLE DUR\n     POUR DEVENIR CE QUE JE SUIS\n AUJOU'D'HUI, MAIS JE SUIS VRAIMENT\nFATIGUE! JE ME SUIS BATTU CONTRE TOUS\n MALFAITEURS ET AUTRES PSYCHOPATHES\n  QUI DECIDAIENT UN JOUR D'ADOPTER\n        NOCTROPOLIS COMME\n          TERRAIN DE JEU...", "         TRABAJE MUCHO PARA\n  CONVERTIRME EN LO QUE SOY,\n PERO TODO TIENE UN FIN. PELEAR\n CONTRA CADA RATERO O SICOPATA\n QUE QUIERE HACER DE NOCTROPOLIS\n        SUS DOMINIOS...", "         ICH HABE HART\n   GEARBEITET, UM DAS ZU WERDEN,\n       WAS ICH HEUTE BIN." },
     { 5, 246, 181, 280, nullptr, nullptr, nullptr, "         ABER ICH BIN ES SO\n    VERDAMMT LEID, GEGEN JEDEN\n  VERR\x9a""CKTEN UND PSYCHOPATHEN ZU\n   K\x8e""MPFEN, DER NOCTROPOLIS ALS\n   SEINEN PERS\x99""NLICHEN SPIELPLATZ\n             BETRACHTET..." },
 };
 
-static struct ComicBlock block_p11_3 = { &poly_p11_b3, -1, -1, block_p11_b3_boxes, 2 };
+static const struct ComicBlock block_p11_3 = { &poly_p11_b3, -1, -1, block_p11_b3_boxes, 2 };
 
-static struct Polygon poly_p11_b4 = { {
+static const struct Polygon poly_p11_b4 = { {
     { 323, 0 },
     { 471, 0 },
     { 324, 175 },
 } };
 
-static struct ComicBox block_p11_b4_boxes[] = {
+static const struct ComicBox block_p11_b4_boxes[] = {
     { 0, 246, 349, 61, "NOCTROPOLIS CITY HALL", "MAIRIE DE NOCTROPOLIS", "AYUNTAMIENTO DE NOCTROPOLIS", "RATHAUS VON NOCTROPOLIS" },
 };
 
-static struct ComicBlock block_p11_4 = { &poly_p11_b4, -1, -1, block_p11_b4_boxes, 1 };
+static const struct ComicBlock block_p11_4 = { &poly_p11_b4, -1, -1, block_p11_b4_boxes, 1 };
 
-static struct Polygon poly_p11_b5 = { {
+static const struct Polygon poly_p11_b5 = { {
     { 471, 0 },
     { 586, 0 },
     { 586, 170 },
 } };
 
-static struct ComicBox block_p11_b5_boxes[] = {
+static const struct ComicBox block_p11_b5_boxes[] = {
     { 0, 246, 349, 61, "NOCTROPOLIS CITY HALL", "MAIRIE DE NOCTROPOLIS", "AYUNTAMIENTO DE NOCTROPOLIS", "RATHAUS VON NOCTROPOLIS" },
 };
 
-static struct ComicBlock block_p11_5 = { &poly_p11_b5, -1, -1, block_p11_b5_boxes, 1 };
+static const struct ComicBlock block_p11_5 = { &poly_p11_b5, -1, -1, block_p11_b5_boxes, 1 };
 
-static struct Polygon poly_p11_b6 = { {
+static const struct Polygon poly_p11_b6 = { {
     { 376, 111 },
     { 534, 111 },
     { 534, 187 },
     { 376, 187 },
 } };
 
-static struct ComicBox block_p11_b6_boxes[] = {
+static const struct ComicBox block_p11_b6_boxes[] = {
     { 4, 255, 235, 51, "        AHH DARKSHEER, WE WERE\n   JUST DISCUSSING YOU... YOUR\n RECENT CAMPAIGN AGAINST THE\nCITY'S MORE NOTORIOUS ENEMIES\n   HAS BEEN MOST IMPRESSIVE!\n            WELL DONE!", "\n        AHH... DARKSHEER! NOUS\n   PARLIONS JUSTEMENT DE VOUS...\nVOTRE DERNIERE CAMPAGNE CONTRE LES\n ENNEMIS NOTOIRES DE LA VILLE ETAIT\n     VRAIMENT IMPRESSIONNANTE!\n            BIEN JOUE! ", "        AH, TENEBROSO.\n  HABLABAMOS DE TI... TU\n RECIENTE CRUZADA CONTRA LOS\n ENEMIGOS MAS NOTABLES DE\n LA CIUDAD HA SIDO IMPRESIONANTE!\n          BIEN HECHO!", "        AAH, DARKSHEER, WIR\n   REDEN GERADE \x9a""BER SIE. IHRE\n J\x9a""NGSTE KAMPAGNE GEGEN DIE \x9a""BLEN\n  FEINDE DER STADT WAR \x8e""U\xe1""ERST\n       EINDRUCKSVOLL. SEHR GUT\n              GEMACHT!" },
     { 4, 246, 247, 71, "        THANK YOU MR. MAYOR.\n   YOU'LL BE PLEASED TO KNOW\n THAT TOPHAT IS IN CUSTODY AND\nTHAT DESPERADO AND WIDOWMARK WON'T\n     TROUBLE THE CITIZENS OF\n      NOCTROPOLIS EVER AGAIN.", "\n       MERCI, MONSIEUR LE MAIRE.\n   VOUS SEREZ HEUREUX D'APPRENDRE\n QUE TOPHAT EST EN PRISON, ET QUE\nDESPERADO ET WIDOWMARK N'ENNUIERONT\n    PLUS JAMAIS LES HABITANTS\n         DE NOCTROPOLIS.", "        GRACIAS, ALCALDE.\n  LE GUSTARA SABER QUE LA\n DIVA ESTA EN PRISION Y QUE\n DESESPERADO Y VIUDA NEGRA NO\n   VOLVERAN A MOLESTAR A LOS\n   CIUDADANOS DE NOCTROPOLIS.", "         VIELEN DANK, HERR\n     B\x9a""RGERMEISTER. ES WIRD SIE\n     FREUEN, ZU H\x99""REN, DA\xe1"" MISS\n  ZYLINDERCHEN IN HAFT GENOMMEN\n WURDE, UND DA\xe1"" SHOWDOWN UND DIE\n     SCHWARZE WITWE DIE B\x9a""RGER VON\n     NOCTROPOLIS NIE WIEDER\n         BEL\x8e""STIGEN WERDEN." },
 };
 
-static struct ComicBlock block_p11_6 = { &poly_p11_b6, -1, -1, block_p11_b6_boxes, 2 };
+static const struct ComicBlock block_p11_6 = { &poly_p11_b6, -1, -1, block_p11_b6_boxes, 2 };
 
-static struct Polygon poly_p11_b7 = { {
+static const struct Polygon poly_p11_b7 = { {
     { 323, 261 },
     { 378, 270 },
     { 396, 292 },
@@ -1526,13 +1526,13 @@ static struct Polygon poly_p11_b7 = { {
     { 323, 368 },
 } };
 
-static struct ComicBox block_p11_b7_boxes[] = {
+static const struct ComicBox block_p11_b7_boxes[] = {
     { 3, 255, 431, 210, "         R-RETIRE? BUT YOU\n   CAN'T! WE'RE JUST NOT CAPABLE\nOF DEALING WITH THE MISCREANTS THAT\nPLAGUE THE CITY... FOR THE LOVE OF\n  GOD, THINK OF MY PUBLIC IMAGE!\n    THERE'S AN ELECTION COMING...", "\n       P-PRENDRE VOTRE RETRAITE?\n   MAIS C'EST IMPOSSIBLE! NOUS NE\nPOURRONS PAS LUTTER SEUL CONTRE\nLES MALFAITEURS QUI RUINENT NOTRE\n CITE! POUR L'AMOUR DU CIEL, PENSEZ\n      A MON IMAGE! IL Y A DES\n         ELECTIONS BIENTOT...", "         RETIRARTE? NO\n   PUEDES! NOSOTROS NO SOMOS\n CAPACES DE HACER FRENTE A LOS\n DESALMADOS QUE ASEDIAN ESTA\n   CIUDAD. POR FAVOR, ESPERA\n       A LAS ELECCIONES!", "         Z-Z-ZUR RUHE SETZEN?\n   ABER DAS GEHT NICHT! WIR WERDEN\n DOCH ALLEINE NICHT MIT ALL DIESEN\n\x9a""BELT\x8e""TERN FERTIG, DIE UNSERE STADT\n   PLAGEN! UM GOTTES WILLEN,\n   DENKEN SIE DOCH AM MEIN IMAGE...\n      DIE WAHLEN STEHEN VOR\n             DER T\x9a""R!" },
 };
 
-static struct ComicBlock block_p11_7 = { &poly_p11_b7, -1, -1, block_p11_b7_boxes, 1 };
+static const struct ComicBlock block_p11_7 = { &poly_p11_b7, -1, -1, block_p11_b7_boxes, 1 };
 
-static struct Polygon poly_p11_b8 = { {
+static const struct Polygon poly_p11_b8 = { {
     { 507, 213 },
     { 535, 226 },
     { 544, 250 },
@@ -1543,66 +1543,66 @@ static struct Polygon poly_p11_b8 = { {
     { 475, 226 },
 } };
 
-static struct ComicBox block_p11_b8_boxes[] = {
+static const struct ComicBox block_p11_b8_boxes[] = {
     { 4, 246, 266, 169, "       ACTUALLY MR MAYOR,\n   THAT'S WHY I CAME TO SEE YOU...\n I HAVE DECIDED TO RETIRE. AS A\n COURTESY, I THOUGHT YOU SHOULD\n   KNOW BEFORE ANY PUBLIC\n        ANNOUNCEMENT.", "        EN FAIT, MONSIEUR LE\n    MAIRE, C'EST POUR \x80""A QUE JE\n SUIS VENU VOUS VOIR. J'AI DECIDE DE\nPRENDRE MA RETRAITE. JE PENSAIS QU'IL\n  ETAIT PLUS CONVENABLE DE VOUS\n     PREVENIR PERSONNELLEMENT\n       AVANT DE L'ANNONCER\n         OFFICIELLEMENT.", "      EN REALIDAD POR ESO\n   VENIA A VERLE, ALCALDE...\n HE DECIDIDO RETIRARME. ME\n PARECIO QUE DEBIA DECIRSELO A\n    USTED ANTES QUE A\n        NADIE.", "          EIGENTLICH BIN ICH\n      GENAU DESWEGEN HIER, HERR\n       B\x9a""RGERMEISTER. ICH HABE\n  BESCHLOSSEN, MICH ZUR RUHE ZU\n  SETZEN. ICH DACHTE, SIE SOLLTEN ES\n       ERFAHREN, BEVOR ICH ES\n        \x99""FFENTLICH BEKANNTGEBE." },
 };
 
-static struct ComicBlock block_p11_8 = { &poly_p11_b8, -1, -1, block_p11_b8_boxes, 1 };
+static const struct ComicBlock block_p11_8 = { &poly_p11_b8, -1, -1, block_p11_b8_boxes, 1 };
 
-static struct Polygon poly_p11_b9 = { {
+static const struct Polygon poly_p11_b9 = { {
     { 324, 175 },
     { 585, 170 },
     { 585, 267 },
     { 323, 267 },
 } };
 
-static struct ComicBox block_p11_b9_boxes[] = {
+static const struct ComicBox block_p11_b9_boxes[] = {
     { 4, 255, 224, 135, "      EXCELLENT! ACCORDING TO\n  OUR LISTS, THAT ACCOUNTS FOR\nEVERY CRIMINAL MASTERMIND TO DATE.\n  YOU'VE CERTAINLY EARNED A REST!", "      EXCELLENT! D'APRES NOS\n  LISTES, TOUS LES CRIMINELS SONT\nMAINTENANT SOUS LES VERROUS.\n VOUS AVEZ BIEN GAGNE UN PEU\n           DE REPOS!", "      EXCELENTE! SEGUN NUESTRA\n  LISTA, ESO DEJA LA CIUDAD LIMPIA\n DE CRIMINALES IMPORTANTES.\n  TE HAS GANADO UN DESCANSO!", "       AUSGEZEICHNET! NACH\n  UNSERER LISTE W\x8e""REN DAMIT JETZT\nALLE MEISTERVERBRECHER ABGEHAKT.\n    SIE HABEN SICH WIRKLICH EINE\n           PAUSE VERDIENT!" },
 };
 
-static struct ComicBlock block_p11_9 = { &poly_p11_b9, -1, -1, block_p11_b9_boxes, 1 };
+static const struct ComicBlock block_p11_9 = { &poly_p11_b9, -1, -1, block_p11_b9_boxes, 1 };
 
-static struct Polygon poly_p11_b10 = { {
+static const struct Polygon poly_p11_b10 = { {
     { 378, 270 },
     { 506, 270 },
     { 506, 324 },
     { 378, 324 },
 } };
 
-static struct ComicBox block_p11_b10_boxes[] = {
+static const struct ComicBox block_p11_b10_boxes[] = {
     { 4, 246, 233, 219, "        I DON'T GIVE A DAMN\n   ABOUT YOUR POPULARITY RATING!\nAND, AS YOU MENTIONED BEFORE,\nNOCTROPOLIS' BOGEY MEN ARE EITHER\n DEAD, OR IN LOCK-UP... MY\n  DECISION IS NOT NEGOTIABLE.", "       JE N'AI QUE FAIRE DE\n   VOTRE POPULARITE! ET, COMME\n JE VOUS L'AI DIT LES ENNEMIS DE\nNOCTROPOLIS SONT TOUS MORTS OU EN\n    PRISON... MA DECISION EST\n          IRREVOCABLE.", "         NO ME IMPORTA TU\n   IMAGEN PUBLICA! Y TODOS LOS\n CRIMINALES IMPORTANTES ESTAN\n MUERTOS O ENCERRADOS. MI\n  DECISION NO ES NEGOCIABLE.", "       IHRE BELIEBTHEIT K\x9a""MMERT\n    MICH EINEN DRECK! UND WIE SIE\n   BEREITS SO RICHTIG BEMERKTEN,\n SIND DIE B\x99""SEWICHTE ALLE ENTWEDER\n  TOT ODER IM GEF\x8e""NGNIS. MEINE\n   ENTSCHEIDUNG IST UNUMST\x99""\xe1""LICH." },
 };
 
-static struct ComicBlock block_p11_10 = { &poly_p11_b10, -1, -1, block_p11_b10_boxes, 1 };
+static const struct ComicBlock block_p11_10 = { &poly_p11_b10, -1, -1, block_p11_b10_boxes, 1 };
 
-static struct Polygon poly_p11_b11 = { {
+static const struct Polygon poly_p11_b11 = { {
     { 323, 324 },
     { 506, 324 },
     { 506, 399 },
     { 323, 399 },
 } };
 
-static struct ComicBox block_p11_b11_boxes[] = {
+static const struct ComicBox block_p11_b11_boxes[] = {
     { 4, 255, 239, 288, "        MR. MAYOR, I PROPOSE\n   THAT WE THROW DARKSHEER A\nHERO'S PARADE! AFTERWARD, YOU\nCOULD GIVE HIM THE KEY TO THE\n  CITY AT A TELEVISED CEREMONY!\n   IT WOULD BE GREAT PUBLICITY...", "       MONSIEUR LE MAIRE, JE\n   PROPOSE D'ORGANISER UN DEFILE\n   POUR NOTRE HEROS, DARKSHEER!\nENSUITE, VOUS POURRIEZ LUI REMETTRE\n LA CLEF DE LA VILLE AU COURS D'UNE\n  EMISSION TELEVISEE! CELA VOUS\n      FERAIT UNE EXCELLENTE\n             PUBLICITE.", "        ALCALDE, PROPONGO\n   QUE LE DESPIDAMOS CON UN \n DESFILE. USTED PODRIA DARLE\n LAS LLAVES DE LA CIUDAD\n   EN UN ACTO TELEVISADO!\n    SERIA UNA GRAN PUBLICIDAD...", "       HERR B\x9a""RGERMEISTER, ICH\n   SCHLAGE VOR, WIR VERANSTALTEN\n     ZU EHREN DARKSHEERS EINE\nHELDENPARADE! ANSCHLIE\xe1""END K\x99""NNTEN\nSIE IHM DIE EHRENSCHL\x9a""SSEL ZUR STADT\n    \x9a""BERREICHEN, LIVE IM FERNSEHEN.\n       DAS W\x8e""RE PRIMA PUBLICITY!" },
 };
 
-static struct ComicBlock block_p11_11 = { &poly_p11_b11, -1, -1, block_p11_b11_boxes, 1 };
+static const struct ComicBlock block_p11_11 = { &poly_p11_b11, -1, -1, block_p11_b11_boxes, 1 };
 
-static struct Polygon poly_p11_b12 = { {
+static const struct Polygon poly_p11_b12 = { {
     { 506, 267 },
     { 585, 267 },
     { 585, 399 },
     { 506, 399 },
 } };
 
-static struct ComicBox block_p11_b12_boxes[] = {
+static const struct ComicBox block_p11_b12_boxes[] = {
     { 4, 255, 362, 245, "      WELL, DARKSHEER, WHAT\n      DO YOU THINK?", "       ALORS, DARKSHEER,\n  QU'EST-CE QUE VOUS EN PENSEZ?", "      BIEN, TENEBROSO, QUE\n      DICES A ESO?", "      NUN, DARKSHEER, WAS\n      HALTEN SIE DAVON?" },
     { 2, 246, 332, 314, "      I SUPPOSE THAT WOULD\n      BE ALL RIGHT...", "        JE PENSE QUE \x80""A\n        POURRAIT ALLER...", "      SUPONGO QUE ES UNA\n      BUENA IDEA...", "      ICH SCH\x8e""TZE, DAS GEHT\n       IN ORDNUNG..." },
 };
 
-static struct ComicBlock block_p11_12 = { &poly_p11_b12, -1, -1, block_p11_b12_boxes, 2 };
+static const struct ComicBlock block_p11_12 = { &poly_p11_b12, -1, -1, block_p11_b12_boxes, 2 };
 
-static struct ComicBlock page_11_blocks[] = {
+static const struct ComicBlock page_11_blocks[] = {
     block_p11_0,
     block_p11_1,
     block_p11_2,
@@ -1620,7 +1620,7 @@ static struct ComicBlock page_11_blocks[] = {
 
 static struct ComicPage page_11 = { "DARK/COMDATA/LEPG2021.SCN", 98, 15, 1, 0, page_11_blocks, 13 };
 
-static struct Polygon poly_p12_b0 = { {
+static const struct Polygon poly_p12_b0 = { {
     { 186, 112 },
     { 220, 123 },
     { 229, 144 },
@@ -1631,68 +1631,68 @@ static struct Polygon poly_p12_b0 = { {
     { 158, 118 },
 } };
 
-static struct ComicBox block_p12_b0_boxes[] = {
+static const struct ComicBox block_p12_b0_boxes[] = {
     { 1, 255, 244, 170, "      FORGIVE ME FATHER, FOR\n      I HAVE SINNED...", "\n    PARDONNEZ-MOI, MON PERE,\n    CAR J'AI PECHE...", "     PERDONEME, PADRE, PORQUE\n      HE PECADO...", "     VERGIB MIR, VATER, DENN\n     ICH HABE GES\x9a""NDIGT..." },
 };
 
-static struct ComicBlock block_p12_0 = { &poly_p12_b0, -1, -1, block_p12_b0_boxes, 1 };
+static const struct ComicBlock block_p12_0 = { &poly_p12_b0, -1, -1, block_p12_b0_boxes, 1 };
 
-static struct Polygon poly_p12_b1 = { {
+static const struct Polygon poly_p12_b1 = { {
     { 57, 3 },
     { 179, 3 },
     { 182, 140 },
     { 57, 137 },
 } };
 
-static struct ComicBox block_p12_b1_boxes[] = {
+static const struct ComicBox block_p12_b1_boxes[] = {
     { 0, 246, 84, 113, "THE NOCTROPOLIS CITY CATHEDRAL", "CATHEDRALE DE NOCTROPOLIS", "LA CATEDRAL DE NOCTROPOLIS", "DER DOM VON NOCTROPOLIS" },
     { 5, 255, 168, 93, "      I DON'T KNOW WHAT ELSE\n   TO DO... WHO TO TALK TO. I\n    WONDER IF DESMOND EVEN\n          KNOWS YET.", "       JE NE SAIS PAS QUOI\n   FAIRE... NI A QUI PARLER. JE\n ME DEMANDE SI LE PERE DESMOND\n         EST AU COURANT...", "      NO SE QUE HACER NI A\n   QUIEN HABLAR. ME PREGUNTO\n      SI DESMOND LO\n         SABRA.", "      ICH WEI\xe1"" NICHT MEHR,\n  WAS ICH NOCH TUN KANN....MIT WEM\n ICH NOCH REDEN KANN. OB ES VATER\n  DESMOND \x9a""BERHAUPT SCHON WEI\xe1""?" },
 };
 
-static struct ComicBlock block_p12_1 = { &poly_p12_b1, -1, -1, block_p12_b1_boxes, 2 };
+static const struct ComicBlock block_p12_1 = { &poly_p12_b1, -1, -1, block_p12_b1_boxes, 2 };
 
-static struct Polygon poly_p12_b2 = { {
+static const struct Polygon poly_p12_b2 = { {
     { 193, 3 },
     { 316, 3 },
     { 316, 137 },
     { 190, 140 },
 } };
 
-static struct ComicBox block_p12_b2_boxes[] = {
+static const struct ComicBox block_p12_b2_boxes[] = {
     { 7, 255, 325, 32, "      I HATE COMING HERE. THE\n CONFESSIONAL ALWAYS MAKES ME\n  FEEL SO... GUILTY. I HATE\n          COMING HERE.", "\n     J'AI HORREUR DE VENIR ICI.\n JE ME SENS TOUJOURS... COUPABLE\n  DANS UN CONFESSIONNAL. JE HAIS\n            CET ENDROIT.", "      ODIO VENIR AQUI. EL\n CONFESIONARIO SIEMPRE ME\n  HACE SENTIR... CULPABLE.", "\n       ICH HASSE ES HIER. BEI\n DER BEICHTE F\x9a""HLE ICH MICH IMMER\n    SO...SCHULDIG. ICH HASSE\n               ES HIER." },
 };
 
-static struct ComicBlock block_p12_2 = { &poly_p12_b2, -1, -1, block_p12_b2_boxes, 1 };
+static const struct ComicBlock block_p12_2 = { &poly_p12_b2, -1, -1, block_p12_b2_boxes, 1 };
 
-static struct Polygon poly_p12_b3 = { {
+static const struct Polygon poly_p12_b3 = { {
     { 57, 152 },
     { 181, 149 },
     { 177, 396 },
     { 57, 396 },
 } };
 
-static struct ComicBox block_p12_b3_boxes[] = {
+static const struct ComicBox block_p12_b3_boxes[] = {
     { 3, 255, 201, 181, "      STILETTO, HAVE YOU SEEN\n     THE PAPER? IT READS:\n    \"DARKSHEER TO RETIRE\"!\n NOW, WHAT THE HELL IS GOING ON?", "      STILETTO, TU AS LU LES\n    JOURNAUX? \"DARKSHEER PREND\n    SA RETRAITE!\" MAIS QUE SE\n            PASSE-T-IL?", "      STILETTO, HAS LEIDO\n     LA PRENSA? DICE QUE\n    TENEBROSO SE RETIRA!\n QUE DEMONIOS ESTA PASANDO?", "      STILETTO, HAST DU DIE\n     ZEITUNG GELESEN? DA STEHT\n    \"DARKSHEER IN PENSION\"!\n  WAS ZUR H\x99""LLE IST DA LOS?" },
     { 3, 255, 132, 160, "       I WISH I KNEW, FATHER.\n  IT'S NOT THE SAME BETWEEN US\nANYMORE... WE HARDLY EVEN SPEAK\n            ANYMORE.", "       J'AIMERAIS LE SAVOIR,\n  PERE. CE N'EST PLUS LA MEME\nCHOSE ENTRE NOUS DEPUIS QUELQUE\n             TEMPS...", "       ESO QUERRIA SABER YO.\nTODO HA CAMBIADO ENTRE NOSOTROS.\n     YA NO HABLAMOS SIN PELEAR.", "       ICH W\x9a""NSCHTE, ICH W\x9a""\xe1""TE\n  ES, VATER. ES WAR IN LETZTER\n ZEIT ZWISCHEN UNS NICHT MEHR SO\n   WIE FR\x9a""HER...WIR REDEN KAUM\n          NOCH MITEINANDER." },
 };
 
-static struct ComicBlock block_p12_3 = { &poly_p12_b3, -1, -1, block_p12_b3_boxes, 2 };
+static const struct ComicBlock block_p12_3 = { &poly_p12_b3, -1, -1, block_p12_b3_boxes, 2 };
 
-static struct Polygon poly_p12_b4 = { {
+static const struct Polygon poly_p12_b4 = { {
     { 191, 149 },
     { 316, 152 },
     { 316, 396 },
     { 196, 396 },
 } };
 
-static struct ComicBox block_p12_b4_boxes[] = {
+static const struct ComicBox block_p12_b4_boxes[] = {
     { 1, 255, 325, 262, "        I HAD TO READ IT IN THE\n   PAPER, TOO. THAT SON OF A - HE\n DOESN'T GIVE A DAMN ABOUT THINGS...\n  ABOUT ME!  HE'S JUST GOING TO\n   THROW IT ALL AWAY WITHOUT\n          LOOKING BACK.", "       JE L'AI APPRIS MOI AUSSI\n  DANS LE JOURNAL. CE FILS DE P...,\n IL SE FICHE PAS MAL DES AUTRES...\n ET DE MOI! IL VA SIMPLEMENT TOUT\n      ABANDONNER SANS REGRET.", "        ME HE ENTERADO POR\n   LA PRENSA. ESE HIJO DE... NO\n  FUE CAPAZ DE DECIRMELO!\n   NOS HA DADO A TODOS LA\n      ESPALDA.", "\n        SELBST ICH MU\xe1""TE ES AUS\n   DER ZEITUNG ERFAHREN. DIESER\n VERDAMMTE---ER K\x9a""MMERT SICH EINEN\nDRECK UM ALLES...UM MICH! ER SCHMEI\xe1""T\n   EINFACH ALLES WEG, OHNE SICH\n         AUCH NUR UMZUDREHEN." },
     { 1, 255, 189, 258, "      EASY STILETTO, THERE\n  MUST BE AN EXPLANATION...", "     DU CALME, STILETTO, IL\n DOIT BIEN Y AVOIR UNE\n       EXPLICATION!", "      CALMA, STILETTO, DEBE\n DE HABER UNA EXPLICACION...", "      BERUHIGE DICH, STILETTO,\n  ES MU\xe1"" EINE VERN\x9a""NFTIGE\n    ERKL\x8e""RUNG DAF\x9a""R GEBEN." },
 };
 
-static struct ComicBlock block_p12_4 = { &poly_p12_b4, -1, -1, block_p12_b4_boxes, 2 };
+static const struct ComicBlock block_p12_4 = { &poly_p12_b4, -1, -1, block_p12_b4_boxes, 2 };
 
-static struct Polygon poly_p12_b5 = { {
+static const struct Polygon poly_p12_b5 = { {
     { 448, 140 },
     { 482, 153 },
     { 498, 186 },
@@ -1703,79 +1703,79 @@ static struct Polygon poly_p12_b5 = { {
     { 404, 154 },
 } };
 
-static struct ComicBox block_p12_b5_boxes[] = {
+static const struct ComicBox block_p12_b5_boxes[] = {
     { 2, 255, 201, 219, "       THERE, THERE, STILETTO,\n    OF COURSE GOD HEARS YOUR\nPRAYERS. HE WANTS YOU TO BE HAPPY..\n BUT RIGHT NOW YOU MUST TALK TO\n  DARKSHEER. HE NO LONGER TAKES\n         MY COUNSEL...", "\n      ALLONS, ALLONS, STILETTO,\n    BIEN SUR QUE DIEU ENTEND TES\n   PRIERES... IL VEUT QUE TU SOIS\n HEUREUSE... MAIS POUR L'INSTANT, TU\n    DOIS PARLER A DARKSHEER. IL\n       REFUSE D'ECOUTER MES\n              CONSEILS.", "        TE EQUIVOCAS,\n    DIOS TE ESCUCHA Y DESEA\n QUE SEAS FELIZ...\n HABLALE A TENEBROSO. SIEMPRE\n EL TE HACE MAS CASO QUE A\n         MI...", "\n       KOMM, KOMM, STILETTO,\n   NAT\x9a""RLICH H\x99""RT GOTT DEINE GEBETE.\n  ER WILL, DA\xe1"" DU GL\x9a""CKLICH BIST...\n ABER ERSTMAL MU\xe1""T DU MIT DARKSHEER\n  REDEN. ER H\x99""RT NICHT MEHR AUF\n            MEINEN RAT." },
 };
 
-static struct ComicBlock block_p12_5 = { &poly_p12_b5, -1, -1, block_p12_b5_boxes, 1 };
+static const struct ComicBlock block_p12_5 = { &poly_p12_b5, -1, -1, block_p12_b5_boxes, 1 };
 
-static struct Polygon poly_p12_b6 = { {
+static const struct Polygon poly_p12_b6 = { {
     { 317, 0 },
     { 400, 0 },
     { 400, 83 },
     { 317, 83 },
 } };
 
-static struct ComicBox block_p12_b6_boxes[] = {
+static const struct ComicBox block_p12_b6_boxes[] = {
     { 1, 255, 406, 57, "      DO YOU BELIEVE GOD'S\n REALLY THERE, FATHER? IS ALL\nTHAT CRAP ABOUT HEARING PRAYERS\n AND GIVING BLESSINGS FOR REAL...?", "      VOUS CROYEZ VRAIMENT\n  QUE DIEU EST LA, PERE? TOUTES\n  CES HISTOIRES DE PRIERES ET DE\n BENEDICTIONS, C'EST DONC VRAI?", "     CREE QUE DIOS ESTA\n AQUI, PADRE? Y QUE ESCUCHA\n NUESTRAS PLEGARIAS?", "\n      GLAUBEN SIE DENN WIRKLICH,\n DA\xe1"" ES EINEN GOTT GIBT, VATER? DA\xe1""\n  AN ALL DIESEM UNFUG MIT GEBETEN\n      UND SEGEN WAS DRAN IST?" },
 };
 
-static struct ComicBlock block_p12_6 = { &poly_p12_b6, -1, -1, block_p12_b6_boxes, 1 };
+static const struct ComicBlock block_p12_6 = { &poly_p12_b6, -1, -1, block_p12_b6_boxes, 1 };
 
-static struct Polygon poly_p12_b7 = { {
+static const struct Polygon poly_p12_b7 = { {
     { 496, 0 },
     { 580, 0 },
     { 580, 154 },
     { 496, 154 },
 } };
 
-static struct ComicBox block_p12_b7_boxes[] = {
+static const struct ComicBox block_p12_b7_boxes[] = {
     { 6, 255, 306, 79, "      IF THERE IS A GOD, HE\n  DOESN'T HEAR MY PRAYERS...", "      S'IL Y A UN DIEU, IL\n  N'ENTEND PAS MES PRIERES.", "    SI HAY UN DIOS, SE HA\n  OLVIDADO DE MI...", "      WENN ES EINEN GOTT GIBT,\n  DANN H\x99""RT ER MEINE GEBETE\n            NICHT." },
 };
 
-static struct ComicBlock block_p12_7 = { &poly_p12_b7, -1, -1, block_p12_b7_boxes, 1 };
+static const struct ComicBlock block_p12_7 = { &poly_p12_b7, -1, -1, block_p12_b7_boxes, 1 };
 
-static struct Polygon poly_p12_b8 = { {
+static const struct Polygon poly_p12_b8 = { {
     { 317, 83 },
     { 446, 83 },
     { 446, 292 },
     { 317, 292 },
 } };
 
-static struct ComicBox block_p12_b8_boxes[] = {
+static const struct ComicBox block_p12_b8_boxes[] = {
     { 2, 255, 126, 112, "       YOU DON'T UNDERSTAND,\n FATHER...I LOVE HIM! I LOVE HIM\n AND HE'S READY TO WALK OUT OF\n          MY LIFE!", "       VOUS NE COMPRENEZ PAS,\n MON PERE... JE L'AIME! JE L'AIME\n         ET IL M'ABANDONNE!", "       USTED NO COMPRENDE,\n PADRE... YO LO AMO! Y AHORA VA\n A ESCAPAR DE MI!", "       SIE VERSTEHEN NICHT,\n  VATER...ICH LIEBE IHN! ICH LIEBE\n IHN, UND ER WILL EINFACH SO AUS\n   MEINEM LEBEN VERSCHWINDEN!" },
     { 1, 255, 431, 102, "      I KNOW YOUR FEELINGS...\n THAT'S WHY YOU HAVE TO BE THE\nONE TO CONVINCE HIM THAT THIS\n DECISION TO RETIRE IS WRONG.", "     JE CONNAIS TES SENTIMENTS...\n C'EST POUR CETTE RAISON QUE TU\nDOIS LE CONVAINCRE QUE SA DECISION\n     DE PARTIR EST UNE ERREUR.", "    SIEMPRE LO HE SABIDO...\n ES POR ESO QUE ERES TU QUIEN\n DEBE CONVENCERLO DE QUE ESTA\n EN UN ERROR AL RETIRARSE.", "      ICH KENNE DEINE GEF\x9a""HLE...\n    DARUM IST ES JA AUCH DEINE\nAUFGABE, IHN ZU \x9a""BERZEUGEN, DA\xe1""\n  SEIN ENTSCHLU\xe1"", SICH ZUR RUHE ZU\n         SETZEN, FALSCH IST." },
 };
 
-static struct ComicBlock block_p12_8 = { &poly_p12_b8, -1, -1, block_p12_b8_boxes, 2 };
+static const struct ComicBlock block_p12_8 = { &poly_p12_b8, -1, -1, block_p12_b8_boxes, 2 };
 
-static struct Polygon poly_p12_b9 = { {
+static const struct Polygon poly_p12_b9 = { {
     { 317, 292 },
     { 446, 292 },
     { 446, 399 },
     { 317, 399 },
 } };
 
-static struct ComicBox block_p12_b9_boxes[] = {
+static const struct ComicBox block_p12_b9_boxes[] = {
     { 4, 255, 156, 238, "        COME, I'LL WALK YOU\n  OUT. STILETTO, I KNOW IN MY HEART\nTHAT IF YOU CAN PERSUADE DARKSHEER\n  TO STAY, THEN HE'LL RETURN YOUR\n   AFFECTION.  YOU WILL TRY,\n          WON'T YOU?", "\n        VIENS, JE VAIS TE\n  RACCOMPAGNER. STILETTO, JE SAIS,\nAU FOND DE MON COEUR, QUE SI TU\nPEUX PERSUADER DARKSHEER DE RESTER,\n     IL TE RENDRA TON AFFECTION.\n            TU ESSAIERAS? ", "        VE, SE QUE TU PUEDES\n  CONVENCER A TENEBROSO.\n  MUESTRALE TUS SENTIMIENTOS. LO\n  INTENTARAS, VERDAD?", "\n        KOMM, ICH BRINGE DICH\n  ZUR T\x9a""R. STILETTO, ICH WEI\xe1"" GENAU,\nWENN DU ES SCHAFFST, DARKSHEER ZUM\n BLEIBEN ZU \x9a""BERREDEN, WIRD ER DEINE\n  GEF\x9a""HLE ERWIDERN. DU WIRST ES\n      VERSUCHEN, NICHT WAHR?" },
 };
 
-static struct ComicBlock block_p12_9 = { &poly_p12_b9, -1, -1, block_p12_b9_boxes, 1 };
+static const struct ComicBlock block_p12_9 = { &poly_p12_b9, -1, -1, block_p12_b9_boxes, 1 };
 
-static struct Polygon poly_p12_b10 = { {
+static const struct Polygon poly_p12_b10 = { {
     { 448, 154 },
     { 580, 154 },
     { 580, 399 },
     { 448, 399 },
 } };
 
-static struct ComicBox block_p12_b10_boxes[] = {
+static const struct ComicBox block_p12_b10_boxes[] = {
     { 4, 255, 252, 263, "      I-I'LL TRY, FATHER...", "        JE... J'ESSAIERAI,\n        MON PERE.", "  LO INTENTARE, PADRE...", "         ICH...ICH WERDE ES\n         VERSUCHEN, VATER..." },
 };
 
-static struct ComicBlock block_p12_10 = { &poly_p12_b10, -1, -1, block_p12_b10_boxes, 1 };
+static const struct ComicBlock block_p12_10 = { &poly_p12_b10, -1, -1, block_p12_b10_boxes, 1 };
 
-static struct ComicBlock page_12_blocks[] = {
+static const struct ComicBlock page_12_blocks[] = {
     block_p12_0,
     block_p12_1,
     block_p12_2,
@@ -1791,7 +1791,7 @@ static struct ComicBlock page_12_blocks[] = {
 
 static struct ComicPage page_12 = { "DARK/COMDATA/LEPG2223.SCN", 98, 51, 1, 0, page_12_blocks, 11 };
 
-static struct Polygon poly_p13_b0 = { {
+static const struct Polygon poly_p13_b0 = { {
     { 188, 0 },
     { 270, 0 },
     { 285, 141 },
@@ -1799,13 +1799,13 @@ static struct Polygon poly_p13_b0 = { {
     { 188, 91 },
 } };
 
-static struct ComicBox block_p13_b0_boxes[] = {
+static const struct ComicBox block_p13_b0_boxes[] = {
     { 2, 246, 13, 86, "      WHAT THE HELL?!", "\n      QUE SE PASSE-T-IL?!", "      QUE DEMONIOS?!", "\n        WAS ZUR H\x99""LLE?!" },
 };
 
-static struct ComicBlock block_p13_0 = { &poly_p13_b0, 99, 25, block_p13_b0_boxes, 1 };
+static const struct ComicBlock block_p13_0 = { &poly_p13_b0, 99, 25, block_p13_b0_boxes, 1 };
 
-static struct Polygon poly_p13_b1 = { {
+static const struct Polygon poly_p13_b1 = { {
     { 188, 91 },
     { 270, 145 },
     { 240, 156 },
@@ -1813,39 +1813,39 @@ static struct Polygon poly_p13_b1 = { {
     { 188, 189 },
 } };
 
-static struct ComicBox block_p13_b1_boxes[] = {
+static const struct ComicBox block_p13_b1_boxes[] = {
     { 1, 246, 261, 193, "      YOU'D BETTER HAVE A\nDAMN GOOD REASON FOR DOING\n      THAT, STILETTO!", "     J'ESPERE QUE TU AS UNE\n    BONNE RAISON DE FAIRE \x80""A,\n            STILETTO!", "  SUPONGO QUE TENDRAS UNA\n BUENA RAZON PARA HACER\n      ESTO, STILETTO!", "      ICH HOFFE, DU HAST EINEN\n VERDAMMT GUTEN GRUND DAF\x9a""R,\n            STILETTO!" },
 };
 
-static struct ComicBlock block_p13_1 = { &poly_p13_b1, -1, -1, block_p13_b1_boxes, 1 };
+static const struct ComicBlock block_p13_1 = { &poly_p13_b1, -1, -1, block_p13_b1_boxes, 1 };
 
-static struct Polygon poly_p13_b2 = { {
+static const struct Polygon poly_p13_b2 = { {
     { 270, 0 },
     { 369, 0 },
     { 351, 140 },
     { 285, 141 },
 } };
 
-static struct ComicBox block_p13_b2_boxes[] = {
+static const struct ComicBox block_p13_b2_boxes[] = {
     { 1, 255, 372, 62, "        I THOUGHT YOU MIGHT\n   BE GETTING SOFT...THAT MIGHT\n  EXPLAIN YOUR \"RETIREMENT!\" I\n APPRECIATE YOU TALKING WITH ME\n  BEFORE PUBLICLY DISSOLVING OUR\n          PARTNERSHIP.", "        JE VOYAIS BIEN QUE TU\n   DEVENAIS MOU... CE QUI EXPLIQUE\nTA \"RETRAITE\"!  C'EST GENTIL DE ME\n   PARLER AVANT DE DISSOUDRE EN\n        PUBLIC NOTRE EQUIPE!", "     PENSE QUE TE ESTABAS\n  DEBILITANDO Y QUE ESO EXPLICABA\n  TU \"RETIRO\"! YO HUBIERA\n PREFERIDO QUE HABLARAS CONMIGO\n ANTES DE DISOLVER PUBLICAMENTE\n    NUESTRA SOCIEDAD.", "         ICH DACHTE, DU WIRST\n    VIELLEICHT WEICH. DAS K\x99""NNTE\n  DEINE \"PENSIONIERUNG\" ERKL\x8e""REN.\n DANKE, DA\xe1"" DU ES MIR SO SCHONEND\n BEIGEBRACHT UND \x99""FFENTLICH DAS\n    ENDE UNSERER PARTNERSCHAFT\n        BEKANNTGEGEBEN HAST." },
 };
 
-static struct ComicBlock block_p13_2 = { &poly_p13_b2, -1, -1, block_p13_b2_boxes, 1 };
+static const struct ComicBlock block_p13_2 = { &poly_p13_b2, -1, -1, block_p13_b2_boxes, 1 };
 
-static struct Polygon poly_p13_b3 = { {
+static const struct Polygon poly_p13_b3 = { {
     { 369, 0 },
     { 450, 0 },
     { 450, 95 },
     { 360, 66 },
 } };
 
-static struct ComicBox block_p13_b3_boxes[] = {
+static const struct ComicBox block_p13_b3_boxes[] = {
     { 2, 246, 191, 75, "      LOOK, STILETTO, I'M\n  SORRY...IF IT'S ANY CONSOLATION,\n THE HARDEST THING WILL BE\n         LEAVING YOU...", "      ECOUTE, STILETTO, JE\n   SUIS DESOLE. SI \x80""A PEUT TE\nCONSOLER, SACHE QUE LE PLUS DUR\n       POUR MOI SERA DE TE\n            QUITTER....", "  LO SIENTO, STILETTO, SI\n ESO TE SIRVE DE CONSUELO, LO\n MAS DURO HA SIDO DEJARTE.", "      H\x99""R MAL, STILETTO, ES\n  TUT MIR LEID. WENN ES DICH\n BERUHIGT: DICH ZU VERLASSEN, WIRD\n   DAS SCHWERSTE DARAN SEIN..." },
 };
 
-static struct ComicBlock block_p13_3 = { &poly_p13_b3, -1, -1, block_p13_b3_boxes, 1 };
+static const struct ComicBlock block_p13_3 = { &poly_p13_b3, -1, -1, block_p13_b3_boxes, 1 };
 
-static struct Polygon poly_p13_b4 = { {
+static const struct Polygon poly_p13_b4 = { {
     { 360, 66 },
     { 450, 95 },
     { 450, 189 },
@@ -1854,13 +1854,13 @@ static struct Polygon poly_p13_b4 = { {
     { 351, 140 },
 } };
 
-static struct ComicBox block_p13_b4_boxes[] = {
+static const struct ComicBox block_p13_b4_boxes[] = {
     { 1, 255, 473, 175, "    DO YOU REALLY MEAN THAT?", "\nTU PENSES VRAIMENT CE QUE TU DIS?", "   LO DICES EN SERIO?", "\n     MEINST DU DAS EHRLICH?" },
 };
 
-static struct ComicBlock block_p13_4 = { &poly_p13_b4, -1, -1, block_p13_b4_boxes, 1 };
+static const struct ComicBlock block_p13_4 = { &poly_p13_b4, -1, -1, block_p13_b4_boxes, 1 };
 
-static struct Polygon poly_p13_b5 = { {
+static const struct Polygon poly_p13_b5 = { {
     { 222, 189 },
     { 240, 156 },
     { 285, 141 },
@@ -1870,14 +1870,14 @@ static struct Polygon poly_p13_b5 = { {
     { 285, 226 },
 } };
 
-static struct ComicBox block_p13_b5_boxes[] = {
+static const struct ComicBox block_p13_b5_boxes[] = {
     { 3, 255, 309, 112, "    LET ME SHOW YOU...", "\n  LAISSE-MOI TE LE PROUVER....", "   TE LO DEMOSTRARE...", "\n    KOMM, ICH ZEIGE ES DIR...." },
     { 3, 255, 339, 112, "    OH, YESSS...! WHAT IS IT?\n     WHY ARE YOU STOPPING?!", "           OH, OUIIII..!\n QU'EST-CE QU'IL Y A? POURQUOI\n           TU ARRETES?!", "  QUE HACES?\r  POR QUE TE DETIENES?!", "        OH, JAAAA...!\n   WAS IST LOS? WARUM H\x99""RST\n           DU AUF?" },
 };
 
-static struct ComicBlock block_p13_5 = { &poly_p13_b5, -1, -1, block_p13_b5_boxes, 2 };
+static const struct ComicBlock block_p13_5 = { &poly_p13_b5, -1, -1, block_p13_b5_boxes, 2 };
 
-static struct Polygon poly_p13_b6 = { {
+static const struct Polygon poly_p13_b6 = { {
     { 318, 138 },
     { 351, 140 },
     { 395, 159 },
@@ -1887,14 +1887,14 @@ static struct Polygon poly_p13_b6 = { {
     { 318, 202 },
 } };
 
-static struct ComicBox block_p13_b6_boxes[] = {
+static const struct ComicBox block_p13_b6_boxes[] = {
     { 4, 246, 121, 110, "      THIS CAN'T WORK OUT,\n STILETTO...I'VE GOT A PARADE\nJUST HOURS FROM NOW, AFTER THAT\n     I'M LEAVING TOWN.", "      STILETTO, \x80""A NE PEUT\n PAS MARCHER... J'AI UN DEFILE\nDANS QUELQUES HEURES, ET JE QUITTE\n        LA VILLE ENSUITE... ", "   ES TARDE,\n STILETTO... AHORA DEBO\n ASISTIR AL DESFILE. LUEGO\n     ME IRE DE LA CIUDAD.", "      DAS KANN NICHT GUTGEHEN,\n  STILETTO...IN EIN PAAR STUNDEN\n    IST DIESE PARADE, DANACH\n   VERSCHWINDE ICH AUS DER STADT." },
     { 3, 255, 453, 122, "     I KNOW. BUT THERE'S\n SOMETHING YOU DON'T KNOW...\n SOMETHING I'VE NEVER TOLD YOU.", "       JE SAIS. MAIS IL Y A\n  QUELQUE CHOSE QUE TU NE SAIS\n   PAS... QUELQUE CHOSE QUE JE NE\n            T'AI JAMAIS DIT....", "     LO SE. PERO HAY\n ALGO QUE NO SABES...\n ALGO QUE NUNCA TE HE DICHO.", "       ICH WEI\xe1"". ABER DA IST\n  NOCH ETWAS, DAS DU NICHT WEI\xe1""T...\n     ETWAS, DAS ICH DIR NIE\n         GESAGT HABE..." },
 };
 
-static struct ComicBlock block_p13_6 = { &poly_p13_b6, -1, -1, block_p13_b6_boxes, 2 };
+static const struct ComicBlock block_p13_6 = { &poly_p13_b6, -1, -1, block_p13_b6_boxes, 2 };
 
-static struct Polygon poly_p13_b7 = { {
+static const struct Polygon poly_p13_b7 = { {
     { 277, 399 },
     { 274, 367 },
     { 318, 334 },
@@ -1902,26 +1902,26 @@ static struct Polygon poly_p13_b7 = { {
     { 359, 399 },
 } };
 
-static struct ComicBox block_p13_b7_boxes[] = {
+static const struct ComicBox block_p13_b7_boxes[] = {
     { 3, 246, 381, 284, "       ...I'M SORRY, STILETTO,\n    BUT IT CAN'T BE LIKE THAT.\n I'VE MADE OTHER PLANS... GOALS\nTHAT JUST DON'T ACCOMMODATE A\n RELATIONSHIP. SOMEDAY YOU'LL\n   UNDERSTAND... GOODBYE.", "      JE SUIS DESOLE, STILETTO,\n   MAIS \x80""A NE PEUT PAS SE PASSER\nCOMME \x80""A. J'AI D'AUTRES PLANS... DES\n PLANS QUI NE ME PERMETTENT PAS DE\nCONSERVER UNE RELATION AMOUREUSE...\n      UN JOUR, TU COMPRENDRAS...\n              AU REVOIR.", "   ...LO SIENTO, STILETTO,\n   PERO NO PUEDE SER. HE HECHO\n OTROS PLANES... EN LOS QUE NO\n ES POSIBLE MANTENER UNA\n RELACION. ALGUN DIA LO\n   ENTENDERAS... ADIOS.", "\n      ES TUT MIR LEID, STILETTO,\n    ABER DAS KANN ICH NICHT. ICH\n HABE ANDERE PL\x8e""NE...ZIELE, DIE SICH\nMIT EINER BEZIEHUNG NICHT VEREINBAREN\n  LASSEN. EINES TAGES WIRST DU MICH\n        VERSTEHEN. LEB WOHL." },
 };
 
-static struct ComicBlock block_p13_7 = { &poly_p13_b7, -1, -1, block_p13_b7_boxes, 1 };
+static const struct ComicBlock block_p13_7 = { &poly_p13_b7, -1, -1, block_p13_b7_boxes, 1 };
 
-static struct Polygon poly_p13_b8 = { {
+static const struct Polygon poly_p13_b8 = { {
     { 254, 201 },
     { 383, 201 },
     { 359, 399 },
     { 277, 399 },
 } };
 
-static struct ComicBox block_p13_b8_boxes[] = {
+static const struct ComicBox block_p13_b8_boxes[] = {
     { 4, 255, 104, 230, "      I... LOVE YOU! IF YOU\n  WON'T CHANGE YOUR MIND ABOUT\nLEAVING, THEN PLEASE... LET ME\n      COME WITH YOU.", "      JE... JE T'AIME! SI TU\n NE VEUX PAS CHANGER D'AVIS AU\nSUJET DE TON DEPART, ALORS JE T'EN\n     PRIE... LAISSE-MOI VENIR\n            AVEC TOI!", "     YO... TE AMO! Y SI\n ESO NO TE HACE DESISTIR DE\n PARTIR... LLEVAME CONTIGO", "       ICH... LIEBE DICH! WENN\n   DU DEINE PL\x8e""NE SCHON NICHT\n    \x8e""NDERST, DANN...LA\xe1"" MICH\n      WENIGSTENS MIT DIR GEHEN!" },
 };
 
-static struct ComicBlock block_p13_8 = { &poly_p13_b8, -1, -1, block_p13_b8_boxes, 1 };
+static const struct ComicBlock block_p13_8 = { &poly_p13_b8, -1, -1, block_p13_b8_boxes, 1 };
 
-static struct ComicBlock page_13_blocks[] = {
+static const struct ComicBlock page_13_blocks[] = {
     block_p13_0,
     block_p13_1,
     block_p13_2,
@@ -1935,33 +1935,33 @@ static struct ComicBlock page_13_blocks[] = {
 
 static struct ComicPage page_13 = { "DARK/COMDATA/LEPG24.SCN", 98, 52, 1, 0, page_13_blocks, 9 };
 
-static struct Polygon poly_p14_b0 = { {
+static const struct Polygon poly_p14_b0 = { {
     { 323, 111 },
     { 417, 111 },
     { 417, 164 },
     { 323, 164 },
 } };
 
-static struct ComicBox block_p14_b0_boxes[] = {
+static const struct ComicBox block_p14_b0_boxes[] = {
     { 1, 255, 440, 161, "       NEVER AGAIN!!!", "\n         PLUS JAMAIS \x80""A!!!", "    NUNCA MAS!", "\n            NIE WIEDER!!!" },
 };
 
-static struct ComicBlock block_p14_0 = { &poly_p14_b0, -1, -1, block_p14_b0_boxes, 1 };
+static const struct ComicBlock block_p14_0 = { &poly_p14_b0, -1, -1, block_p14_b0_boxes, 1 };
 
-static struct Polygon poly_p14_b1 = { {
+static const struct Polygon poly_p14_b1 = { {
     { 476, 278 },
     { 589, 278 },
     { 589, 353 },
     { 476, 353 },
 } };
 
-static struct ComicBox block_p14_b1_boxes[] = {
+static const struct ComicBox block_p14_b1_boxes[] = {
     { 4, 255, 322, 247, "      NEVER EVER AGAIN!!!", "\n  JAMAIS, NON, PLUS JAMAIS \x80""A!!!", "       NUNCA MAS!!!", "\n     NIEMALS, NIEMALS WIEDER!!!" },
 };
 
-static struct ComicBlock block_p14_1 = { &poly_p14_b1, -1, -1, block_p14_b1_boxes, 1 };
+static const struct ComicBlock block_p14_1 = { &poly_p14_b1, -1, -1, block_p14_b1_boxes, 1 };
 
-static struct Polygon poly_p14_b2 = { {
+static const struct Polygon poly_p14_b2 = { {
     { 323, 0 },
     { 589, 0 },
     { 589, 83 },
@@ -1969,39 +1969,39 @@ static struct Polygon poly_p14_b2 = { {
     { 323, 90 },
 } };
 
-static struct ComicBox block_p14_b2_boxes[] = {
+static const struct ComicBox block_p14_b2_boxes[] = {
     { 2, 255, 225, 104, "      ...FURTHER MORE, IN\n  RECOGNITION OF CONSPICUOUS\nSERVICE TO THE REGISTERED VOTERS\n    OF NOCTROPOLIS CITY...", "     ... DE PLUS, EN\n  REMERCIEMENT DES SERVICES\n  DESINTERESSES RENDUS AUX\n  ELECTEURS DE NOCTROPOLIS...", "   ...Y EN RECONOCIMIENTO\n  A LOS SERVICIOS PRESTADOS\n A LOS ELECTORES DE\n    NOCTROPOLIS...", "      ...DESWEITEREN M\x99""CHTE\n  ICH, IN ANERKENNUNG DER DIENSTE,\nDIE ER F\x9a""R DIE REGISTRIERTEN W\x8e""HLER\n   VON NOCTROPOLIS GELEISTET HAT..." },
 };
 
-static struct ComicBlock block_p14_2 = { &poly_p14_b2, -1, -1, block_p14_b2_boxes, 1 };
+static const struct ComicBlock block_p14_2 = { &poly_p14_b2, -1, -1, block_p14_b2_boxes, 1 };
 
-static struct Polygon poly_p14_b3 = { {
+static const struct Polygon poly_p14_b3 = { {
     { 323, 90 },
     { 451, 213 },
     { 451, 300 },
     { 323, 300 },
 } };
 
-static struct ComicBox block_p14_b3_boxes[] = {
+static const struct ComicBox block_p14_b3_boxes[] = {
     { 2, 255, 160, 227, "      ...IT IS MY HONOR AND\n  PRIVELEGE TO IMPART THE KEY\nTO NOCTROPOLIS CITY TO DARKSHEER,\n WHO LIKE YOUR MAYOR, \"GOT THE\n        JOB DONE IN '51!\"", "      ... J'AI L'HONNEUR ET\n  LE PRIVILEGE D'OFFRIR LA CLEF\nDE NOCTROPOLIS A DARKSHEER, QUI,\n  COMME VOTRE MAIRE, A \"FAIT SON\n          JOB EN '51!\"", "      ...TENGO EL HONOR Y\n EL PRIVILEGIO DE ENTREGAR LAS\n LLAVES DE NOCTROPOLIS A\n TENEBROSO, QUE, AL IGUAL QUE\n  YO, SABE HACER SU TRABAJO", "      ...DEN SCHL\x9a""SSEL ZUR\n  STADT NOCTROPOLIS AN DARKSHEER\n\x9a""BERREICHEN, DER - WIE AUCH ICH ALS\n    B\x9a""RGERMEISTER - STETS SEIN\n          BESTES GEGEBEN HAT." },
 };
 
-static struct ComicBlock block_p14_3 = { &poly_p14_b3, -1, -1, block_p14_b3_boxes, 1 };
+static const struct ComicBlock block_p14_3 = { &poly_p14_b3, -1, -1, block_p14_b3_boxes, 1 };
 
-static struct Polygon poly_p14_b4 = { {
+static const struct Polygon poly_p14_b4 = { {
     { 451, 213 },
     { 589, 83 },
     { 589, 300 },
     { 451, 300 },
 } };
 
-static struct ComicBox block_p14_b4_boxes[] = {
+static const struct ComicBox block_p14_b4_boxes[] = {
     { 2, 246, 313, 215, "     UH...THANK-YOU MR. MAYOR.\n     THANKS TO EVERYONE!", "     EUH... MERCI, MONSIEUR LE\n   MAIRE... MERCI TOUT LE MONDE!", "     EH... GRACIAS, ALCALDE.\n     GRACIAS A TODOS!", "     EHM... VIELEN DANK, HERR\n  B\x9a""RGERMEISTER. DANKE, IHNEN\n             ALLEN!" },
 };
 
-static struct ComicBlock block_p14_4 = { &poly_p14_b4, -1, -1, block_p14_b4_boxes, 1 };
+static const struct ComicBlock block_p14_4 = { &poly_p14_b4, -1, -1, block_p14_b4_boxes, 1 };
 
-static struct ComicBlock page_14_blocks[] = {
+static const struct ComicBlock page_14_blocks[] = {
     block_p14_0,
     block_p14_1,
     block_p14_2,
@@ -2011,58 +2011,58 @@ static struct ComicBlock page_14_blocks[] = {
 
 static struct ComicPage page_14 = { "DARK/COMDATA/LEPG2526.SCN", 98, 53, 1, 0, page_14_blocks, 5 };
 
-static struct Polygon poly_p15_b0 = { {
+static const struct Polygon poly_p15_b0 = { {
     { 225, 22 },
     { 293, 35 },
     { 283, 103 },
     { 213, 90 },
 } };
 
-static struct ComicBox block_p15_b0_boxes[] = {
+static const struct ComicBox block_p15_b0_boxes[] = {
     { 5, 246, 312, 85, "      THE MOMENT OF TRUTH...\nDIDN'T THINK IT WOULD BE SO HARD.", "      LE MOMENT DE VERITE...\n    JE NE PENSAIS PAS QUE CE\n         SERAIT SI DUR.", "  EL MOMENTO DE LA VERDAD...\n NUNCA PENSE QUE SERIA TAN DURO.", "     DER MOMENT DER WAHRHEIT...\n  H\x8e""TTE NIE GEDACHT, DA\xe1"" ES SO\n      SCHWER SEIN W\x9a""RDE." },
 };
 
-static struct ComicBlock block_p15_0 = { &poly_p15_b0, -1, -1, block_p15_b0_boxes, 1 };
+static const struct ComicBlock block_p15_0 = { &poly_p15_b0, -1, -1, block_p15_b0_boxes, 1 };
 
-static struct Polygon poly_p15_b1 = { {
+static const struct Polygon poly_p15_b1 = { {
     { 213, 155 },
     { 250, 118 },
     { 289, 155 },
     { 253, 193 },
 } };
 
-static struct ComicBox block_p15_b1_boxes[] = {
+static const struct ComicBox block_p15_b1_boxes[] = {
     { 5, 246, 309, 176, "      STILL, I KNOW IT'S THE\nRIGHT CHOICE... I'VE GOT A BRIGHTER\n       FUTURE OUT THERE...", "      POURTANT, JE SAIS QUE\nC'EST LE BON CHOIX... MON FUTUR\n  SERA PLUS BRILLANT AILLEURS...", "  PERO SE QUE HAGO LO\n CORRECTO... ME ESPERA UN\n   FUTURO BRILLANTE...", "      TROTZDEM, ICH WEI\xe1"", DA\xe1""\n   ES DIE RICHTIGE ENTSCHEIDUNG\n  WAR... MEINE ZUKUNFT STRAHLT NUN\n          VIEL HELLER..." },
 };
 
-static struct ComicBlock block_p15_1 = { &poly_p15_b1, -1, -1, block_p15_b1_boxes, 1 };
+static const struct ComicBlock block_p15_1 = { &poly_p15_b1, -1, -1, block_p15_b1_boxes, 1 };
 
-static struct Polygon poly_p15_b2 = { {
+static const struct Polygon poly_p15_b2 = { {
     { 239, 209 },
     { 304, 272 },
     { 210, 292 },
 } };
 
-static struct ComicBox block_p15_b2_boxes[] = {
+static const struct ComicBox block_p15_b2_boxes[] = {
     { 6, 246, 22, 277, "     TIME TO GO... FAREWELL\nNOCTROPOLIS... YOU'LL ALWAYS BE\n            HOME.", "     IL EST TEMPS DE PARTIR...\nADIEU, NOCTROPOLIS... TU RESTERAS\n     TOUJOURS DANS MON COEUR.", "  ES HORA DE DECIR ADIOS,\nNOCTROPOLIS... SIEMPRE SERAS\n      MI HOGAR.", "      ZEIT ZUM GEHEN...AUF\n   WIEDERSEHEN, NOCTROPOLIS...\n       DU WIRST IMMER MEIN\n           ZUHAUSE SEIN." },
 };
 
-static struct ComicBlock block_p15_2 = { &poly_p15_b2, -1, -1, block_p15_b2_boxes, 1 };
+static const struct ComicBlock block_p15_2 = { &poly_p15_b2, -1, -1, block_p15_b2_boxes, 1 };
 
-static struct Polygon poly_p15_b3 = { {
+static const struct Polygon poly_p15_b3 = { {
     { 187, 0 },
     { 452, 0 },
     { 452, 399 },
     { 187, 399 },
 } };
 
-static struct ComicBox block_p15_b3_boxes[] = {
+static const struct ComicBox block_p15_b3_boxes[] = {
     { 0, 246, 198, 39, "ASSUAGED BY THE KNOWLEDGE THAT DARKSHEER HAS CLEANSED\nAWAY ALL VESTIGE OF ARCHVILLAINY, THE CITY OF NIGHT\nRELAXES ITS GUARD AND SLEEPS... PERCHANCE TO DREAM...", "RASSUREE DE SAVOIR QUE DARKSHEER A ELIMINE TOUTE TRACE\nDES GRANDS CRIMINELS, LA CITE DE LA NUIT RELACHE SA\nGARDE ET S'ENDORT... ESPERANT UN REVE...", " TRANQUILA AL SABER QUE TENEBROSO LA HA LIBRADO DE\n SUS ENEMIGOS, LA CIUDAD DE LA NOCHE SE RELAJA Y SE\n DISPONE A DORMIR...", "BES\x8e""NFTIGT DURCH DAS WISSEN, DA\xe1"" DARKSHEER ALLE NESTER\nDES ERZSCHURKENTUMS AUSGER\x8e""UCHERT HAT, ENTSPANNT SICH\nDIE STADT DER NACHT UND SCHL\x8e""FT EIN...VIELLEICHT\nTR\x8e""UMT SIE AUCH..." },
 };
 
-static struct ComicBlock block_p15_3 = { &poly_p15_b3, -1, -1, block_p15_b3_boxes, 1 };
+static const struct ComicBlock block_p15_3 = { &poly_p15_b3, -1, -1, block_p15_b3_boxes, 1 };
 
-static struct ComicBlock page_15_blocks[] = {
+static const struct ComicBlock page_15_blocks[] = {
     block_p15_0,
     block_p15_1,
     block_p15_2,
diff --git a/engines/access/noctropolis/noctropolis_special_comic.cpp b/engines/access/noctropolis/noctropolis_special_comic.cpp
index 8b6bf0fed5b..7393c9a78c4 100644
--- a/engines/access/noctropolis/noctropolis_special_comic.cpp
+++ b/engines/access/noctropolis/noctropolis_special_comic.cpp
@@ -7,7 +7,7 @@ namespace Access {
 
 namespace Noctropolis {
 
-static struct Polygon poly_p1_b0 = { {
+static const struct Polygon poly_p1_b0 = { {
     { 376, 89 },
     { 427, 104 },
     { 450, 145 },
@@ -18,40 +18,40 @@ static struct Polygon poly_p1_b0 = { {
     { 328, 104 },
 } };
 
-static struct ComicBox block_p1_b0_boxes[] = {
+static const struct ComicBox block_p1_b0_boxes[] = {
     { 3, 244, 453, 88, "     ...SLOW DISSECTION...\n  LIVING AUTOPSY! NO TOOLS...\nRIP HIS HEART FROM ITS PLACE! OH,\n THE PAIN... THE IMMACULATE PAIN!!", "     ...UNE LENTE DISSECTION...\n     UNE AUTOPSIE VIVANTE! PAS\nD'INSTRUMENTS... LUI ARRACHER LE\nCOEUR! OH, QUELLE DOULEUR... UNE\n        DOULEUR IMMACULEE!!", "     ...LO DISECARIA...\n LE HARIA LA AUTOPSIA VIVO...\n SIN INSTRUMENTOS. LE SACARIA\n EL CORAZON... LO HARIA GRITAR!!", "     ... LANGSAM ZERTEILEN...\n  VIVISEKTION. NICHT SCHNEIDEN...\n    REI\xe1""EN! OH, DER SCHMERZ..." },
 };
 
-static struct ComicBlock block_p1_0 = { &poly_p1_b0, -1, -1, block_p1_b0_boxes, 1 };
+static const struct ComicBlock block_p1_0 = { &poly_p1_b0, -1, -1, block_p1_b0_boxes, 1 };
 
-static struct Polygon poly_p1_b1 = { {
+static const struct Polygon poly_p1_b1 = { {
     { 187, 0 },
     { 451, 0 },
     { 451, 95 },
     { 187, 95 },
 } };
 
-static struct ComicBox block_p1_b1_boxes[] = {
+static const struct ComicBox block_p1_b1_boxes[] = {
     { 0, 246, 200, 73, "NOCTROPOLIS CITY PENITENTIARY.", "PENITENCIER MUNICIPAL DE NOCTROPOLIS", "PRISION DE NOCTROPOLIS.", "ST\x8e""DTISCHES GEF\x8e""NGNIS NOCTROPOLIS." },
 };
 
-static struct ComicBlock block_p1_1 = { &poly_p1_b1, -1, -1, block_p1_b1_boxes, 1 };
+static const struct ComicBlock block_p1_1 = { &poly_p1_b1, -1, -1, block_p1_b1_boxes, 1 };
 
-static struct Polygon poly_p1_b2 = { {
+static const struct Polygon poly_p1_b2 = { {
     { 187, 95 },
     { 451, 95 },
     { 451, 210 },
     { 187, 210 },
 } };
 
-static struct ComicBox block_p1_b2_boxes[] = {
+static const struct ComicBox block_p1_b2_boxes[] = {
     { 0, 246, 207, 187, "CELL 427-JJ, MAXIMUM SECURITY WING. CURRENT\nINMATE: DR. WILLIAM BLISH, A.K.A. MASTER\nMACABRE (ARCH CRIMINAL)", "CELLULE 427-JJ, QUARTIER DE HAUTE SECURITE.\nDETENU ACTUEL: DR. WILLIAM BLISH, ALIAS\nMAITRE MACABRE (GRAND CRIMINEL)", "CELDA 427-JJ DE MAXIMA SEGURIDAD. OCUPANTE\nACTUAL: DR. WILLIAM BLISH, ALIAS MAESTRO\nMACABRO (ARCHICRIMINAL)", "ZELLE 427-JJ DES HOCHSICHERHEITSTRAKTES.\nDERZEITIGER INSASSE: DR. WILLIAM BLISH, ALIAS\nDOKTOR MAKABER (ERZSCHURKE)" },
     { 3, 244, 334, 108, "    ...INTOLERABLE! MY TALENTS\n ARE WASTING BEHIND THESE BLOODY\nBARS. BLOOD! THAT'S THE ANSWER.\n   OH, TO HAVE DARKSHEER AT\n          MY MERCY...", "    ... C'EST INTOLERABLE! MES\n  TALENTS GACHES DERRIERE CES\n  BARREAUX! DU SANG! VOILA LA\n   REPONSE. OH... AVOIR DARKSHEER\n            A MA MERCI...", "    ...INTOLERABLE! MI TALENTO\n DESPERDICIADO TRAS ESTAS REJAS.\n SI PUDIERA PONER MIS MANOS\n    SOBRE TENEBROSO...", "      ... UNERTR\x8e""GLICH! MEINE\n     TALENTE VERGEUDET HINTER\n  GITTERN, WIE BEI EINEM BLUTIGEN\n ANF\x8e""NGER. BLUT! DAS IST DIE ANTWORT.\n   OH, WENN ICH DOCH NUR DARKSHEER\n      IN MEINER GEWALT H\x8e""TTE..." },
 };
 
-static struct ComicBlock block_p1_2 = { &poly_p1_b2, -1, -1, block_p1_b2_boxes, 2 };
+static const struct ComicBlock block_p1_2 = { &poly_p1_b2, -1, -1, block_p1_b2_boxes, 2 };
 
-static struct Polygon poly_p1_b3 = { {
+static const struct Polygon poly_p1_b3 = { {
     { 187, 210 },
     { 283, 210 },
     { 283, 312 },
@@ -59,14 +59,14 @@ static struct Polygon poly_p1_b3 = { {
     { 187, 314 },
 } };
 
-static struct ComicBox block_p1_b3_boxes[] = {
+static const struct ComicBox block_p1_b3_boxes[] = {
     { 3, 246, 308, 181, "      IT IS ALWAYS REFRESHING\n   TO ENCOUNTER THOSE WHO\nAPPRECIATE THE AESTHETICS OF\n  PROPER PAIN DISPENSATION.", "        C'EST TOUJOURS\n  RAFRAICHISSANT DE RENCONTRER\n   CEUX QUI SAVENT APPRECIER\n      L'ESTHETIQUE DE LA DOULEUR\n             BIEN INFLIGEE.", "  SIEMPRE ES AGRADABLE\n  ESCUCHAR A UN\n  PROFESIONAL DEL DOLOR.", "            ES IST IMMER\n      ERFRISCHEND, JEMANDEN\n    KENNENZULERNEN, DER DIE\n  \x8e""STHETIK DER SCHMERZVERTEILUNG\n         ZU W\x9a""RDIGEN WEI\xe1""." },
     { 4, 244, 5, 173, "            WHO...?", "\n          QUI...?", "     QUIEN ERES?", "\n               WER...?" },
 };
 
-static struct ComicBlock block_p1_3 = { &poly_p1_b3, -1, -1, block_p1_b3_boxes, 2 };
+static const struct ComicBlock block_p1_3 = { &poly_p1_b3, -1, -1, block_p1_b3_boxes, 2 };
 
-static struct Polygon poly_p1_b4 = { {
+static const struct Polygon poly_p1_b4 = { {
     { 187, 314 },
     { 233, 337 },
     { 283, 312 },
@@ -74,27 +74,27 @@ static struct Polygon poly_p1_b4 = { {
     { 187, 399 },
 } };
 
-static struct ComicBox block_p1_b4_boxes[] = {
+static const struct ComicBox block_p1_b4_boxes[] = {
     { 3, 246, 297, 300, "      I AM FLUX. I HAVE COME\n  TO OFFER YOU A PROPOSITION.\n   BUT I FIND THIS BARRIER\n  BOTHERSOME. COME, JOIN ME\n        IN THE CORRIDOR.", "\n      JE M'APPELLE FLUX. JE\n    SUIS VENU VOUS FAIRE UNE\nPROPOSITION. MAIS JE TROUVE\n CETTE BARRIERE GENANTE. VENEZ,\n     REJOIGNEZ-MOI DANS\n         LE COULOIR.", "    SOY FLUX Y VENGO A\n  HACERTE UNA PROPOSICION.\n  PERO ESTOS BARROTES SON\n  MOLESTOS. POR QUE NO SALES\n    AL CORREDOR?", "          NENNEN SIE MICH\n    EINFACH FLUX. ICH BIN GEKOMMEN,\n     UM IHNEN EINEN VORSCHLAG ZU\n  UNTERBREITEN. ABER ICH FINDE DIESE\n   BARRIERE SEHR ST\x99""REND. KOMMEN\n     SIE DOCH ZU MIR HERAUS\n           AUF DEN FLUR." },
 };
 
-static struct ComicBlock block_p1_4 = { &poly_p1_b4, -1, -1, block_p1_b4_boxes, 1 };
+static const struct ComicBlock block_p1_4 = { &poly_p1_b4, -1, -1, block_p1_b4_boxes, 1 };
 
-static struct Polygon poly_p1_b5 = { {
+static const struct Polygon poly_p1_b5 = { {
     { 283, 210 },
     { 451, 210 },
     { 451, 399 },
     { 283, 399 },
 } };
 
-static struct ComicBox block_p1_b5_boxes[] = {
+static const struct ComicBox block_p1_b5_boxes[] = {
     { 3, 244, 392, 184, "        THE GUARDS...", "\n        LES GARDES...", "        LOS GUARDIAS...", "        ABER DIE WACHEN..." },
     { 4, 246, 144, 248, "     HAVE BEEN... RELIEVED. I\n SHARE YOUR VIEWPOINT, MACABRE,\n  YOUR GIFTS ARE BEING WASTED\n           HERE...", "      ONT ETE... RELEVES. JE\n  PARTAGE VOTRE POINT DE VUE,\n  MACABRE, VOTRE TALENT N'EST\n        PAS EXPLOITE ICI...", "   HAN IDO A... DESCANSAR.\n ESTOY DE ACUERDO, MACABRO.\n TU TALENTO SE DESPERDICIA\n           AQUI...", "      WURDEN...ABGEL\x99""ST. ICH\n   TEILE IHRE ANSICHT, MAKABER,\n   DA\xe1"" IHRE TALENTE HIER NUR\n        VERGEUDET WERDEN." },
 };
 
-static struct ComicBlock block_p1_5 = { &poly_p1_b5, -1, -1, block_p1_b5_boxes, 2 };
+static const struct ComicBlock block_p1_5 = { &poly_p1_b5, -1, -1, block_p1_b5_boxes, 2 };
 
-static struct ComicBlock page_1_blocks[] = {
+static const struct ComicBlock page_1_blocks[] = {
     block_p1_0,
     block_p1_1,
     block_p1_2,
@@ -105,74 +105,74 @@ static struct ComicBlock page_1_blocks[] = {
 
 static struct ComicPage page_1 = { "DARK/COMDATA/SEPG01.SCN", 98, 55, 1, 0, page_1_blocks, 6 };
 
-static struct Polygon poly_p2_b0 = { {
+static const struct Polygon poly_p2_b0 = { {
     { 369, 36 },
     { 450, 36 },
     { 450, 150 },
     { 369, 150 },
 } };
 
-static struct ComicBox block_p2_b0_boxes[] = {
+static const struct ComicBox block_p2_b0_boxes[] = {
     { 2, 244, 158, 132, "     OF COURSE, FLUX, YOU'RE\nTHE BOSS... NOW TELL ME MORE\n      ABOUT DARKSHEER!", "     BIEN SUR, FLUX... C'EST\nVOUS LE BOSS... MAIS DITES M'EN\n UN PEU PLUS SUR CE DARKSHEER!", "  POR SUPUESTO, FLUX. ERES\nEL JEFE... AHORA HABLAME\n      DE TENEBROSO!", "     SELBSTVERST\x8e""NDLICH, FLUX,\nSIE SIND DER BOSS...ERZ\x8e""HLEN\n   SIE MIR MEHR \x9a""BER DARKSHEER!" },
 };
 
-static struct ComicBlock block_p2_0 = { &poly_p2_b0, -1, -1, block_p2_b0_boxes, 1 };
+static const struct ComicBlock block_p2_0 = { &poly_p2_b0, -1, -1, block_p2_b0_boxes, 1 };
 
-static struct Polygon poly_p2_b1 = { {
+static const struct Polygon poly_p2_b1 = { {
     { 187, 0 },
     { 450, 0 },
     { 450, 217 },
     { 187, 217 },
 } };
 
-static struct ComicBox block_p2_b1_boxes[] = {
+static const struct ComicBox block_p2_b1_boxes[] = {
     { 2, 246, 68, 68, "    ...I OFFER YOU FREEDOM. A\n  CHANCE TO REALIZE YOUR DREAM\nOF RIPPING DARKSHEER'S HEART TO\n BLOODY SHREDS! IN EXCHANGE, I\n    DEMAND YOUR ALLEGIANCE.", "\n    ...JE VOUS OFFRE LA LIBERTE.\n   UNE CHANCE DE REALISER VOTRE\nREVE EN ARRACHANT LE COEUR DE\n  DARKSHEER POUR LE REDUIRE EN\n   LAMBEAUX SANGLANTS! EN ECHANGE,\n       JE VOUS DEMANDE VOTRE\n             FIDELITE", "    ...TE OFREZCO LA LIBERTAD\n Y UNA OPORTUNIDAD DE REALIZAR\n TUS DESEOS DE DESTROZAR A\n TENEBROSO. A CAMBIO, SOLO PIDO\n QUE TE SUBORDINES A MI.", "      ...ICH BIETE IHNEN DIE\n    FREIHEIT, DAZU EINE CHANCE,\n IHREN TRAUM ZU VERWIRKLICHEN UND\n       DARKSHEER DAS HERZ\n   RAUSZUREI\xe1""EN. DAF\x9a""R\n     VERLANGE ICH GEHORSAM." },
 };
 
-static struct ComicBlock block_p2_1 = { &poly_p2_b1, -1, -1, block_p2_b1_boxes, 1 };
+static const struct ComicBlock block_p2_1 = { &poly_p2_b1, -1, -1, block_p2_b1_boxes, 1 };
 
-static struct Polygon poly_p2_b2 = { {
+static const struct Polygon poly_p2_b2 = { {
     { 187, 150 },
     { 285, 217 },
     { 322, 399 },
     { 187, 399 },
 } };
 
-static struct ComicBox block_p2_b2_boxes[] = {
+static const struct ComicBox block_p2_b2_boxes[] = {
     { 3, 246, 296, 212, "     LATER. THE OTHERS AWAIT\n        OUR ARRIVAL.", "     PLUS TARD. LES AUTRES\n        NOUS ATTENDENT.", "  MAS TARDE. LOS DEMAS\n        NOS ESPERAN.", "       SP\x8e""TER. DIE ANDEREN\n         WARTEN AUF UNS." },
     { 3, 244, 346, 258, "     OTHERS?", "\n        LES AUTRES?", "   LOS DEMAS?", "\n           ANDEREN?" },
     { 3, 246, 296, 212, "       TOPHAT, DREALMER,\n  GREENTHUMB AND THE SUCCUBUS\nHAVE ALSO ACCEPTED ME AS THEIR\n LEADER. TOGETHER, WE WILL BRING\n   NOCTROPOLIS TO ITS KNEES!", "       TOPHAT, DREALMER,\n  MAINVERTE ET LA SUCCUBE ONT\n EGALEMENT ACCEPTE DE M'OBEIR.\n  ENSEMBLE, NOUS ALLONS METTRE\n     NOCTROPOLIS A GENOUX!", "   LA DIVA, MORFEICO,\n  DEDOVERDE Y LA SUCCUBUS\n TAMBIEN ME HAN ACEPTADO COMO\n LIDER. JUNTOS, PONDREMOS A\n   NOCTROPOLIS DE RODILLAS!", "         MISS ZYLINDERCHEN,\n    TR\x8e""UMLER, GR\x9a""ND\x8e""UMLING UND\n  SUCCUBUS HABEN MICH EBENFALLS\n    ALS ANF\x9a""HRER AKZEPTIERT.\n     GEMEINSAM WERDEN WIR\n       NOCTROPOLIS IN DIE\n          KNIE ZWINGEN!" },
 };
 
-static struct ComicBlock block_p2_2 = { &poly_p2_b2, -1, -1, block_p2_b2_boxes, 3 };
+static const struct ComicBlock block_p2_2 = { &poly_p2_b2, -1, -1, block_p2_b2_boxes, 3 };
 
-static struct Polygon poly_p2_b3 = { {
+static const struct Polygon poly_p2_b3 = { {
     { 285, 217 },
     { 450, 217 },
     { 450, 296 },
     { 302, 296 },
 } };
 
-static struct ComicBox block_p2_b3_boxes[] = {
+static const struct ComicBox block_p2_b3_boxes[] = {
     { 4, 244, 115, 196, "     AH, FLUX, I LIKE YOUR\n             STYLE!", "     AH, FLUX, J'AIME BIEN\n         VOTRE STYLE!", "     ME GUSTA TU\n       ESTILO, FLUX!", "         HMM, FLUX, IHR STIL\n            GEF\x8e""LLT MIR." },
 };
 
-static struct ComicBlock block_p2_3 = { &poly_p2_b3, -1, -1, block_p2_b3_boxes, 1 };
+static const struct ComicBlock block_p2_3 = { &poly_p2_b3, -1, -1, block_p2_b3_boxes, 1 };
 
-static struct Polygon poly_p2_b4 = { {
+static const struct Polygon poly_p2_b4 = { {
     { 302, 296 },
     { 450, 296 },
     { 450, 399 },
     { 322, 399 },
 } };
 
-static struct ComicBox block_p2_b4_boxes[] = {
+static const struct ComicBox block_p2_b4_boxes[] = {
     { 4, 246, 145, 263, "     YES... I BELIEVE YOU'LL\nFIND THAT WE HAVE MUCH IN COMMON.", "\n     OUI... JE CROIS QUE VOUS\n VERREZ BIENTOT QUE NOUS AVONS\n       BEAUCOUP DE CHOSES\n           EN COMMUN...", "  SI... VERAS QUE TENEMOS\n MUCHO EN COMUN.", "       JA, ICH GLAUBE, SIE\nWERDEN FESTSTELLEN, DA\xe1"" WIR EINE\n      MENGE GEMEINSAM HABEN." },
 };
 
-static struct ComicBlock block_p2_4 = { &poly_p2_b4, -1, -1, block_p2_b4_boxes, 1 };
+static const struct ComicBlock block_p2_4 = { &poly_p2_b4, -1, -1, block_p2_b4_boxes, 1 };
 
-static struct ComicBlock page_2_blocks[] = {
+static const struct ComicBlock page_2_blocks[] = {
     block_p2_0,
     block_p2_1,
     block_p2_2,
@@ -182,27 +182,27 @@ static struct ComicBlock page_2_blocks[] = {
 
 static struct ComicPage page_2 = { "DARK/COMDATA/SEPG02.SCN", 98, 55, 1, 0, page_2_blocks, 5 };
 
-static struct Polygon poly_p3_b0 = { {
+static const struct Polygon poly_p3_b0 = { {
     { 187, 0 },
     { 451, 0 },
     { 451, 186 },
     { 187, 186 },
 } };
 
-static struct ComicBox block_p3_b0_boxes[] = {
+static const struct ComicBox block_p3_b0_boxes[] = {
     { 2, 246, 98, 99, "       COLLECTIVELY, YOU ARE\n   ARMAGEDDON: A NIGHTMARE FOR\nTHE CITY OF NIGHT! GO NOW, EXPLORE\n EVERY PERVERSION. LET TERROR REIGN\n  IN THE STREETS AND CHAOS CONSUME\n           THE WHOLE!", "        ENSEMBLE, VOUS ETES\n    L'APOCALYPSE, UN CAUCHEMAR\n  POUR LA CITE DE LA NUIT! ALLEZ,\n   MAINTENANT. EXPLOREZ CHAQUE\n   PERVERSION. LAISSEZ LA TERREUR\n    REGNER DANS LES RUES, ET LE\n       CHAOS CONSUMERA TOUT!", "    JUNTOS SEREMOS EL\n   ARMAGEDON, UNA PESADILLA PARA\n LA CIUDAD DE LA NOCHE. DEDICAOS A\n CUANTA PERVERSION SE OS OCURRA.\n  SEMBRAD EL TERROR EN LAS CALLES!", "       GEMEINSAM SEID IHR DAS\n    ARMAGEDDON, DER ALPTRAUM F\x9a""R\n  DIE STADT DER NACHT! GEHT JETZT\n  UND LEBT EURE PERVERSIONEN AUS!\n   LA\xe1""T DEN TERROR IN DEN STRA\xe1""EN\n      REGIEREN UND DAS CHAOS\n        ALLES VERSCHLINGEN!" },
 };
 
-static struct ComicBlock block_p3_0 = { &poly_p3_b0, -1, -1, block_p3_b0_boxes, 1 };
+static const struct ComicBlock block_p3_0 = { &poly_p3_b0, -1, -1, block_p3_b0_boxes, 1 };
 
-static struct Polygon poly_p3_b1 = { {
+static const struct Polygon poly_p3_b1 = { {
     { 187, 186 },
     { 451, 186 },
     { 451, 399 },
     { 187, 399 },
 } };
 
-static struct ComicBox block_p3_b1_boxes[] = {
+static const struct ComicBox block_p3_b1_boxes[] = {
     { 0, 246, 221, 318, "THE DREALMER.", "DREALMER.", "MORFEICO.", "TR\x8e""UMLER." },
     { 0, 246, 270, 267, "TOPHAT.", "TOPHAT.", "LA DIVA.", "MISS ZYLINDERCHEN." },
     { 0, 246, 327, 289, "MASTER MACABRE.", "MAITRE MACABRE.", "MACABRO.", "DOKTOR MAKABER." },
@@ -210,101 +210,101 @@ static struct ComicBox block_p3_b1_boxes[] = {
     { 0, 246, 419, 278, "THE SUCCUBUS.", "LA SUCCUBE.", "LA SUCCUBUS.", "SUCCUBUS." },
 };
 
-static struct ComicBlock block_p3_1 = { &poly_p3_b1, -1, -1, block_p3_b1_boxes, 5 };
+static const struct ComicBlock block_p3_1 = { &poly_p3_b1, -1, -1, block_p3_b1_boxes, 5 };
 
-static struct ComicBlock page_3_blocks[] = {
+static const struct ComicBlock page_3_blocks[] = {
     block_p3_0,
     block_p3_1,
 };
 
 static struct ComicPage page_3 = { "DARK/COMDATA/SEPG03.SCN", 98, 56, 0, 0, page_3_blocks, 2 };
 
-static struct Polygon poly_p4_b0 = { {
+static const struct Polygon poly_p4_b0 = { {
     { 187, 0 },
     { 451, 0 },
     { 451, 399 },
     { 187, 399 },
 } };
 
-static struct ComicBox block_p4_b0_boxes[] = {
+static const struct ComicBox block_p4_b0_boxes[] = {
     { 0, 246, 216, 189, "NOCTROPOLIS CITY STAGGERS UNDER THE VILLAINS'\nRUTHLESS ONSLAUGHT. WORKING IN CONCERT UNDER THE\nDIRECTION OF THE ENIGMATIC MASTERMIND, FLUX, THE\nINSIDIOUS QUINTET RELENTLESSLY DEVOUR THE CITY OF\nNIGHT A BITE AT A TIME....", "NOCTROPOLIS VACILLE SOUS LES ASSAUTS FAROUCHES\nDES MALEFIQUES. TRAVAILLANT DE CONCERT SOUS LA\nDIRECTION DE FLUX, LE MYSTERIEUX CERVEAU, LES\nCINQ EVADES DEVORENT SANS RELACHE LA CITE DE LA\nNUIT... BOUCHEE APRES BOUCHEE...", " NOCTROPOLIS SE ESTREMECE BAJO EL ASALTO DE\n LOS CRIMINALES. TRABAJANDO BAJO LA\n DIRECCION DEL MISTERIOSO FLUX, EL\n QUINTETO HACE CUNDIR EL PANICO EN LAS\n CALLES...", "NOCTROPOLIS ERBEBT UNTER DEM GNADENLOSEN ANSTURM\nDES B\x99""SEN. DANK DER KOORDINATION DES GEHEIMNISVOLLEN\nDRAHTZIEHERS FLUX VERSCHLINGT DAS QUINTETT DIE STADT\nDER NACHT BISSEN F\x9a""R BISSEN..." },
 };
 
-static struct ComicBlock block_p4_0 = { &poly_p4_b0, -1, -1, block_p4_b0_boxes, 1 };
+static const struct ComicBlock block_p4_0 = { &poly_p4_b0, -1, -1, block_p4_b0_boxes, 1 };
 
-static struct ComicBlock page_4_blocks[] = {
+static const struct ComicBlock page_4_blocks[] = {
     block_p4_0,
 };
 
 static struct ComicPage page_4 = { "DARK/COMDATA/SEPG04.SCN", 98, 57, 1, 0, page_4_blocks, 1 };
 
-static struct Polygon poly_p5_b0 = { {
+static const struct Polygon poly_p5_b0 = { {
     { 187, 0 },
     { 451, 0 },
     { 451, 78 },
     { 187, 78 },
 } };
 
-static struct ComicBox block_p5_b0_boxes[] = {
+static const struct ComicBox block_p5_b0_boxes[] = {
     { 0, 246, 216, 43, "NOCTROPOLIS CITY CATHEDRAL.", "CATHEDRALE DE NOCTROPOLIS.", "CATEDRAL DE NOCTROPOLIS.", "DOM VON NOCTROPOLIS." },
 };
 
-static struct ComicBlock block_p5_0 = { &poly_p5_b0, -1, -1, block_p5_b0_boxes, 1 };
+static const struct ComicBlock block_p5_0 = { &poly_p5_b0, -1, -1, block_p5_b0_boxes, 1 };
 
-static struct Polygon poly_p5_b1 = { {
+static const struct Polygon poly_p5_b1 = { {
     { 187, 78 },
     { 343, 78 },
     { 343, 185 },
     { 187, 185 },
 } };
 
-static struct ComicBox block_p5_b1_boxes[] = {
+static const struct ComicBox block_p5_b1_boxes[] = {
     { 4, 255, 29, 76, "      YO, FATHER, C'MON MAN,\n I KNOW THEY'RE TOUGH 'N ALL, BUT\nWE JUST GOTTA DO SOMETHIN'... THE\n     POLICE SURE AIN'T!", "      YO, PERE, ECOUTE, MEC.\n JE SAIS QUE C'EST DES DURS, TOUT\n  \x80""A... MAIS FAUT FAIRE QUELQUE\n   CHOSE... LA POLICE NE FAIT RIEN,\n           \x80""A C'EST SUR!", "    OIGA, PADRE, LA GENTE\n CREE QUE ESTO ES EL FIN, PERO\n NOSOTROS PODEMOS HACER ALGO...\n LA POLICIA ES INUTIL!", "      ALSO, VATER, KOMMEN SIE\n   SCHON, ICH WEI\xe1"", DA\xe1"" SIE EIN\n    HARTER BURSCHE SIND, ABER WIR\n M\x9a""SSEN WAS TUN, DENN DIE POLIZEI\n      TUT BESTIMMT NICHTS!" },
     { 3, 255, 344, 87, "     YEAH, FATHER, JUST LET\n THE WARDS GIVE IT A TRY.", "     OUAIS, PERE, LAISSEZ\n     FAIRE LES PUPILLES!", "   SI, PADRE, DEJE QUE LOS\n GUARDIANES LO INTENTEMOS.", "     JAU, VATER, GEBEN SIE DER\n  WEHR DOCH EINMAL EINE CHANCE." },
 };
 
-static struct ComicBlock block_p5_1 = { &poly_p5_b1, -1, -1, block_p5_b1_boxes, 2 };
+static const struct ComicBlock block_p5_1 = { &poly_p5_b1, -1, -1, block_p5_b1_boxes, 2 };
 
-static struct Polygon poly_p5_b2 = { {
+static const struct Polygon poly_p5_b2 = { {
     { 343, 78 },
     { 451, 78 },
     { 451, 167 },
     { 343, 167 },
 } };
 
-static struct ComicBox block_p5_b2_boxes[] = {
+static const struct ComicBox block_p5_b2_boxes[] = {
     { 4, 255, 189, 50, "     ABSOLUTELY NOT! ALL FIVE\n   OF THEM ARE TWISTED, COLD-\nBLOODED KILLERS, RICO... THEY'D EAT\n THE WARDS ALIVE! MAYBE... MAYBE\n      STILETTO CAN HELP US.", "\n     CERTAINEMENT PAS! CE SONT\n     CINQ DEMENTS QUI TUENT DE\n SANG-FROID, RICO... ILS NE FERAIENT\nQU'UNE BOUCHEE DE VOUS! PEUT-ETRE\n    QUE... PEUT-ETRE QUE STILETTO\n             PEUT NOUS AIDER.", "     DE ESO NADA! SE TRATA\n  DE CINCO CRIMINALES SIN\n PIEDAD QUE OS DEVORARIAN VIVOS!\n QUIZAS STILETTO PUEDA AYUDARNOS.", "\n     BESTIMMT NICHT! DAS SIND\n   ALLE F\x9a""NF GEST\x99""RTE, KALTBL\x9a""TIGE\nKILLER, RICO...DIE W\x9a""RDEN DIE WEHR\n LEBENDIG ZERFLEISCHEN. VIELLEICHT...\n   VIELLEICHT KANN UNS STILETTO\n              HELFEN." },
 };
 
-static struct ComicBlock block_p5_2 = { &poly_p5_b2, -1, -1, block_p5_b2_boxes, 1 };
+static const struct ComicBlock block_p5_2 = { &poly_p5_b2, -1, -1, block_p5_b2_boxes, 1 };
 
-static struct Polygon poly_p5_b3 = { {
+static const struct Polygon poly_p5_b3 = { {
     { 187, 185 },
     { 333, 185 },
     { 333, 399 },
     { 187, 399 },
 } };
 
-static struct ComicBox block_p5_b3_boxes[] = {
+static const struct ComicBox block_p5_b3_boxes[] = {
     { 4, 255, 40, 250, "       IF STILETTO CAN'T HELP,\n  THEN IT'S OVER... ESPECIALLY FOR\n ME. THE SUCCUBUS HASN'T FORGOTTEN\n HER HATE, IT'S PROBABLY STRONGER\n    THAN EVER. GOD HELP ME WHEN\n            SHE COMES!", "         SI STILETTO NE PEUT\n    PAS NOUS AIDER, ALORS TOUT\n EST FINI... SURTOUT POUR MOI. LA\nSUCCUBE N'A PAS OUBLIE SA HAINE, ET\n  ELLE EST SUREMENT PLUS FORTE QUE\n   JAMAIS! QUE DIEU ME VIENNE EN\n      AIDE SI ELLE VIENT ICI!", "       SI STILETTO SE NIEGA, SE\n  ACABARA TODO... EN ESPECIAL\n PARA MI. LA SUCCUBUS NO OLVIDA.\n Y AHORA DEBE SER MAS FUERTE QUE\n NUNCA. QUE DIOS SE APIADE DE MI\n     SI ELLA VIENE!", "       WENN UNS STILETTO NICHT\n   HELFEN KANN, IST ALLES VORBEI...\n BESONDERS F\x9a""R MICH. SUCCUBUS HAT\n  IHREN HA\xe1"" BESTIMMT NICHT\n   VERGESSEN, WAHRSCHEINLICH\n    IST ER EHER NOCH GEWACHSEN.\n    GOTT STEH MIR BEI, WENN SIE\n               KOMMT!" },
 };
 
-static struct ComicBlock block_p5_3 = { &poly_p5_b3, -1, -1, block_p5_b3_boxes, 1 };
+static const struct ComicBlock block_p5_3 = { &poly_p5_b3, -1, -1, block_p5_b3_boxes, 1 };
 
-static struct Polygon poly_p5_b4 = { {
+static const struct Polygon poly_p5_b4 = { {
     { 333, 167 },
     { 451, 167 },
     { 451, 399 },
     { 333, 399 },
 } };
 
-static struct ComicBox block_p5_b4_boxes[] = {
+static const struct ComicBox block_p5_b4_boxes[] = {
     { 4, 255, 211, 173, "      WELL IF IT AIN'T FATHER\n  DESMOND! COME TO GIVE POOR\nSTILETTO MORE ADVICE, PRIEST? NOW,\n           LET'S SEE...", "       MAIS C'EST LE PERE\n  DESMOND! ON EST VENU DONNER\n DES CONSEILS A STILETTO, CURE?\n          BON, VOYONS VOIR...", "   QUE SORPRESA, PADRE\n  DESMOND! VIENE A DAR CONSEJOS\n A LA POBRE STILETTO?", "\n      NA, WENN DAS NICHT VATER\n  DESMOND IST! VORBEIGEKOMMEN, UM\nDER ARMEN STILETTO NOCH EIN PAAR\n  RATSCHL\x8e""GE ZU GEBEN, PRIESTER?\n    NA, DANN SCHAUEN WIR DOCH MAL..." },
 };
 
-static struct ComicBlock block_p5_4 = { &poly_p5_b4, -1, -1, block_p5_b4_boxes, 1 };
+static const struct ComicBlock block_p5_4 = { &poly_p5_b4, -1, -1, block_p5_b4_boxes, 1 };
 
-static struct ComicBlock page_5_blocks[] = {
+static const struct ComicBlock page_5_blocks[] = {
     block_p5_0,
     block_p5_1,
     block_p5_2,
@@ -314,85 +314,85 @@ static struct ComicBlock page_5_blocks[] = {
 
 static struct ComicPage page_5 = { "DARK/COMDATA/SEPG05.SCN", 98, 58, 1, 0, page_5_blocks, 5 };
 
-static struct Polygon poly_p6_b0 = { {
+static const struct Polygon poly_p6_b0 = { {
     { 188, 0 },
     { 320, 0 },
     { 320, 107 },
     { 188, 107 },
 } };
 
-static struct ComicBox block_p6_b0_boxes[] = {
+static const struct ComicBox block_p6_b0_boxes[] = {
     { 1, 255, 292, 98, "    ...\"GOD WANTS ME TO BE\n  HAPPY\",... \"DARKSHEER WILL\nRETURN MY LOVE\". THAT'S WHAT\n  YOU TOLD ME...\n      WHAT A LOAD OF BULL!", "       ...\"DIEU VEUT QUE TU\n                 SOIS HEUREUSE,\"... \n   \"DARKSHEER TE RENDRA \n                    TON AMOUR...\" \n     C'EST CE QUE VOUS DISIEZ...\n     RIEN QUE DES CONNERIES!", "    ...DIOS QUIERE QUE\n SEAS FELIZ... TENEBROSO\n ENTENDERA TU AMOR... ESO ME\n DIJO, RECUERDA?", "       ...\"GOTT WILL, DA\xe1""\n               ICH GL\x9a""CKLICH BIN.\"\n...\"DARKSHEER WIRD MEINE\n                       LIEBE ERWIDERN\",\n    DAS WAR'S DOCH, WAS SIE MIR\n    ERZ\x8e""HLST HABEN...WAS F\x9a""R EINE\n               SCHEI\xe1""E!" },
 };
 
-static struct ComicBlock block_p6_0 = { &poly_p6_b0, -1, -1, block_p6_b0_boxes, 1 };
+static const struct ComicBlock block_p6_0 = { &poly_p6_b0, -1, -1, block_p6_b0_boxes, 1 };
 
-static struct Polygon poly_p6_b1 = { {
+static const struct Polygon poly_p6_b1 = { {
     { 320, 0 },
     { 451, 0 },
     { 451, 107 },
     { 320, 107 },
 } };
 
-static struct ComicBox block_p6_b1_boxes[] = {
+static const struct ComicBox block_p6_b1_boxes[] = {
     { 2, 255, 195, 91, "    STILETTO, I UNDERSTAND\nYOUR PAIN, BUT I'VE COME TO\n  DISCUSS URGENT MATTERS.", "      STILETTO, JE COMPRENDS\n  TA PEINE, MAIS JE SUIS VENU TE\n      PARLER D'UNE AFFAIRE\n           IMPORTANTE...", "    STILETTO, COMPRENDO TU\n DOLOR, PERO ME TRAEN\n ASUNTOS MUY URGENTES.", "      STILETTO, ICH VERSTEHE\n  JA DEINEN SCHMERZ, ABER ICH\n     MU\xe1"" WICHTIGE DINGE MIT DIR\n            BESPRECHEN." },
 };
 
-static struct ComicBlock block_p6_1 = { &poly_p6_b1, -1, -1, block_p6_b1_boxes, 1 };
+static const struct ComicBlock block_p6_1 = { &poly_p6_b1, -1, -1, block_p6_b1_boxes, 1 };
 
-static struct Polygon poly_p6_b2 = { {
+static const struct Polygon poly_p6_b2 = { {
     { 188, 107 },
     { 320, 107 },
     { 320, 210 },
     { 188, 210 },
 } };
 
-static struct ComicBox block_p6_b2_boxes[] = {
+static const struct ComicBox block_p6_b2_boxes[] = {
     { 3, 255, 330, 78, "      THE ARCHVILLAINS HAVE\n  ESCAPED FROM PRISON! THEY'RE\nTEARING THIS CITY APART! NOW,\n YOU'VE GOT TO PULL YOURSELF\n           TOGETHER.", "      LES ARCHI-CRIMINELS SE\n  SONT EVADES! ILS SONT EN TRAIN\n DE RUINER NOTRE VILLE! TU DOIS\n     ABSOLUMENT TE SECOUER,\n          MAINTENANT!", "    LOS ARCHIVILLANOS HAN\n  ESCAPADO DE PRISION Y SIEMBRAN\n EL TERROR! SOLO TU PUEDES\n ENFRENTARTE A ELLOS.", "      DIE ERZSCHURKEN SIND\n  AUS DEM GEF\x8e""NGNIS ENTKOMMEN!\nSIE REI\xe1""EN DIESE STADT IN ST\x9a""CKE!\n     DU MU\xe1""T DICH ZUSAMMENNEHMEN!" },
 };
 
-static struct ComicBlock block_p6_2 = { &poly_p6_b2, -1, -1, block_p6_b2_boxes, 1 };
+static const struct ComicBlock block_p6_2 = { &poly_p6_b2, -1, -1, block_p6_b2_boxes, 1 };
 
-static struct Polygon poly_p6_b3 = { {
+static const struct Polygon poly_p6_b3 = { {
     { 320, 107 },
     { 451, 107 },
     { 451, 210 },
     { 320, 210 },
 } };
 
-static struct ComicBox block_p6_b3_boxes[] = {
+static const struct ComicBox block_p6_b3_boxes[] = {
     { 4, 255, 159, 77, "    WHO THE HELL DO YOU THINK\n  YOU ARE?! I DON'T HAVE TO DO\n A DAMN THING FOR YOU OR THIS\n             CITY!", "      MAIS VOUS VOUS PRENEZ\n  POUR QUI? JE NE SUIS PAS\n OBLIGEE DE FAIRE QUOIQUE CE SOIT,\n      NI POUR VOUS, NI POUR CETTE\n           FOUTUE VILLE!", "  QUIEN TE CREES QUE ERES?\n NO TE DEBO NADA NI A TI NI A\n ESTA MALDITA CIUDAD!", "      WER ZUR H\x99""LLE GLAUBEN\n  SIE, DA\xe1"" SIE SIND? ICH MU\xe1""\n\x9a""BERHAUPT NICHTS TUN, WEDER F\x9a""R\n      SIE NOCH F\x9a""R DIESE STADT!" },
 };
 
-static struct ComicBlock block_p6_3 = { &poly_p6_b3, -1, -1, block_p6_b3_boxes, 1 };
+static const struct ComicBlock block_p6_3 = { &poly_p6_b3, -1, -1, block_p6_b3_boxes, 1 };
 
-static struct Polygon poly_p6_b4 = { {
+static const struct Polygon poly_p6_b4 = { {
     { 188, 210 },
     { 320, 210 },
     { 320, 399 },
     { 188, 399 },
 } };
 
-static struct ComicBox block_p6_b4_boxes[] = {
+static const struct ComicBox block_p6_b4_boxes[] = {
     { 3, 255, 314, 280, "       IF I WANT TO SIT ON MY\n   ASS 'N DRINK MYSELF BLIND, THEN\n THAT'S MY OWN BUSINESS! FIND\n  ANOTHER SHOULDER TO CRY ON\n          PRIEST...\n     I DON'T CARE ANYMORE.", "            SI JE PREFERE\n       RESTER ASSISE A M'IMBIBER\n   CONSCIENCIEUSEMENT, C'EST MON\nTROUVEZ UNE AUTRE EPAULE PROBLEME!\n     POUR PLEURER, CURE... JE M'EN\n          FOUS, MAINTENANT.", "    SI HE DECIDIDO SENTARME A\n  BEBER, ESO ES ASUNTO\n MIO. BUSCA OTRO HOMBRO SOBRE\n EL QUE LLORAR, SACERDOTE.\n A MI NO ME IMPORTA NADA.", "        WENN ICH AUF MEINEM\n    HINTERN SITZEN UND MICH BLIND\n SAUFEN M\x99""CHTE, DANN IST DAS ALLEIN\n MEINE ANGELEGENHEIT! SUCHEN SIE SICH EINE\n    ANDERE SCHULTER ZUM AUSHEULEN,\n    PRIESTER, MIR IST DAS ALLES EGAL!" },
 };
 
-static struct ComicBlock block_p6_4 = { &poly_p6_b4, -1, -1, block_p6_b4_boxes, 1 };
+static const struct ComicBlock block_p6_4 = { &poly_p6_b4, -1, -1, block_p6_b4_boxes, 1 };
 
-static struct Polygon poly_p6_b5 = { {
+static const struct Polygon poly_p6_b5 = { {
     { 320, 210 },
     { 451, 210 },
     { 451, 399 },
     { 320, 399 },
 } };
 
-static struct ComicBox block_p6_b5_boxes[] = {
+static const struct ComicBox block_p6_b5_boxes[] = {
     { 4, 255, 194, 272, "     GOOD-BYE, STILETTO....", "\n       AU REVOIR, STILETTO....", "     ADIOS, STILETTO....", "\n    AUF WIEDERSEHEN, STILETTO...." },
 };
 
-static struct ComicBlock block_p6_5 = { &poly_p6_b5, -1, -1, block_p6_b5_boxes, 1 };
+static const struct ComicBlock block_p6_5 = { &poly_p6_b5, -1, -1, block_p6_b5_boxes, 1 };
 
-static struct ComicBlock page_6_blocks[] = {
+static const struct ComicBlock page_6_blocks[] = {
     block_p6_0,
     block_p6_1,
     block_p6_2,
@@ -403,33 +403,33 @@ static struct ComicBlock page_6_blocks[] = {
 
 static struct ComicPage page_6 = { "DARK/COMDATA/SEPG06.SCN", 98, 58, 1, 0, page_6_blocks, 6 };
 
-static struct Polygon poly_p7_b0 = { {
+static const struct Polygon poly_p7_b0 = { {
     { 354, 4 },
     { 441, 4 },
     { 441, 123 },
     { 354, 123 },
 } };
 
-static struct ComicBox block_p7_b0_boxes[] = {
+static const struct ComicBox block_p7_b0_boxes[] = {
     { 2, 255, 172, 71, "       I BESEECH THEE IN AN\n   HOUR OF GREAT NEED... SEND\nDARKSHEER BACK TO US... SEND\n         HIM BACK!", "       JE T'IMPLORE DANS UN\n     MOMENT DE GRAND BESOIN...\n  RAMENE DARKSHEER PARMI NOUS...\n    NOUS AVONS BESOIN DE LUI!", "    ACUDO A TI EN ESTA HORA\n  DE NECESIDAD... ENVIANOS\n A TENEBROSO... TRAELO\n   DE REGRESO!", "       ICH BESCHW\x99""RE DICH, IN\n   DIESER STUNDE DER NOT...SCHICKE\n   UNS DARKSHEER ZUR\x9a""CK...SCHICK'\n            IHN ZUR\x9a""CK!" },
 };
 
-static struct ComicBlock block_p7_0 = { &poly_p7_b0, -1, -1, block_p7_b0_boxes, 1 };
+static const struct ComicBlock block_p7_0 = { &poly_p7_b0, -1, -1, block_p7_b0_boxes, 1 };
 
-static struct Polygon poly_p7_b1 = { {
+static const struct Polygon poly_p7_b1 = { {
     { 187, 0 },
     { 451, 0 },
     { 451, 188 },
     { 187, 188 },
 } };
 
-static struct ComicBox block_p7_b1_boxes[] = {
+static const struct ComicBox block_p7_b1_boxes[] = {
     { 4, 255, 61, 66, "     OH, GOD IN HEAVEN...", "\n         OH, DIEU DES CIEUX...", "     OH, DIOS MIO...", "\n       OH, GOTT IM HIMMEL..." },
 };
 
-static struct ComicBlock block_p7_1 = { &poly_p7_b1, -1, -1, block_p7_b1_boxes, 1 };
+static const struct ComicBlock block_p7_1 = { &poly_p7_b1, -1, -1, block_p7_b1_boxes, 1 };
 
-static struct ComicBlock page_7_blocks[] = {
+static const struct ComicBlock page_7_blocks[] = {
     block_p7_0,
     block_p7_1,
 };
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 5e9a0fd5a4a..d811c1a9b8f 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -426,7 +426,7 @@ void Room::loadRoomData(const byte *roomData) {
 
 	// Load extra cells
 	_vm->_extraCells.clear();
-	for (const auto extraCell : roomInfo._extraCells)
+	for (const auto &extraCell : roomInfo._extraCells)
 		_vm->_extraCells.push_back(extraCell);
 
 	// Load sounds for the scene
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 3bb5dda3685..13efea5d22d 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -23,6 +23,7 @@
 #include "access/access.h"
 #include "access/resources.h"
 #include "access/scripts.h"
+#include "access/asurface.h"
 #include "access/martian/martian_resources.h"
 #include "access/noctropolis/noctropolis_game.h"
 #include "access/noctropolis/noctropolis_resources.h"
@@ -916,9 +917,9 @@ void Scripts::cmdSetVideo_v3() {
 	_vm->_video->setVideo(_vm->_screen, pt, vidpath, 0);
 
 	if (noFrame == 0) {
-		_vm->_screen->ASurface::drawBox(pt.x - 1, pt.y - 1, pt.x + _vm->_video->getWidth(), pt.y + _vm->_video->getHeight(), 249);
-		_vm->_screen->ASurface::drawBox(pt.x - 2, pt.y - 2, pt.x + _vm->_video->getWidth() + 1, pt.y + _vm->_video->getHeight() + 1, 248);
-		_vm->_screen->ASurface::drawBox(pt.x - 3, pt.y - 3, pt.x + _vm->_video->getWidth() + 2, pt.y + _vm->_video->getHeight() + 2, 247);
+		_vm->_screen->BaseSurface::drawBox(pt.x - 1, pt.y - 1, pt.x + _vm->_video->getWidth(), pt.y + _vm->_video->getHeight(), 249);
+		_vm->_screen->BaseSurface::drawBox(pt.x - 2, pt.y - 2, pt.x + _vm->_video->getWidth() + 1, pt.y + _vm->_video->getHeight() + 1, 248);
+		_vm->_screen->BaseSurface::drawBox(pt.x - 3, pt.y - 3, pt.x + _vm->_video->getWidth() + 2, pt.y + _vm->_video->getHeight() + 2, 247);
 	}
 
 	if (cellIndex == 1 && roomNum == 0x36)


Commit: 33cdfe7917fafe3b4431090f4138d83af1da3835
    https://github.com/scummvm/scummvm/commit/33cdfe7917fafe3b4431090f4138d83af1da3835
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: add debugger command to show hotspots

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/access/debugger.cpp
    engines/access/debugger.h


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 653a501ed95..943950d9a95 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -97,6 +97,7 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_vidX = _vidY = 0;
 	_cheatFl = false;
 	_restartFl = false;
+	_hotspotFl = false;
 	_printEnd = 0;
 	ARRAYCLEAR(_objectsTable);
 	_clearSummaryFlag = false;
@@ -230,7 +231,7 @@ Common::Error AccessEngine::run() {
 
 	setVGA();
 	initialize();
-	
+
 	initObjects();
 	setupGame();
 
@@ -369,6 +370,17 @@ void AccessEngine::printText(BaseSurface *s, const Common::String &msg) {
 	_events->waitKeyActionMouse();
 }
 
+void AccessEngine::addHotspotHighlights() {
+	// find the reddest color in the palette.
+	byte palbuf[Graphics::PALETTE_SIZE];
+	_screen->getPalette(palbuf);
+	Graphics::PaletteLookup lookup;
+	lookup.setPalette(palbuf, 256);
+	byte color = lookup.findBestColor(255, 0, 0);
+	for (const auto &block : _room->_plotter._blocks) {
+		_screen->ASurface::drawBox(block.left, block.top, block.right, block.bottom, color);
+	}
+}
 
 void AccessEngine::plotList() {
 	_player->calcPlayer();
@@ -459,6 +471,9 @@ void AccessEngine::copyRects() {
 		_screen->copyBlock(&_buffer2, rect);
 		_oldRects.push_back(rect);
 	}
+
+	if (_hotspotFl)
+		addHotspotHighlights();
 }
 
 void AccessEngine::copyBF1BF2() {
diff --git a/engines/access/access.h b/engines/access/access.h
index b288092722f..2ed702233d8 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -157,6 +157,11 @@ private:
 	 */
 	void setVGA();
 
+	/**
+	 * Add hotspots to buffer2 for debugging purposes
+	 */
+	void addHotspotHighlights();
+
 protected:
 	const AccessGameDescription *_gameDescription;
 	Common::RandomSource _randomSource;
@@ -292,6 +297,7 @@ public:
 	bool _cheatFl;
 	bool _restartFl;
 	bool _textFlag; // whether subtitles are enabled
+	bool _hotspotFl; // whether hotspot highlighting is enabled (for debug)
 	bool _exitBox; // whether the current hotspot is an exit (Noctropolis only)
 	uint16 _stilScaleOff;
 
diff --git a/engines/access/debugger.cpp b/engines/access/debugger.cpp
index 4d1c9c81c23..539a76ecd0b 100644
--- a/engines/access/debugger.cpp
+++ b/engines/access/debugger.cpp
@@ -75,6 +75,7 @@ Debugger::Debugger(AccessEngine *vm) : GUI::Debugger(), _vm(vm) {
 	registerCmd("ask", WRAP_METHOD(Debugger, Cmd_Ask));
 	registerCmd("inventory", WRAP_METHOD(Debugger, Cmd_Inventory));
 	registerCmd("everything", WRAP_METHOD(Debugger, Cmd_Everything));
+	registerCmd("hotspot", WRAP_METHOD(Debugger, Cmd_Hotspot));
 }
 
 Debugger::~Debugger() {
@@ -359,13 +360,15 @@ bool Debugger::Cmd_Everything(int argc, const char **argv) {
 	// Turn off known-broken/cut locations that exist in the travel table
 	// but you can't go there or going there directly will cause a crash.
 	//
-	const int INVALID_TRAVEL_LOCATIONS[] = {
+	const int MM_INVALID_TRAVEL_LOCATIONS[] = {
 		10, // RESTAURANT
 		12, // LOVE SCENE
 	};
 
-	for (uint i = 0; i < ARRAYSIZE(INVALID_TRAVEL_LOCATIONS); ++i)
-		_vm->_travel[INVALID_TRAVEL_LOCATIONS[i]] = 0;
+	if (_vm->getGameID() == kGameMartianMemorandum) {
+		for (uint i = 0; i < ARRAYSIZE(MM_INVALID_TRAVEL_LOCATIONS); ++i)
+			_vm->_travel[MM_INVALID_TRAVEL_LOCATIONS[i]] = 0;
+	}
 
 	for (uint i = 0; i < ARRAYSIZE(_vm->_ask); ++i)
 		_vm->_ask[i] = 1;
@@ -375,6 +378,12 @@ bool Debugger::Cmd_Everything(int argc, const char **argv) {
 	return true;
 }
 
+bool Debugger::Cmd_Hotspot(int argc, const char **argv) {
+	_vm->_hotspotFl = !_vm->_hotspotFl;
+
+	debugPrintf("Hotspot highlighting %s\n", _vm->_hotspotFl ? "enabled" : "disabled");
+	return true;
+}
 
 
 /*------------------------------------------------------------------------*/
diff --git a/engines/access/debugger.h b/engines/access/debugger.h
index d2f17027853..313daff191f 100644
--- a/engines/access/debugger.h
+++ b/engines/access/debugger.h
@@ -46,6 +46,7 @@ protected:
 	bool Cmd_Ask(int argc, const char **argv);
 	bool Cmd_Inventory(int argc, const char **argv);
 	bool Cmd_Everything(int argc, const char **argv);
+	bool Cmd_Hotspot(int argc, const char **argv);
 
 public:
 	static Debugger *init(AccessEngine *vm);


Commit: 2f36e8064602bdaa08fa1681265b0307f7fc1787
    https://github.com/scummvm/scummvm/commit/2f36e8064602bdaa08fa1681265b0307f7fc1787
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix small Noctropolis bugs

Changed paths:
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/scripts.cpp


diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index b226bd4564c..4db00b56250 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -226,7 +226,7 @@ void NoctropolisRoom::doCommands() {
 		if (hotspotIndex < 0) {
 			hotspotIndex = checkBoxes1(pt);
 			while (hotspotIndex >= 0 && (validateBox(hotspotIndex) & 0x80))
-				hotspotIndex = checkBoxes2(pt, hotspotIndex + 1, 0);
+				hotspotIndex = checkBoxes2(pt, hotspotIndex + 1, _plotter._blocks.size() - hotspotIndex);
 		}
 
 		if (hotspotIndex >= 0) {
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 13efea5d22d..2281788d5cd 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -1376,7 +1376,9 @@ void Scripts::cmdWait() {
 	while (!_vm->shouldQuit() && !_vm->_events->isKeyActionMousePressed() &&
 			_vm->_timers[3]._flag) {
 		_vm->_midi->midiRepeat();
-		charLoop();
+		// Noctropolis does not run room scripts during wait
+		if (_vm->getGameID() != kGameNoctropolis)
+			charLoop();
 
 		_vm->_events->pollEventsAndWait();
 	}


Commit: 2fefed883370c529ac0dcba696c703f2f2c11b83
    https://github.com/scummvm/scummvm/commit/2fefed883370c529ac0dcba696c703f2f2c11b83
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Implement death screens for Noctropolis

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/noctropolis/noctropolis_resources.cpp
    engines/access/noctropolis/noctropolis_resources.h
    engines/access/noctropolis/noctropolis_scripts.cpp
    engines/access/room.cpp
    engines/access/screen.cpp
    engines/access/screen.h
    engines/access/scripts.cpp


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 943950d9a95..1cc5455782a 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -378,7 +378,7 @@ void AccessEngine::addHotspotHighlights() {
 	lookup.setPalette(palbuf, 256);
 	byte color = lookup.findBestColor(255, 0, 0);
 	for (const auto &block : _room->_plotter._blocks) {
-		_screen->ASurface::drawBox(block.left, block.top, block.right, block.bottom, color);
+		_screen->BaseSurface::drawBox(block.left, block.top, block.right, block.bottom, color);
 	}
 }
 
@@ -471,7 +471,9 @@ void AccessEngine::copyRects() {
 		_screen->copyBlock(&_buffer2, rect);
 		_oldRects.push_back(rect);
 	}
+}
 
+void AccessEngine::drawOverlays() {
 	if (_hotspotFl)
 		addHotspotHighlights();
 }
diff --git a/engines/access/access.h b/engines/access/access.h
index 2ed702233d8..167d609b4b6 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -390,6 +390,12 @@ public:
 	bool playMovie(const Common::Path &filename, const Common::Point &pos);
 
 	const AccessActionCode *getActionCodes();
+
+	/**
+	 * Draw additional things on the screen after main rendering
+     */
+	virtual void drawOverlays();
+
 };
 
 } // End of namespace Access
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 2c7c2b3bbd6..507e73091ba 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -152,6 +152,22 @@ void NoctropolisEngine::playGame() {
 	} while (_restartFl);
 }
 
+void NoctropolisEngine::drawOverlays() {
+	AccessEngine::drawOverlays();
+	
+	drawDeathTimer();
+}
+
+void NoctropolisEngine::drawDeathTimer() {
+  if (!_flags[200])
+	return;
+
+	int seconds = _timers[0x12]._timer / 60;
+	Common::String time = Common::String::format("%02d:%02d", seconds / 60, seconds % 60);
+	_screen->fillRect(Common::Rect(0, 384, 47, 399), 0xf6);
+	const Font *font = _fonts.getFont(4);
+	font->drawString(_screen, time, Common::Point(2, 384));
+}
 
 Common::Error NoctropolisEngine::loadGameState(int slot) {
 	_loadFlag = true;
@@ -483,8 +499,10 @@ void NoctropolisEngine::setStilettoPos() {
 
 void NoctropolisEngine::dead(int deathType) {
 	// aka DeadMeat1
-	/*
-	static const struct { int16 x, y; } deathVideoPos[] = {
+
+	Common::String vidfile = Common::String::format("VID2/DEATH%d.VID", deathType + 1);
+
+	static constexpr struct { int16 x, y; } DEAD_COORD[] = {
 		{167, 21},
 		{161, 22},
 		{186, 29},
@@ -495,47 +513,50 @@ void NoctropolisEngine::dead(int deathType) {
 		{227, 0}
 	};
 
+	static constexpr int DEAD_VIDS[] = {
+		3, 0, 0, 0, 0, 0, 5, 6, 7, 1, 1, 2, 6, 4, 3, 3, 0, 3,
+	};
+
+	const char *deathScreenFile =
+		(deathType < 6 || deathType == 9 || deathType == 10 || deathType == 11)
+		 ? "DEATH1.SCN" : "DEATH.SCN";
+
+	const int vidtype = DEAD_VIDS[deathType];
+
+	const Common::Point vidPos(DEAD_COORD[vidtype].x, DEAD_COORD[vidtype].y);
+
+	NoctropolisResources *res = (NoctropolisResources *)_res;
+
 	int16 deathTextX = deathType == 8 ? 80 : 130;
 	int16 deathTextY = deathType == 8 ? 310 : 220;
-	const char *deathScreenBackground =
-		(deathType == 6 || deathType == 12 || deathType == 7 || deathType == 8)
-		? "death1.scn" : "death.scn";
 	const char *deathTextCaption =
 		(deathType == 6 || deathType == 12 || deathType == 7)
-		? "IMPRISONED" : "DEAD";
-	int videoIndex;
+		? res->getImprisonedTitle() : res->getDeathTitle();
 
-	NoctropolisDeathResource *deathTable = new NoctropolisDeathResource();
-	StringResource *deathVideoFilenames = new StringResource();
+	_screen->fadeOut();
+	_midi->loadMusic(98, 39);
+	_midi->midiPlay();
 
-	_res->load(deathTable, GID_NOCTROPOLIS, kResDeathTable, 0);
-	_res->load(deathVideoFilenames, GID_NOCTROPOLIS, kResStringTable, 5);
+	_files->loadScreen(deathScreenFile);
 
-	videoIndex = deathTable->getVideoIndex(deathType);
+	_screen->_printOrg = _screen->_printStart = Common::Point(deathTextX, deathTextY);
+	_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctPlain);
+	_bubbleBox->_bubbleTitle = deathTextCaption;
+	_bubbleBox->placeBubble(res->getDeathText(deathType));
 
-	// TODO: Stop current music and play death music
-	_screen->fadeOut();
+	_screen->fadeIn();
 
-	_vgaScreen->lock();
-	showScreen(deathScreenBackground);
-	drawTextBox(deathTextX, deathTextY, kTextBoxPlain | kTextBoxCaption,
-		deathTable->getText(deathType), deathTextCaption);
-	_vgaScreen->unlock();
+	VideoPlayer_v2 vidPlayer(this);
+	vidPlayer.VideoPlayer::setVideo(_screen, vidPos, Common::Path(vidfile), 0);
+	vidPlayer.playToEnd();
 
-	copySystemPalette();
-	fadeToPalette();
+	_events->waitKeyActionMouse();
 
-	playVideo((const char*)deathVideoFilenames->getString(videoIndex),
-		deathVideoPos[videoIndex].x, deathVideoPos[videoIndex].y, false, false);
+	_screen->fadeOut();
 
-	waitUntilAnyButtonIsClicked();
-	restoreTextBoxRect();
+	_bubbleBox->clearBubbles();
 
-	delete deathTable;
-	delete deathVideoFilenames;
-	*/
-	// TODO: Restart game or something
-	error("TODO: Finish implementing NoctropolisEngine::dead(%d)", deathType);
+	_restartFl = true;
 }
 
 void NoctropolisEngine::initMinigame() {
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index a5d014de1e1..7e1ed4bb359 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -57,6 +57,8 @@ public:
 	int16 getScreenWidth() const override { return 640; }
 	int16 getScreenHeight() const override { return 400; }
 
+	void drawOverlays() override;
+
 	Player *_stil;
 	int _travScrollRow;
 	int _travScrollCol;
@@ -104,6 +106,8 @@ private:
 	void doFlashLogo();
 	void doPublisherLogo();
 	void initVariables();
+
+	void drawDeathTimer();
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_resources.cpp b/engines/access/noctropolis/noctropolis_resources.cpp
index 03fce8f5c1a..85f0f75cbdf 100644
--- a/engines/access/noctropolis/noctropolis_resources.cpp
+++ b/engines/access/noctropolis/noctropolis_resources.cpp
@@ -2137,6 +2137,96 @@ static constexpr const char *MORE_ITEMS_TITLE[4] = {
 	"       MEHR INFO        ",
 };
 
+static constexpr const char *DEATH_TITLE[4] = {
+	"DEAD", "MORT", "MUERTO", "TOT",
+};
+
+static constexpr const char *IMPRISONED_TITLE[4] = {
+	"IMPRISONED", "EMPRISONNE", "PRISIONERO", "EINGESPERRT",
+};
+
+static constexpr const char *NOCT_DEATH_TEXT[4][18] = {
+{
+	"Your strength drained, you collapse to the\nground and die.",
+	"The bullet's impact slams you backward to the\nground. Unable to move, your final moments are\ncontinually interrupted by an intermittent\ngurgle and the amplified pounding of your own\nheartbeat; which is getting slower and slower....",
+	"Incensed by your invasion of its unholy\nterritory, the gargoyle sends you to its maker\nwith a vicious blast of energy that rends the flesh\nfrom your bones. Sounding a harrowing shriek of\ntriumph, the sentinel returns to its perch high above\nthe courtyard.",
+	"A concussive blast shatters your awareness, but not\nbefore registering the distinctly painful sensation\nof dismemberment.",
+	"Moving like a viper, Stiletto impales you upon her\nslender, namesake blade, ending your life with the\npracticed ease of a predator.",
+	"Rendering Stiletto unconscious with a savage blow to the head, the\nSuccubus quickly subdues Father Desmond, gagging him with his own collar.\nTaking the priest's gun, the villainess shoots you once in the stomach,\nthen delightedly empties its magazine into the ornate stained glass\ndisplay, which shatters in a deafening shower of coruscation. Relishing your\nanguish, the Succubus throws your bleeding form across the altar, raises her\nvoice in a mockery of the sacramental blessing, then rips into your body with\nher bare hands. Your final moments of consciousness record the Succubus\ngreedily gorging herself upon a mouthful of your own gory entrails.",
+	"The police take you into custody, ultimately\nplacing you within the medium security wing of the\nNoctropolis City Penitentiary. There, you have the\nmisfortune of attracting the attention of a depraved\ninmate ringleader, who fancies you as his new dance\npartner, among other things.",
+	"The police take you into custody, ultimately\nplacing you within the medium security wing of the\nNoctropolis City Penitentiary. There, you have the\nmisfortune of attracting the attention of a depraved\ninmate ringleader who fancies you as his new dance\npartner, among other things.",
+	"To your horror, a weakened section of the suspended catwalk unexpectedly\nbreaks under your weight. As you plummet to your death, you've barely the time\nto scream your companion's name before the depthless chasm claims you completely.",
+	"Weakened from the effects of Macabre's poisoned gas,\nyou collapse under the creature's ferocious assault.\nProducing a blood-encrusted length of metal pipe, the\nwretch brutally bludgeons you to death.",
+	"Moving collectively, the gang of young ruffians\nsurround you and attack like a pack of wild animals.\nEmploying an arsenal of street weapons, they beat you\nto death by firelight.",
+	"Your lungs and digestive system finally succumb\nto Macabre's poisonous gas. Gasping for breath\nthrough the swollen tissues of your esophagus, you\nsuffocate to death in the wetness of your own vomit.",
+	"Venturing too close to the light, the guards spot you from\ntheir vantage on the catwalk above. They quickly capture\nyou within the observatory. As a result of poor legal\nrepresentation, you are ultimately imprisoned within the\ncity penitentiary for a very long time.",
+	"Gloating over his successful creation of the\nQuintessence, Lumisheer again becomes aware of your presence.\nBrandishing the Node of Brilliance in his fist, he employs its\nstaggering power to obliterate you from existence in a blinding\nflash of light.",
+	"Due to the severe physical trauma and blood loss you've\nsuffered, you can go no further. Gripped in a vice of\ndespair, you die with the sound of Tophat's laughter\nechoing over and over inside the vacuum that fills\nyour mind.",
+	"Macabre returns to his chamber of horrors with a\ndisturbing array of strangely bladed tools and\ncorroded surgical implements. The sadistic psychopath\nslowly butchers you while relating the finer points of\nhuman dissection.",
+	"The poison in your system causes you to convulse in\nviolent seizures that throw you to the ground. The\nspasms gradually diminish while your senses become\ndebilitated and your body goes rigid with paralysis.\nTime becomes immeasurable as you lay in desperate\nagony while the poison ravages your nervous system\nand eventually eats away your brain.",
+	"The poison in your system causes you to convulse in\nviolent seizures that throw you to the ground. The\nspasms gradually diminish while your senses become\ndebilitated and your body goes rigid with paralysis.\nTime becomes immeasurable as you lay in desperate\nagony while the poison ravages your nervous system\nand eventually eats away your brain.",
+},
+{
+	"Vos forces vous abandonnent et vous vous\neffondrez sur le sol avant de mourir.",
+	"L'impact des balles vous fait tomber \x85"" terre.\nIncapable de bouger, vos derniers instants sont\ninterrompus par un gargouillis intermittent\net par le battement amplifi\x82"" de votre coeur.\nIl ralentit de plus en plus...",
+	"Ulc\x82""r\x82""e par votre invasion de son territoire,\nla gargouille vous renvoie vers son Cr\x82""ateur\ndans une intense explosion d'\x82""nergie qui \ncarbonise votre chair sur vos os. Avec un cri de\ntriomphe, la sentinelle retourne se percher\nloin au-dessus de l'entr\x82""e de la cath\x82""drale.",
+	"Vos sens sont alert\x82""s par une \x82""norme explosion\nmais juste avant de ressentir la sensation\ndouloureuse d'un d\x82""membrement.",
+	"Rapide comme un serpent, Stiletto vous empale sur\nsa lame tranchante et impitoyable, mettant fin \x85""\nvos souffrances d'un geste de pr\x82""dateur entra\x8c""n\x82"".",
+	"Assommant Stiletto d'un coup puissant sur la t\x88""te, la Succube s'empare\nrapidement du P\x8a""re Desmond, lui serrant le cou avec son propre col. S'emparant\ndu revolver du pr\x88""tre, elle vous tire une balle dans l'estomac, puis vide avec\nd\x82""lice son chargeur sur les vitraux, qui s'effondrent dans une pluie d'\x82""clats\ntranchants. Savourant votre angoisse, la Succube jette ensuite votre corps\nsanguinolent sur l'autel, prononce une parodie des derniers sacrements, puis\nvous d\x82""chire le corps de ses mains nues. Vos derniers instants de lucidit\x82""\nrestent impr\x82""gn\x82""s de l'image de la Succube se d\x82""lectant \x85"" pleines bouch\x82""es de vos\npropres entrailles.",
+	"La police vous arr\x88""te et vous enferme dans\nle quartier de moyenne s\x82""curit\x82"" du p\x82""nitencier\nmunicipal de Noctropolis. Malheureusement pour\nvous, vous attirez l'attention d'un chef de gang\nd\x82""prav\x82"" qui partage votre cellule, et qui d\x82""cide\nde faire de vous son nouveau cavalier, entre\nautres choses...",
+	"La police vous arr\x88""te et vous enferme dans\nle quartier de moyenne s\x82""curit\x82"" du p\x82""nitencier\nmunicipal de Noctropolis. Malheureusement pour\nvous, vous attirez l'attention d'un chef de gang\nd\x82""prav\x82"" qui partage votre cellule, et qui d\x82""cide\nde faire de vous son nouveau cavalier, entre\nautres choses...",
+	"Vous constatez avec horreur qu'un morceau de la passerelle a soudain c\x82""d\x82"" sous\nvotre poids. En tombant vers votre mort, vous avez \x85"" peine le temps de crier le nom\nde votre compagne avant d'\x88""tre englouti d\x82""finitivement par le gouffre obscur.",
+	"Affaibli par les effets du gaz empoisonn\x82"" de Ma\x8c""tre\nMacabre, vous vous \x82""croulez sous l'assaut f\x82""roce de\nla cr\x82""ature. Arm\x82""e d'un morceau de tuyau m\x82""tallique\ntach\x82"" de sang, elle vous transperce de part en part.",
+	"La bande de jeune malfrats se regroupe pour vous\nentourer et vous attaquer comme une meute d'animaux\nsauvages. Gr\x83""ce \x85"" un arsenal d'armes de rue, ils\nvous battent \x85"" mort dans la lueur du feu de camp.",
+	"Vos poumons et votre syst\x8a""me digestif finissent\npar succomber au gaz empoisonn\x82"" de Macabre. Tentant\nd\x82""sesp\x82""r\x82""ment de respirer \x85"" travers les tissus\nintoxiqu\x82""s de votre oesophage, vous finissez par\nvous \x82""touffer dans vos renvois gastriques.",
+	"Vous vous approchez trop pr\x8a""s de la lumi\x8a""re. Un garde vous\nrep\x8a""re de la passerelle. Ils vous capturent rapidement\ndans l'observatoire. Comme vous \x88""tes mal d\x82""fendu,\nvous finissez emprisonn\x82"" dans le p\x82""nitencier\nmunicipal pour une peine tr\x8a""s longue.",
+	"Admirant sa cr\x82""ation r\x82""ussie de la Quintessence,\nLumisheer se souvient soudain de votre pr\x82""sence.\nBrandissant le Noeud de Brillance dans son poing,\nil utilise son immense pouvoir pour vous faire\ndispara\x8c""tre dans un \x82""clair de lumi\x8a""re aveuglante.",
+	"Apr\x8a""s les traumatismes profonds et le sang que vous\navez perdu, vous ne pouvez pas aller plus loin.\nEntra\x8c""n\x82"" dans un tourbillon de d\x82""sespoir, vous vous\n\x82""teignez en entendant un rire sardonique r\x82""sonner\nsans fin dans le vide qui remplit peu \x85"" peu votre\nt\x88""te.",
+	"Ma\x8c""tre Macabre revient dans sa salle de tortures\navec une panoplie impressionnante d'outils munis de \nlames aux formes \x82""tranges et d'instruments\nchirurgicaux rouill\x82""s. Le psychopathe sadique\nvous charcute lentement tout en vous expliquant\nquels sont les avantages de la dissection humaine.",
+	"Le poison qui vous a intoxiqu\x82"" provoque de violentes\ncrises et des convulsions atroces. Les spasmes\ns'apaisent peu \x85"" peu lorsque vous sentez un\nengourdissement de vos sens et la paralysie qui\ns'empare de votre corps. Le temps ne semble plus\nexister. Vous vous \x82""croulez, impuissant, alors que\nle poison d\x82""truit votre syst\x8a""me nerveux et ronge\nvotre cerveau.",
+	"Le poison qui vous a intoxiqu\x82"" provoque de violentes\ncrises et des convulsions atroces. Les spasmes\ns'apaisent peu \x85"" peu lorsque vous sentez un\nengourdissement de vos sens et la paralysie qui\ns'empare de votre corps. Le temps ne semble plus\nexister. Vous vous \x82""croulez, impuissant, alors que\nle poison d\x82""truit votre syst\x8a""me nerveux et ronge\nvotre cerveau.",
+},
+{
+	"Tus fuerzas se acaban, caes al suelo y\nmueres.",
+	"El impacto de la bala te hace caer.\nNo te puedes mover y en tus instantes finales\nsolo escuchas los cada vez mas debiles latidos\nde tu corazon, que se van haciendo mas y mas\nlentos...",
+	"Irritada por tu entrada en sus predios,\nla gargola te envia al encuentro de tu hacedor\ncon un golpe mortal que separa tu carne de tus\nhuesos. Con un chillido triunfal, el centilela\nregresa a su pedestal, desde la cual vigila la\nentrada de la catedral.",
+	"La explosion acaba con tu vida, pero no sin que\nantes percibas cierta sensacion final de\ndesmembramiento.",
+	"Stiletto se mueve como un felino y te clava\nsu espada, poniendo fin a tus dias con la indiferencia\ndel que aplasta a una mosca.",
+	"Mientras Stiletto esta inconsciente y herida en la cabeza,\nla Succubus se vuelve al Padre Desmond, al que estrangula.\nCon la pistola del sacerdote te dispara al estomago y luego se\ndedica a vaciar el cargador en los ventanales de la catedral,\na los que destroza. Al final coloca tu cuerpo sangrante sobre\nel altar y, mientras se burla de los sacramentos, te despedaza\ncon sus manos. En tus momentos finales recuerdas su risa\nmientras introduce su crueles manos en el interior de tu\ncuerpo para comer de el.",
+	"La policia te arresta y te conduce al sector\nde maxima seguridad de la prision de Noctropolis.\nAlli tienes la desgracia de atraer la atencion de\nun criminal depravado que te convierte en su nueva\npareja de baile, entre otras cosas.",
+	"La policia te arresta y te conduce al sector\nde seguridad media de la prision de Noctropolis.\nAlli tienes la desgracia de atraer la atencion de\nun criminal depravado que te convierte en su nueva\npareja de baile, entre otras cosas.",
+	"Para tu horror, una seccion debil del puente cede bajo\ntu peso. Mientras caes hacia tu muerte, gritas el nombre de\nStiletto y te hundes en la oscuridad del abismo.",
+	"Debilitado por el gas de Macabro, no puedes\nresistir el feroz asalto de la criatura.\nCon un largo estilete de metal, el monstruo\nacaba con tu vida.",
+	"La pandilla de jovenes delincuentes te rodea\ny te ataca como un grupo de animales salvajes.\nUtilizan un verdadero arsenal de armas callejeras\npara acabar con tu vida.",
+	"Tu sistema digestivo acaba por sucumbir a los\nefectos del gas venenoso de Macabro. Vomitas\nlos tejidos de tu esofago y pereces sumido\nen espantosos dolores.",
+	"Cuando te acercas a la luz, los guardias te detectan\ny te capturan con facilidad. Tu mediocre abogado no\nconsigue impedir que te encierren en la prision estatal\npor un periodo prolongado.",
+	"Tras su alegria por la exitosa creacion de la\nQuintaesencia, Luminoso recuerda tu presencia.\nBlandiendo el Nodo de Luz, emplea su poder para borrarte\nde la faz de la tierra.",
+	"Las severas heridas y la perdida de sangre acaban\ncon tus fuerzas. Lo ultimo que escuchas es la risa\ntriunfante de la Diva, y poco a poco el vacio se\napodera de tu mente.",
+	"Macabro regresa a su sala de horrores blandiendo\nsus mohosas herramientas. El sadico psicopata\nte despedaza lentamente mientras describe los pasos\nde su diseccion.",
+	"El veneno te provoca convulsiones que te hacen\ncaer al suelo. Los espasmos van disminuyendo a\nmedida que tu cuerpo se paraliza y queda inconsciente.\nEl tiempo transcurre en una desesperada agonia\nhasta que el veneno acaba por devorar tu cerebro.",
+	"El veneno te provoca convulsiones que te hacen\ncaer al suelo. Los espasmos van disminuyendo a\nmedida que tu cuerpo se paraliza y queda inconsciente.\nEl tiempo transcurre en una desesperada agonia\nhasta que el veneno acaba por devorar tu cerebro.",
+},
+{
+	"Als Deine Kraft schlie\xe1""lich aufgezehrt ist, f\x84""llst Du stumm\nzu Boden und stirbst.",
+	"Der Einschlag der Kugel schleudert Dich r\x81""ckw\x84""rts zu Boden.\nDu bist nicht mehr in der Lage, Dich zu bewegen,\nkannst Deine letzten Augenblicke nur damit verbringen,\nDeinem rasselnden Atem zu lauschen und dem \x81""berlauten Schlag\nDeines Herzens, der langsamer und immer langsamer wird...",
+	"Aufgebracht \x81""ber Dein Eindringen in sein Hoheitsgebiet\nschickt Dich der Gargoyle zu seinem Erschaffer.\nMit einem brutalen Strahl reiner Energie fetzt er Dir das\nFleisch von den Knochen, bevor er mit einem heiser\nkr\x84""chzenden Triumphschrei wieder auf seinen Hochsitz \x81""ber \ndem Kirchhof zur\x81""ckkehrt.",
+	"Ein alles zerfetzender Schlag l\x94""scht Dein Bewu\xe1""tsein aus,\naber nicht schnell genug, um Dir das schmerzhafte Gef\x81""hl des\nZerrissenwerdens zu ersparen.",
+	"Mit den gleitenden Bewegungen einer Viper versenkt Stiletto\ndie schlanke Klinge, deren Namen sie tr\x84""gt, in Deinem K\x94""rper und beendet\nDein Leben mit der erfahrenen Ruhe eines Raubtiers.",
+	"Succubus bet\x84""ubt Stiletto mit einem einzigen, harten\nSchlag auf den Kopf. Dann wendet sie sich gegen Vater Desmond,\nden sie aber schnell besiegt und mit seinem eigenen Kragen erw\x81""rgt.\nMit der Pistole des Priesters schie\xe1""t sie Dir einmal in den Bauch,\nbevor sie mit dem Rest der Munition die Bleiglasfenster\nzertr\x81""mmert, die in einem ohrenbet\x84""ubenden Hagel der Zerst\x94""rung\nzersplittern. Succubus genie\xe1""t Deinen Todeskampf; sie wirft\nDeinen blutenden K\x94""rper auf den Altar und verh\x94""hnt Dich mit\neiner blasphemischen Parodie auf den kirchlichen Opfersegen, bevor\nsie Deinen K\x94""rper mit den blo\xe1""en H\x84""nden zerrei\xe1""t.",
+	"Die Polizei nimmt Dich in Gewahrsam und verfrachtet\nDich in den Hochsicherheitstrakt des Zuchthauses von\nNoctropolis City. Dort hast Du das Pech, die Aufmerksamkeit\ndes einsamen Anf\x81""hrers einer Zuchth\x84""uslerbande zu erregen,\nder Dich von da an - unter anderem - als seine neue \nTanzpartnerin mit Beschlag belegt.",
+	"Die Polizei nimmt Dich in Gewahrsam und verfrachtet\nDich in den Hochsicherheitstrakt des Zuchthauses von\nNoctropolis City. Dort hast Du das Pech, die Aufmerksamkeit\ndes einsamen Anf\x81""hrers einer Zuchth\x84""uslerbande zu erregen,\nder Dich von da an - unter anderem - als seine neue \nTanzpartnerin mit Beschlag belegt.",
+	"Zu Deinem Entsetzen bricht ohne Vorwarnung ein bauf\x84""lliger Teil des Steges unter Deinem Gewicht\nzusammen. W\x84""hrend Du Deinem Tod entgegenst\x81""rzt, hast Du kaum noch Zeit, den Namen Deiner\nPartnerin zu schreien, bevor die bodenlose Tiefe des Abgrundes v\x94""llig von Dir Besitz ergreift.",
+	"Noch geschw\x84""cht von Doktor Makabers Giftgas\nbrichst Du unter dem wilden Angriff der Kreatur zusammen.\nMit einem blutverkrusteten St\x81""ck Bleirohr pr\x81""gelt sie Dich\nbrutal zu Tode.",
+	"Die Bande bewegt sich in gut einge\x81""btem Einklang. Sie\nkreisen Dich ein und greifen wie wilde Tiere an. Mit ihrem\nreichhaltigen Arsenal an Stra\xe1""enwaffen pr\x81""geln sie Dich am\nromantisch flackernden Feuer zu Tode.",
+	"Deine Lungen k\x94""nnen schlie\xe1""lich Doktor Makabers\nGiftgas keinen Widerstand mehr leisten. Du schnappst j\x84""mmerlich\nnach Luft, doch Dein Blut transportiert keinen Sauerstoff mehr\nzu Deinen K\x94""rperzellen, und Du erstickst grausam.",
+	"Du kommst dem Licht zu nahe, und die Wachen oben auf dem\nLaufsteg entdecken Dich. In dem engen Observatorium fangen sie\nDich schnell ein. Als Ergebnis eines ungl\x81""cklich ausgew\x84""hlten\nRechtsbeistandes wirst Du zu einem l\x84""ngeren Aufenthalt in der\nst\x84""dtischen Justizvollzugsanstalt verurteilt. Aber was sind\nschon 20 Jahre f\x81""r einen Superhelden...?",
+	"Als seine Erregung \x81""ber die gelungene Destillation der\nQuintessenz langsam abklingt, bemerkt Lumisheer Deine Anwesenheit\nwieder. Er beschw\x94""rt den Lichtkern in seiner Hand und benutzt seine\nunglaubliche Macht, um Dich mit einem einzigen, blendenden Blitz\nauszul\x94""schen.",
+	"Aufgrund des schweren physischen Traumas und des\nBlutverlustes kannst Du nicht weiter. In den Klauen tiefster\nVerzweiflung gefangen, stirbst Du, w\x84""hrend das widerliche\nLachen von Miss Zylinderchen noch lange in dem Vakuum\nwiderhallt, das einmal Dein Geist war...",
+	"Makaber kehrt mit einer beunruhigenden Sammlung\nmerkw\x81""rdig geformter Messer und rostiger Instrumente in\nseinen OP zur\x81""ck. Der sadistische Psychopath schneidet\nDich langsam in St\x81""cke, w\x84""hrend er Dir im Konversationston\ndie Feinheiten der menschlichen Vivisektion erkl\x84""rt.",
+	"Das Gift in Deinem K\x94""rper hat gewonnen.\nIn f\x81""rchterlichen Kr\x84""mpfen gehst Du zu Boden. Dann\nlassen die Kr\x84""mpfe langsam nach, w\x84""hrend Deine Sinne\nsich vernebeln und das Gift Deinen K\x94""rper l\x84""hmt.\nDie Zeit ersteckt sich ins Unendliche: Du f\x81""hlst in stummer\nAgonie, wie das Gift Dein Nervensystem zersetzt und\nschlie\xe1""lich Dein Gehirn zerfri\xe1""t.",
+	"Das Gift in Deinem K\x94""rper hat gewonnen.\nIn f\x81""rchterlichen Kr\x84""mpfen gehst Du zu Boden. Dann\nlassen die Kr\x84""mpfe langsam nach, w\x84""hrend Deine Sinne\nsich vernebeln und das Gift Deinen K\x94""rper l\x84""hmt.\nDie Zeit ersteckt sich ins Unendliche: Du f\x81""hlst in stummer\nAgonie, wie das Gift Dein Nervensystem zersetzt und\nschlie\xe1""lich Dein Gehirn zerfri\xe1""t.",
+},
+};
 
 const char *NoctropolisResources::getGeneralMessage(int command) const {
 	if (command < 0 || command >= ARRAYSIZE(NOCT_GENERAL_MESSAGES[0]))
@@ -2182,6 +2272,19 @@ const char *NoctropolisResources::getMoreItemsText() const {
 	return MORE_ITEMS_TITLE[_langOffset(_vm->getLanguage())];
 }
 
+const char *NoctropolisResources::getDeathTitle() const {
+	return DEATH_TITLE[_langOffset(_vm->getLanguage())];
+}
+
+const char *NoctropolisResources::getImprisonedTitle() const {
+	return IMPRISONED_TITLE[_langOffset(_vm->getLanguage())];
+}
+
+const char *NoctropolisResources::getDeathText(int num) const {
+	assert(num >= 0 && num < ARRAYSIZE(NOCT_DEATH_TEXT[0]));
+	return NOCT_DEATH_TEXT[_langOffset(_vm->getLanguage())][num];
+}
+
 const ComicResource *NoctropolisResources::getLastComicResource() const {
 	return new ComicResource(LastComicPages, 15);
 }
diff --git a/engines/access/noctropolis/noctropolis_resources.h b/engines/access/noctropolis/noctropolis_resources.h
index af6098ed57b..a690b944719 100644
--- a/engines/access/noctropolis/noctropolis_resources.h
+++ b/engines/access/noctropolis/noctropolis_resources.h
@@ -69,6 +69,9 @@ public:
 	const char *getAskItem(int num) const;
 	const char *getMoreItemsText() const;
 	const char *getPlaceName(int num) const;
+	const char *getDeathTitle() const;
+	const char *getImprisonedTitle() const;
+	const char *getDeathText(int num) const;
 
 	const ComicResource *getLastComicResource() const;
 	const ComicResource *getSpecialComicResource() const;
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index 20d797d1fbd..28e4ba07fae 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -105,8 +105,8 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 		// Clear screen and restore pal here??
 		vm->_screen->fadeOutThenClearAndSetPal();
 		result = true;
-		if (_vm->_player->_roomNumber == 0x36) {
-			error("TODO: Implement special pal hack for fade in room 0x36?");
+		if (_vm->_player->_roomNumber == 54) {
+			error("TODO: Implement special pal hack for fade in room 54?");
 			/*
 			NoctPal_ClearRawPalette();
 			pbVar4 = GetRawPalette();
@@ -174,7 +174,7 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 		result = true;
 		break;
 	default:
-		error("TODO: Unknown special %d in NoctropolisScripts::executeSpecial", commandIndex);
+		error("Unknown special %d in NoctropolisScripts::executeSpecial", commandIndex);
 	}
 	return result;
 }
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index d811c1a9b8f..aeb49e7ba6a 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -309,6 +309,7 @@ void Room::doRoom() {
 					_vm->copyBlocks();
 				}
 			}
+			_vm->drawOverlays();
 		}
 	}
 }
diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp
index 02b9c16445c..b756f65d2f8 100644
--- a/engines/access/screen.cpp
+++ b/engines/access/screen.cpp
@@ -219,10 +219,10 @@ void Screen::copyRawPalToTempPal() {
 }
 
 void Screen::forceFadeOut() {
-	const int FADE_AMOUNT = 2;
-	bool repeatFlag;
+	constexpr int FADE_AMOUNT = 2;
 	byte *srcP;
 	int count;
+	bool repeatFlag;
 
 	do {
 		repeatFlag = false;
@@ -242,7 +242,7 @@ void Screen::forceFadeOut() {
 void Screen::forceFadeIn() {
 	Common::fill(&_tempPalette[0], &_tempPalette[Graphics::PALETTE_SIZE], 0);
 
-	const int FADE_AMOUNT = 2;
+	constexpr int FADE_AMOUNT = 2;
 	bool repeatFlag;
 	do {
 		repeatFlag = false;
@@ -258,7 +258,28 @@ void Screen::forceFadeIn() {
 
 		updatePalette();
 		_vm->_events->pollEventsAndWait();
-	} while (repeatFlag);
+	} while (repeatFlag && !_vm->shouldQuit());
+}
+
+void Screen::forceFadeWhite() {
+	constexpr int FADE_AMOUNT = 2;
+	byte *srcP;
+	int count;
+	bool repeatFlag;
+
+	do {
+		repeatFlag = false;
+		for (srcP = &_tempPalette[0], count = 0; count < Graphics::PALETTE_SIZE; ++count, ++srcP) {
+			int v = *srcP;
+			if (v) {
+				repeatFlag = true;
+				*srcP = MIN((int)*srcP + FADE_AMOUNT, 255);
+			}
+		}
+
+		updatePalette();
+		_vm->_events->pollEventsAndWait();
+	} while (repeatFlag && !_vm->shouldQuit());
 }
 
 void Screen::fadeOutThenClearAndSetPal() {
diff --git a/engines/access/screen.h b/engines/access/screen.h
index ec7abc19b84..7d3e2617a5d 100644
--- a/engines/access/screen.h
+++ b/engines/access/screen.h
@@ -115,6 +115,11 @@ public:
 	 */
 	void forceFadeIn();
 
+	/**
+	 * Fade to white
+	 */
+	void forceFadeWhite();
+
 	void fadeOut() { forceFadeOut(); }
 	void fadeIn() { forceFadeIn(); }
 	void clearScreen();
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 2281788d5cd..729714063d1 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -332,33 +332,31 @@ void Scripts::cmdEndObject() {
 
 void Scripts::cmdEndObject_v3() {
 	if (_vm->_room->_selectCommand == Noctropolis::kNoctCmdTalk && _vm->_boxSelectY == 0x62) {
-		Noctropolis::NoctropolisResources *res = (Noctropolis::NoctropolisResources *)_vm->_res;
-		const char *vidfile = "DARK/VID/A4IN00.VID";
+
+		// Note: removed "DARK/" from these..
+		const char *vidfile = "VID/A4IN00.VID";
 		if (_vm->_flags[91] == 2) {
-			vidfile = "DARK/VID/A4IN26.VID";
+			vidfile = "VID/A4IN26.VID";
 		}
 
 		if (_vm->_textFlag) {
+			Noctropolis::NoctropolisResources *res = (Noctropolis::NoctropolisResources *)_vm->_res;
 			const char *subtitle = res->getEndMessage();
 			if (_vm->_flags[91] == 2) {
 				subtitle = res->getStilMessage();
 			}
-			//NoctRoomEngine::setBoxInfo(&_gNoctRoomEngine,0x46,0xcd,"STILETTO",subtitle,3);
+			_vm->_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctPlain);
+			_vm->_bubbleBox->placeBubble(subtitle);
 		}
 
-		error("TODO: Finish the special case for cmdEndObject_v3");
-		/*
-		// duck the sound here.. SetRelVolume(0x32);
-		_vm->playVideo(100,1 00,vidfile,true,false);
-		gNoctRoomVideo.videoEnd = 0;
-		gNoctRoomVideo.field27_0x2a = 0;
-		gNoctRoomVideo.playState = 1;
-		gNoctRoomVideo.field28_0x2b = 1;
-		gNoctRoomVideo.field25_0x28 = 1;
-		NoctRoomEngine::playRoomVideo(&_gNoctRoomEngine,(bool *)&gNoctRoomVideo.videoEnd);
-		gNoctRoomVideo.playState = 2;
-		NoctRoomSubEngine::acceptControl((NoctRoomSubEngine *)&gNoctRoomVideo);
-		*/
+		warning("TODO: duck the sound here.. SetRelVolume(0x32);");
+
+		VideoPlayer_v2 vidPlayer(_vm);
+		vidPlayer.VideoPlayer::setVideo(_vm->_screen, Common::Point(100, 100), Common::Path(vidfile), 0);
+		vidPlayer.playToEnd();
+
+		_vm->_bubbleBox->clearBubbles();
+
 	} else {
 		const char *msg = _vm->_res->getGeneralMessage(_vm->_room->_selectCommand);
 		debugC(1, kDebugScripts, "cmdEndObject_v3(msg=\"%s\")", msg);
@@ -1756,9 +1754,6 @@ void Scripts::cmdDigitalPlay() {
 		_vm->_events->pollEventsAndWait();
 	}
 
-	if (!_vm->_sound->isSFXPlaying() && !_vm->shouldQuit() && _vm->_textFlag)
-		_vm->_events->waitKeyActionMouse();
-
 	_continuenceFlag = true;
 }
 
@@ -1854,7 +1849,8 @@ void Scripts::cmdSoundEnd() {
 }
 
 void Scripts::cmdFadeWhite() {
-	error("TODO: Implement Scripts::cmdFadeWhite");
+	debugC(1, kDebugScripts, "cmdFadeWhite()");
+	_vm->_screen->forceFadeWhite();
 	_continuenceFlag = true;
 }
 


Commit: 971eea0e5522b317a43945daa54fd148d5511456
    https://github.com/scummvm/scummvm/commit/971eea0e5522b317a43945daa54fd148d5511456
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix various Noctropolis drawing issues

Changed paths:
    engines/access/access.cpp
    engines/access/access.h
    engines/access/animation.cpp
    engines/access/bubble_box.cpp
    engines/access/char.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/noctropolis/noctropolis_player.cpp
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/noctropolis/noctropolis_scripts.cpp
    engines/access/player.cpp
    engines/access/player.h
    engines/access/room.cpp
    engines/access/screen.h
    engines/access/scripts.cpp
    engines/access/video.cpp
    engines/access/video.h


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 1cc5455782a..01453a40f3e 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -115,7 +115,6 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_numLines = 0;
 	_pictureTaken = 0;
 
-	_vidEnd = false;
 	_textFlag = true;
 	_exitBox = false;
 
diff --git a/engines/access/access.h b/engines/access/access.h
index 167d609b4b6..a2176740621 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -292,13 +292,12 @@ public:
 	int _numLines;
 	int _bcnt;
 
-	bool _vidEnd;
 	bool _clearSummaryFlag;
-	bool _cheatFl;
-	bool _restartFl;
-	bool _textFlag; // whether subtitles are enabled
+	bool _cheatFl; 	 // cheats are enabled
+	bool _restartFl; // game should restart
+	bool _textFlag;  // whether subtitles are enabled
 	bool _hotspotFl; // whether hotspot highlighting is enabled (for debug)
-	bool _exitBox; // whether the current hotspot is an exit (Noctropolis only)
+	bool _exitBox;   // whether the current hotspot is an exit (Noctropolis only)
 	uint16 _stilScaleOff;
 
 	// Fields mapped into the flags array
diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index 365f40de027..d2bdee9a91d 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -279,15 +279,46 @@ void Animation::anim12() {
 		int16 deltaY = (frame->_baseY + frame->_parts[0]._position.y) -
 			(prevAnimationFrame->_baseY + prevAnimationFrame->_parts[0]._position.y);
 		int16 xadd = ABS(deltaX) * _vm->_scale / 256;
+		int16 xaddLow = (ABS(deltaX) * _vm->_scale) % 256;
 		int16 yadd = ABS(deltaY) * _vm->_scale / 256;
-		if (deltaX < 0)
-			_vm->_curPlayer->_playerX -= xadd;
-		else
-			_vm->_curPlayer->_playerX += xadd;
-		if (deltaY < 0)
-			_vm->_curPlayer->_playerY -= yadd;
-		else
-			_vm->_curPlayer->_playerY += yadd;
+		int16 yaddLow = (ABS(deltaY) * _vm->_scale) % 256;
+
+		// Original uses "low" parts to do some fixed-point movement
+		// to make scaling slightly smoother.
+		Player *player = _vm->_curPlayer;
+
+		if (deltaX < 0) {
+			player->_playerX -= xadd;
+			player->_playerXLow -= xaddLow;
+			if (player->_playerXLow <= -256) {
+				player->_playerX--;
+				player->_playerXLow += 256;
+			}
+		} else {
+			player->_playerX += xadd;
+			player->_playerXLow += xaddLow;
+			if (player->_playerXLow >= 256) {
+				player->_playerX++;
+				player->_playerXLow -= 256;
+			}
+		}
+
+		if (deltaY < 0) {
+			player->_playerY -= yadd;
+			player->_playerYLow -= yaddLow;
+			if (player->_playerYLow <= -256) {
+				player->_playerY--;
+				player->_playerYLow += 256;
+			}
+		} else {
+			player->_playerY += yadd;
+			player->_playerYLow += yaddLow;
+			if (player->_playerYLow >= 256) {
+				player->_playerY++;
+				player->_playerYLow -= 256;
+			}
+		}
+
 		_countdownTicks += frame->_frameDelay;
 		debugC(kDebugGraphics, "anim12: player pos %d, %d (change %d %d -> %d %d) scale %d", _vm->_curPlayer->_playerX, _vm->_curPlayer->_playerY, deltaX, deltaY, xadd, yadd, _vm->_scale);
 	}
diff --git a/engines/access/bubble_box.cpp b/engines/access/bubble_box.cpp
index 55ccc6b1dee..41b335c867a 100644
--- a/engines/access/bubble_box.cpp
+++ b/engines/access/bubble_box.cpp
@@ -57,12 +57,22 @@ void BubbleBox::load(Common::SeekableReadStream *stream) {
 
 void BubbleBox::clearBubbles() {
 	// Loop through the bubble list to restore the screen areas
-	for (Common::Rect r: _bubbles) {
-		_vm->_screen->_screenYOff = 0;
-		r.left -= 2;
-		r.right = MIN(r.right, (int16)_vm->_screen->w);
+	if (_vm->getGameID() == kGameNoctropolis) {
+		for (Common::Rect r: _bubbles) {
+			_vm->_screen->_screenYOff = 0;
+			r.left -= (MIN((int)r.left, 2) + _vm->_screen->_windowXAdd);
+			r.right = MIN(r.right, (int16)(_vm->_screen->w - _vm->_screen->_windowXAdd));
 
-		_vm->_screen->blitFrom(_vm->_buffer1, r, r);
+			_vm->_screen->copyBlock(&_vm->_buffer2, r);
+		}
+	} else {
+		for (Common::Rect r: _bubbles) {
+			_vm->_screen->_screenYOff = 0;
+			r.left -= 2;
+			r.right = MIN(r.right, (int16)_vm->_screen->w);
+
+			_vm->_screen->copyBlock(&_vm->_buffer1, r);
+		}
 	}
 
 	// Clear the list
@@ -73,6 +83,7 @@ void BubbleBox::placeBubble(const Common::String &msg) {
 	switch (_vm->getGameID()) {
 		case kGameMartianMemorandum: 	_vm->_screen->_maxChars = 30; break;
 		case kGameAmazon: 				_vm->_screen->_maxChars = 27; break;
+		// All Noctropolis messages are pre-wrapped.
 		case kGameNoctropolis: 			_vm->_screen->_maxChars = 200; break;
 	}
 	placeBubble1(msg);
diff --git a/engines/access/char.cpp b/engines/access/char.cpp
index c5d4498dc4d..5e90303a21d 100644
--- a/engines/access/char.cpp
+++ b/engines/access/char.cpp
@@ -108,6 +108,7 @@ void CharManager::loadChar(int charId) {
 		_vm->_screen->fadeIn();
 	}
 
+	// FIXME: This ignores any window on the screen??
 	_vm->_buffer1.blitFrom(*_vm->_screen);
 	_vm->_buffer2.blitFrom(*_vm->_screen);
 	_vm->_screen->setDisplayScan();
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 507e73091ba..d359930ec07 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -154,7 +154,7 @@ void NoctropolisEngine::playGame() {
 
 void NoctropolisEngine::drawOverlays() {
 	AccessEngine::drawOverlays();
-	
+
 	drawDeathTimer();
 }
 
@@ -166,6 +166,8 @@ void NoctropolisEngine::drawDeathTimer() {
 	Common::String time = Common::String::format("%02d:%02d", seconds / 60, seconds % 60);
 	_screen->fillRect(Common::Rect(0, 384, 47, 399), 0xf6);
 	const Font *font = _fonts.getFont(4);
+	Font::_fontColors[0] = 0;
+	Font::_fontColors[1] = 0xf4;
 	font->drawString(_screen, time, Common::Point(2, 384));
 }
 
@@ -265,6 +267,8 @@ void NoctropolisEngine::doIntro() {
 	_midi->loadMusic(98, 1);
 	_midi->midiPlay();
 	_room->loadPlayField(1, 0);
+
+	// This ignores window values, but we know that's ok here.
 	_buffer2.copyFrom(*_screen);
 	_buffer1.copyFrom(*_screen);
 
@@ -374,8 +378,9 @@ void NoctropolisEngine::doTravel() {
 	_buffer2.clear();
 	_screen->clearScreen();
 	_room->loadPlayField(0, 0); // MAP.AP
-	_buffer1.copyFrom(*_screen);
-	_buffer2.copyFrom(*_screen);
+	// FIXME: This ignores window and probably is just plain wrong?
+	//_buffer1.copyFrom(*_screen);
+	//_buffer2.copyFrom(*_screen);
 	_screen->setPalette();
 	_screen->setIconPalette();
 	_scrollRow = _travScrollRow;
@@ -389,7 +394,7 @@ void NoctropolisEngine::doTravel() {
 
 	// This section is "state 1" in NoctTravelEngine::ticker
 	((NoctropolisRoom *)_room)->buildScreenXScroll();
-	_buffer2.copyFrom(_buffer1);
+	copyBF1BF2();
 	copyBF2Vid();
 	_screen->setPaletteCycle(0xb5, 0xbe, 5);
 	_screen->fadeIn();
@@ -699,12 +704,6 @@ void NoctropolisEngine::shotoMeanwhile() {
 	_system->showMouse(true);
 }
 
-void NoctropolisEngine::makeVidPaletteCurrent() {
-	warning("TODO: Implement Noctropolis type video player (makeVidPaletteCurrent)");
-	//copyPaletteRange(_video->getPalette(), 0, 256);
-	_screen->setPalette();
-}
-
 void NoctropolisEngine::showComicCover() {
 	_midi->stopSong();
 	_midi->loadMusic(98, 1);
@@ -722,8 +721,8 @@ void NoctropolisEngine::playSuccubusSplit() {
 	_midi->loadMusic(98, 25);
 	_midi->midiPlay();
 	_screen->clearScreen();
-	VideoPlayer_v2 vidPlayer(this);
-	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(116, 2), Common::Path("VID1/SUCATT1.VID"), 0);
+	VideoPlayer_v2 vidPlayer(this, true);
+	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(116, 2), Common::Path("VID1/SUCSPLT1.VID"), 0);
 	vidPlayer.playToEnd();
 	_midi->stopSong();
 	_screen->fadeOutThenClearAndSetPal();
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index 7e1ed4bb359..96c9233f75c 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -85,7 +85,6 @@ public:
 	void playStilMorph();
 	void flashPaletteEffect();
 	void shotoMeanwhile();
-	void makeVidPaletteCurrent();
 	void showComicCover();
 	void playSuccubusSplit();
 	void playSuccubusAttack();
diff --git a/engines/access/noctropolis/noctropolis_player.cpp b/engines/access/noctropolis/noctropolis_player.cpp
index 08e3c2b1368..a4abda7a1c5 100644
--- a/engines/access/noctropolis/noctropolis_player.cpp
+++ b/engines/access/noctropolis/noctropolis_player.cpp
@@ -97,6 +97,7 @@ void NoctropolisPlayer::updatePlayerDirection() {
 	int scaleEntry = (_vm->_room->_roomFlag & kRoomFlagTopView) ? 4 : 20;
 	int16 minMove = _vm->_screen->_scaleTable1[scaleEntry];
 	if (minMove < absDeltaX) {
+		// Need to move in X
 		if (minMove < absDeltaY) {
 			if (_moveTo.y < _rawPlayer.y) {
 				if (_moveTo.x < _rawPlayer.x) {
@@ -112,6 +113,7 @@ void NoctropolisPlayer::updatePlayerDirection() {
 				}
 			}
 		} else {
+			// Move in x only
 			_rawPlayer.y = _moveTo.y;
 			if (_moveTo.x < _rawPlayer.x) {
 				_playerDirection = LEFT;
@@ -120,6 +122,7 @@ void NoctropolisPlayer::updatePlayerDirection() {
 			}
 		}
 	} else if (minMove < absDeltaY) {
+		// Move in y only
 		_rawPlayer.x = _moveTo.x;
 		if (_moveTo.y < _rawPlayer.y) {
 			_playerDirection = UP;
@@ -127,6 +130,7 @@ void NoctropolisPlayer::updatePlayerDirection() {
 			_playerDirection = DOWN;
 		}
 	} else {
+		// Delta < minMove, stop.
 		_playerDirection = NONE;
 		_rawPlayer.x = _moveTo.x;
 		_rawPlayer.y = _moveTo.y;
@@ -176,6 +180,7 @@ void NoctropolisPlayer::walk() {
 		// Idle animation (using last direction)
 		_playerX = _rawPlayer.x;
 		_playerY = _rawPlayer.y;
+		_playerXLow = _playerYLow = 0;
 		if (_animManager)
 			_animManager->animate(_animNumForDir(_lastDirection) + 8);
 		_playerMove = false;
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 4db00b56250..33c4f91b53a 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -99,6 +99,8 @@ void NoctropolisRoom::reloadRoom1() {
 	vm->_loadFlag = false;
 	_vm->_screen->forceFadeOut();
 	_vm->_screen->clearScreen();
+	_vm->_buffer1.clear();
+	_vm->_buffer2.clear();
 	roomInit();
 	_vm->_player->load();
 
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index 28e4ba07fae..a23b8a81d72 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -104,6 +104,7 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 	case 1:
 		// Clear screen and restore pal here??
 		vm->_screen->fadeOutThenClearAndSetPal();
+		vm->_buffer2.clear();
 		result = true;
 		if (_vm->_player->_roomNumber == 54) {
 			error("TODO: Implement special pal hack for fade in room 54?");
diff --git a/engines/access/player.cpp b/engines/access/player.cpp
index c1e9b720d8f..68882f00f68 100644
--- a/engines/access/player.cpp
+++ b/engines/access/player.cpp
@@ -56,9 +56,9 @@ Player::Player(AccessEngine *vm) : Manager(vm), ImageEntry() {
 	_rawXTemp = 0;
 	_rawYTempL = 0;
 	_rawYTemp = 0;
-	//_playerXLow = 0;
+	_playerXLow = 0;
 	_playerX = 0;
-	//_playerYLow = 0;
+	_playerYLow = 0;
 	_playerY = 0;
 	_frame = 0;
 	_playerOff = false;
diff --git a/engines/access/player.h b/engines/access/player.h
index 4d277d1c086..89eb089ab23 100644
--- a/engines/access/player.h
+++ b/engines/access/player.h
@@ -101,9 +101,9 @@ public:
 	byte _rawYTempL;
 	int _rawYTemp;
 	Common::Point _playerOffset;
-	//int _playerXLow;
+	int _playerXLow;
 	int _playerX;
-	//int _playerYLow;
+	int _playerYLow;
 	int _playerY;
 	int _frame;
 	int _xFlag, _yFlag;
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index aeb49e7ba6a..1d159d3bf0c 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -309,6 +309,7 @@ void Room::doRoom() {
 					_vm->copyBlocks();
 				}
 			}
+
 			_vm->drawOverlays();
 		}
 	}
@@ -987,7 +988,7 @@ int Room::checkBoxes1(const Common::Point &pt) {
 }
 
 int Room::checkBoxes2(const Common::Point &pt, int start, int count) {
-	for (; count > 0; --count, ++start) {
+	for (; count > 0 && start < (int)_plotter._blocks.size(); --count, ++start) {
 		if (_plotter._blocks[start].contains(pt)) {
 			_plotter._blockIn = start;
 			return start;
diff --git a/engines/access/screen.h b/engines/access/screen.h
index 7d3e2617a5d..e525671fdea 100644
--- a/engines/access/screen.h
+++ b/engines/access/screen.h
@@ -68,7 +68,7 @@ public:
 	int _vesaMode;
 	int _startColor, _numColors;
 	Common::Point _bufferStart;
-	int _windowXAdd, _windowYAdd;
+	int _windowXAdd, _windowYAdd; // the offset between the screen and the 2 buffers
 	int _screenYOff;
 	byte _manPal[0x84];
 	byte _stilPal[99]; // only used in Noctropolis
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 729714063d1..43269b04cc0 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -1195,7 +1195,7 @@ void Scripts::cmdPlayerSpeak() {
 	_vm->_screen->_printOrg = _charsOrg;
 	_vm->_screen->_printStart = _charsOrg;
 	_vm->_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctPlain);
-	_vm->_bubbleBox->_bubbleTitle = title;
+	_vm->_bubbleBox->_bubbleDisplStr = title;
 
 	_vm->_bubbleBox->placeBubble(str);
 	_continuenceFlag = true;
@@ -1698,6 +1698,7 @@ void Scripts::cmdBlock() {
 	int w = _data->readSint16LE();
 	int h = _data->readUint16LE();
 	debugC(1, kDebugScripts, "cmdBlock(x=%d, y=%d, w=%d, h=%d)", x, y, w, h);
+	// FIXME: Shouldn't this use copyBlock to apply window correctly?
 	_vm->_screen->blitFrom(_vm->_buffer2, Common::Rect(x, y, x + w, y + h), Common::Point(x, y));
 }
 
@@ -1876,7 +1877,8 @@ void Scripts::cmdRestoreBlock() {
 	int16 h = _data->readSint16LE();
 	debugC(1, kDebugScripts, "cmdRestoreBlock(%d, %d, %d, %d)", x, y, w, h);
 	Common::Rect r(Common::Point(x, y), w, h);
-	_vm->_screen->blitFrom(_vm->_buffer1, r, r);
+	r.translate(-_vm->_screen->_windowXAdd, -_vm->_screen->_windowYAdd);
+	_vm->_screen->copyBlock(&_vm->_buffer2, r);
 
 	// Remake does this, but it doesn't use same buffer setup..
 	//_vm->clearPlotImagesIn(x, y, w, h);
@@ -1885,7 +1887,15 @@ void Scripts::cmdRestoreBlock() {
 
 void Scripts::cmdCopyScnBuf() {
 	debugC(1, kDebugScripts, "cmdCopyScnBuf()");
-	_vm->_buffer1.blitFrom(*_vm->_screen);
+
+	// Copy the screen to the buffer, applying windowing offsets
+	Common::Rect src(_vm->_screen->w, _vm->_screen->h);
+	const Common::Rect screenSize = src;
+	src.translate(_vm->_screen->_windowXAdd, _vm->_screen->_windowYAdd + _vm->_screen->_screenYOff);
+	src.clip(screenSize);
+	Common::Rect dest = src;
+	dest.translate(-dest.left, -dest.top);
+	_vm->_buffer2.blitFrom(*_vm->_screen, src, dest);
 }
 
 void Scripts::cmdStilWalkTo() {
diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index 46a2792f776..44707dfaf55 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -69,7 +69,6 @@ void VideoPlayer::playToEnd() {
 			continue;
 		}
 
-		// TODO: This is not very exact, should calculate expected frame time etc.
 		delayToNextFrame();
 	}
 }
@@ -238,8 +237,8 @@ void VideoPlayer_v1::copyVideo() {
 
 //////////////////////////////////////////////////
 
-VideoPlayer_v2::VideoPlayer_v2(AccessEngine *vm) : VideoPlayer(vm), _audioStream(nullptr),
-_frame(nullptr), _nextFrameTime(0) {
+VideoPlayer_v2::VideoPlayer_v2(AccessEngine *vm, bool setPal) : VideoPlayer(vm), _audioStream(nullptr),
+_frame(nullptr), _nextFrameTime(0), _setPal(setPal), _startMs(0) {
 }
 
 void VideoPlayer_v2::setVideo(const Common::Point &pt) {
@@ -263,6 +262,8 @@ void VideoPlayer_v2::setVideo(const Common::Point &pt) {
 	_frame = new BaseSurface();
 	_frame->create(_header._width, _header._height, Graphics::PixelFormat::createFormatCLUT8());
 
+	_startMs = _vm->_events->getPriorFrameTime();
+
 	debugC(kDebugGraphics, "Load video V2: id = %d, version = %d, frameCount = %d, width = %d, height = %d, frameIncr = %d, unk = %d",
 	  _header._id, _header._version, _header._frameCount, _header._width, _header._height, _header._frameIncr, _header._unk);
 
@@ -320,12 +321,23 @@ void VideoPlayer_v2::playVideo() {
 
 void VideoPlayer_v2::handlePaletteChunk() {
 	debugC(kDebugGraphics, "VideoPlayer_v2::handlePaletteChunk()");
-	_videoData->_stream->read(_palette, 768);
+	byte buf[768];
+	_videoData->_stream->read(buf, 768);
+	if (_setPal) {
+		for (int i = 0; i < 768; i++)
+			buf[i] *= 4;
+		Graphics::Palette pal(buf, 256);
+		_vm->_screen->setRawPalette(pal);
+		_vm->_screen->setPalette();
+		_vm->_screen->copyRawPalToTempPal();
+	}
 }
 
 void VideoPlayer_v2::calcNextFrameTime(int delay) {
-	uint32 lastFrameTime = _vm->_events->getPriorFrameTime();
-	_nextFrameTime = lastFrameTime + (delay * 1000) / 60 + _header._frameIncr * 1000 / 60;
+	if (delay)
+		error("TODO: Implement frame-specific delay %d ms", delay * 1000 / 60);
+	uint32 elapsedForNextFrame = _header._frameIncr * 1000 * (_videoFrame + 1) / 60;
+	_nextFrameTime = _startMs + elapsedForNextFrame;
 }
 
 void VideoPlayer_v2::handleFrameChunk(bool delta, bool skipLines) {
diff --git a/engines/access/video.h b/engines/access/video.h
index f4d7b0179a8..f9a48262af7 100644
--- a/engines/access/video.h
+++ b/engines/access/video.h
@@ -134,8 +134,9 @@ class VideoPlayer_v2 : public VideoPlayer {
 private:
 	VideoHeader _header;
 	BaseSurface *_frame;
-	byte _palette[768];
 	uint32 _nextFrameTime;
+	bool _setPal;
+	uint32 _startMs;
 
 	Audio::QueuingAudioStream *_audioStream;
 	Audio::SoundHandle _audioStreamHandle;
@@ -154,7 +155,7 @@ protected:
 
 	void delayToNextFrame() override;
 public:
-	VideoPlayer_v2(AccessEngine *vm);
+	VideoPlayer_v2(AccessEngine *vm, bool setPal = false);
 
 	void playVideo() override;
 


Commit: 5df868517cf24f7b83190b55bca03d8e830cbf17
    https://github.com/scummvm/scummvm/commit/5df868517cf24f7b83190b55bca03d8e830cbf17
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix compile after rebase

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index d359930ec07..24e885facbc 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -780,8 +780,8 @@ void NoctropolisEngine::stilWalk() {
 	_stil->walk();
 }
 
-void NoctropolisEngine::synchronize(Common::Serializer &s) {
-	AccessEngine::synchronize(s);
+Common::Error NoctropolisEngine::synchronize(Common::Serializer &s) {
+	Common::Error result = AccessEngine::synchronize(s);
 
 	for (int i = 0; i < ARRAYSIZE(_travel); i++)
 		s.syncAsByte(_travel[i]);
@@ -797,6 +797,8 @@ void NoctropolisEngine::synchronize(Common::Serializer &s) {
 		s.syncAsByte(_establishTable[i]);
 
 	_stil->synchronize(s);
+
+	return result;
 }
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index 96c9233f75c..cd91e63f644 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -98,7 +98,7 @@ protected:
 	/**
 	* Synchronize savegame data
 	*/
-	void synchronize(Common::Serializer &s) override;
+	Common::Error synchronize(Common::Serializer &s) override;
 
 private:
 	void doIntro();


Commit: 25e01f341191d20e76b9276e981d1d05bd7f79d8
    https://github.com/scummvm/scummvm/commit/25e01f341191d20e76b9276e981d1d05bd7f79d8
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Follow per-frame delays in Noctropolis

Changed paths:
    engines/access/video.cpp
    engines/access/video.h


diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index 44707dfaf55..069c13a2b57 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -263,6 +263,7 @@ void VideoPlayer_v2::setVideo(const Common::Point &pt) {
 	_frame->create(_header._width, _header._height, Graphics::PixelFormat::createFormatCLUT8());
 
 	_startMs = _vm->_events->getPriorFrameTime();
+	_delayTotal = 0;
 
 	debugC(kDebugGraphics, "Load video V2: id = %d, version = %d, frameCount = %d, width = %d, height = %d, frameIncr = %d, unk = %d",
 	  _header._id, _header._version, _header._frameCount, _header._width, _header._height, _header._frameIncr, _header._unk);
@@ -335,9 +336,9 @@ void VideoPlayer_v2::handlePaletteChunk() {
 
 void VideoPlayer_v2::calcNextFrameTime(int delay) {
 	if (delay)
-		error("TODO: Implement frame-specific delay %d ms", delay * 1000 / 60);
+		_delayTotal += delay;
 	uint32 elapsedForNextFrame = _header._frameIncr * 1000 * (_videoFrame + 1) / 60;
-	_nextFrameTime = _startMs + elapsedForNextFrame;
+	_nextFrameTime = _startMs + _delayTotal * 1000 / 60 + elapsedForNextFrame;
 }
 
 void VideoPlayer_v2::handleFrameChunk(bool delta, bool skipLines) {
diff --git a/engines/access/video.h b/engines/access/video.h
index f9a48262af7..a252ea79d29 100644
--- a/engines/access/video.h
+++ b/engines/access/video.h
@@ -137,6 +137,7 @@ private:
 	uint32 _nextFrameTime;
 	bool _setPal;
 	uint32 _startMs;
+	uint32 _delayTotal;
 
 	Audio::QueuingAudioStream *_audioStream;
 	Audio::SoundHandle _audioStreamHandle;


Commit: 05eed7cb3c9641d8776687c7747977b4490af5ad
    https://github.com/scummvm/scummvm/commit/05eed7cb3c9641d8776687c7747977b4490af5ad
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix switching to Darksheer in Noctropolis

Changed paths:
    engines/access/events.cpp
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/noctropolis/noctropolis_room.h
    engines/access/noctropolis/noctropolis_scripts.cpp


diff --git a/engines/access/events.cpp b/engines/access/events.cpp
index e25ace1e374..daa4a20367b 100644
--- a/engines/access/events.cpp
+++ b/engines/access/events.cpp
@@ -28,6 +28,7 @@
 #include "access/events.h"
 #include "access/player.h"
 #include "access/amazon/amazon_resources.h"
+#include "access/noctropolis/noctropolis_game.h"
 
 namespace Access {
 
@@ -311,6 +312,8 @@ void EventsManager::nextTimer() {
 	_vm->_animation->updateTimers();
 	_vm->_timers.updateTimers();
 	_vm->_player->updateTimers();
+	if (_vm->getGameID() == kGameNoctropolis)
+		((Noctropolis::NoctropolisEngine *)_vm)->_stil->updateTimers();
 }
 
 void EventsManager::delay(int time) {
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 33c4f91b53a..69511c4ae14 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -37,7 +37,12 @@ NoctropolisRoom::NoctropolisRoom(AccessEngine *vm): Room(vm) {
 void NoctropolisRoom::reloadRoom() {
 	loadRoom(_vm->_player->_roomNumber);
 
-	// This is LoadPlayer1
+	loadPlayer1();
+
+	reloadRoom1();
+}
+
+void NoctropolisRoom::loadPlayer1() {
 	int subFileBase = 1;
 	int numSubFiles = -1;
 	int objBase = -1;
@@ -58,6 +63,7 @@ void NoctropolisRoom::reloadRoom() {
 				fileNum = 0xff;
 			}
 		} else {
+			// kRoomFlagNoPlayer.
 		}
 	} else {
 		// Top
@@ -76,8 +82,6 @@ void NoctropolisRoom::reloadRoom() {
 			_vm->_objectsTable[objBase + i - subFileBase] = new SpriteResource(_vm, data);
 		}
 	}
-
-	reloadRoom1();
 }
 
 void NoctropolisRoom::reloadRoom1() {
diff --git a/engines/access/noctropolis/noctropolis_room.h b/engines/access/noctropolis/noctropolis_room.h
index dc3690dfe57..3f3686f23b1 100644
--- a/engines/access/noctropolis/noctropolis_room.h
+++ b/engines/access/noctropolis/noctropolis_room.h
@@ -41,6 +41,8 @@ public:
 	 */
 	void buildScreenXScroll();
 
+	void loadPlayer1();
+
 protected:
 	void reloadRoom() override;
 
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index a23b8a81d72..e1efcfcf0bf 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -21,6 +21,7 @@
 
 #include "access/noctropolis/noctropolis_scripts.h"
 #include "access/noctropolis/noctropolis_game.h"
+#include "access/noctropolis/noctropolis_room.h"
 
 namespace Access {
 
@@ -126,8 +127,11 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 	case 5:
 		vm->playSuccubusAttack();
 		break;
-	case 6:
-		error("TODO: Special 6: Load DARKSHEER player!");
+	case 6: // Set player model
+		((NoctropolisRoom *)vm->_room)->loadPlayer1();
+		_vm->_player->load();
+		_vm->_screen->setManPalette();
+		_vm->_screen->setPalette();
 	case 7:
 		vm->_midi->loadMusic(98, param1);
 		break;


Commit: 8d91a3a9f5cd3c88f9a98cdf031a8f39f10095a7
    https://github.com/scummvm/scummvm/commit/8d91a3a9f5cd3c88f9a98cdf031a8f39f10095a7
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix player direction usage in Noctropolis

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_player.cpp
    engines/access/noctropolis/noctropolis_player.h
    engines/access/player.h
    engines/access/scripts.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 24e885facbc..cc8dbcb82aa 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -665,8 +665,9 @@ void NoctropolisEngine::playStilMorph() {
 	_midi->midiPlay();
 	_screen->fadeOut();
 	_screen->clearScreen();
-	warning("TODO: Implement Noctropolis type video player");
-	//playVideo("VID1/DRLM00.VID", 118, 118, true, true, true);
+	VideoPlayer_v2 vidPlayer(this, true);
+	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(118, 118), Common::Path("VID1/DRLM00.VID"), 0);
+	vidPlayer.playToEnd();
 }
 
 void NoctropolisEngine::flashPaletteEffect() {
@@ -684,7 +685,7 @@ void NoctropolisEngine::shotoMeanwhile() {
 	_screen->clearScreen();
 	// TODO: Check these colors
 	Font::_fontColors[0] = 0;
-	Font::_fontColors[3] = 244;
+	Font::_fontColors[1] = 244;
 	const char *meanwhileTxt = ((NoctropolisResources *)_res)->getMeanwhileMessage();
 	_fonts._fonts[3]->drawString(_screen, meanwhileTxt, Common::Point(100, 200));
 	_screen->fadeIn();
@@ -694,11 +695,12 @@ void NoctropolisEngine::shotoMeanwhile() {
 	_screen->clearScreen();
 	_screen->_printOrg = _screen->_printStart = Common::Point(300, 300);
 	_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctPlain);
-	_bubbleBox->_bubbleTitle = ((NoctropolisResources *)_res)->getShotoTitle();
+	_bubbleBox->_bubbleDisplStr = ((NoctropolisResources *)_res)->getShotoTitle();
 	_bubbleBox->placeBubble(((NoctropolisResources *)_res)->getShotoText());
 	_events->waitKeyActionMouse();
-	warning("TODO: Implement Noctropolis type video player (shotoMeanwhile)");
-	//_video->setVideo(_screen, Common::Point(120, 30), "VID1/B126MEAN.VID", 10); //, , false, true, true);
+	VideoPlayer_v2 vidPlayer(this, true);
+	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(120, 30), Common::Path("VID1/B126MEAN.VID"), 0);
+	vidPlayer.playToEnd();
 	_midi->stopSong();
 	_screen->fadeOut();
 	_system->showMouse(true);
@@ -748,7 +750,6 @@ void NoctropolisEngine::playSuccubusAttack() {
 	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(196, 96), Common::Path ("VID1/SUCATT2.VID"), 0);
 	vidPlayer.playToEnd();
 
-	//playVideo("VID1\\SUCATT2.VID", 196, 96, false, false);
 	_sound->playSound(1);
 	_midi->stopSong();
 	_screen->fadeOutThenClearAndSetPal();
diff --git a/engines/access/noctropolis/noctropolis_player.cpp b/engines/access/noctropolis/noctropolis_player.cpp
index a4abda7a1c5..c3d0043a567 100644
--- a/engines/access/noctropolis/noctropolis_player.cpp
+++ b/engines/access/noctropolis/noctropolis_player.cpp
@@ -214,6 +214,22 @@ void NoctropolisPlayer::walk() {
 	}
 }
 
+void NoctropolisPlayer::setDirFromScript(byte newDir) {
+	// The opposite of _animNumForDir above.
+	switch (newDir) {
+	case 0: _playerDirection = UP;
+	case 1: _playerDirection = UPRIGHT;
+	case 2: _playerDirection = RIGHT;
+	case 3: _playerDirection = DOWNRIGHT;
+	case 4: _playerDirection = DOWN;
+	case 5: _playerDirection = DOWNLEFT;
+	case 6: _playerDirection = LEFT;
+	case 7: _playerDirection = UPLEFT;
+	default: _playerDirection = NONE;
+	}
+}
+
+
 void NoctropolisPlayer::synchronize(Common::Serializer &s) {
 	Player::synchronize(s);
 	s.syncAsSint16LE(_moveTo.x);
diff --git a/engines/access/noctropolis/noctropolis_player.h b/engines/access/noctropolis/noctropolis_player.h
index 636e7468679..e43f7eeeb03 100644
--- a/engines/access/noctropolis/noctropolis_player.h
+++ b/engines/access/noctropolis/noctropolis_player.h
@@ -55,6 +55,8 @@ public:
 	void updateTimers() override;
 
 	void synchronize(Common::Serializer &s) override;
+
+	void setDirFromScript(byte newDir) override;
 };
 
 } // End of namespace Noctropolis
diff --git a/engines/access/player.h b/engines/access/player.h
index 89eb089ab23..f597b2e9130 100644
--- a/engines/access/player.h
+++ b/engines/access/player.h
@@ -159,6 +159,8 @@ public:
 	* Synchronize savegame data
 	*/
 	virtual void synchronize(Common::Serializer &s);
+
+	virtual void setDirFromScript(byte newDir) { _playerDirection = (Direction)newDir; }
 };
 
 } // End of namespace Access
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 43269b04cc0..5f40024f039 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -1821,7 +1821,7 @@ void Scripts::cmdWalkTo() {
 
 	_vm->_player->_moveTo.x = x;
 	_vm->_player->_moveTo.y = y;
-	_vm->_player->_playerDirection = (Direction)dir;
+	_vm->_player->setDirFromScript(dir);
 	_vm->_player->_move = (Direction)dir;
 	_vm->_player->_playerMove = true;
 }
@@ -1906,6 +1906,7 @@ void Scripts::cmdStilWalkTo() {
 
 	((Noctropolis::NoctropolisEngine*)_vm)->_stil->_moveTo.x = x;
 	((Noctropolis::NoctropolisEngine*)_vm)->_stil->_moveTo.y = y;
+	((Noctropolis::NoctropolisEngine*)_vm)->_stil->setDirFromScript(dir);
 	((Noctropolis::NoctropolisEngine*)_vm)->_stil->_move = (Direction)dir;
 	((Noctropolis::NoctropolisEngine*)_vm)->_stil->_playerMove = true;
 }
@@ -1964,18 +1965,21 @@ void Scripts::cmdSetStilCoords() {
 }
 
 void Scripts::cmdSetPlayerDir() {
-	debugC(1, kDebugScripts, "cmdSetPlayerDir()");
-	_vm->_player->_playerDirection = (Direction)_data->readByte();
+	byte dir = _data->readByte();
+	debugC(1, kDebugScripts, "cmdSetPlayerDir(%d)", dir);
+	_vm->_player->setDirFromScript(dir);
 }
 
 void Scripts::cmdSetStilDir() {
-	debugC(1, kDebugScripts, "cmdSetStilDir()");
-	((Noctropolis::NoctropolisEngine *)_vm)->_stil->_playerDirection = (Direction)_data->readByte();
+	byte dir = _data->readByte();
+	debugC(1, kDebugScripts, "cmdSetStilDir(%d)", dir);
+	((Noctropolis::NoctropolisEngine *)_vm)->_stil->setDirFromScript(dir);
 }
 
 void Scripts::cmdStilScale() {
-	debugC(1, kDebugScripts, "cmdStilScale()");
-	_vm->_stilScaleOff = _data->readUint16LE();
+	short scale = _data->readUint16LE();
+	debugC(1, kDebugScripts, "cmdStilScale(%d)", scale);
+	_vm->_stilScaleOff = scale;
 }
 
 void Scripts::cmdLockInterface() {


Commit: 1db9c762d860203a49906e3d5a330a02631a88a8
    https://github.com/scummvm/scummvm/commit/1db9c762d860203a49906e3d5a330a02631a88a8
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Remove member var that can just be local

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


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 01453a40f3e..6962d96f246 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -74,7 +74,6 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc)
 	_scaleI = 0;
 	_scrollCol = _scrollRow = 0;
 	_scrollX = _scrollY = 0;
-	_imgUnscaled = false;
 	_canSaveLoad = false;
 	_establish = nullptr;
 
@@ -390,13 +389,13 @@ void AccessEngine::plotList1() {
 	for (uint idx = 0; idx < _images.size(); ++idx) {
 		ImageEntry &ie = _images[idx];
 
-		_imgUnscaled = (ie._flags & IMGFLAG_UNSCALED) != 0;
+		bool imgUnscaled = (ie._flags & IMGFLAG_UNSCALED) != 0;
 		Common::Point pt = ie._position - _screen->_bufferStart;
 		const SpriteResource *sprites = ie._spritesPtr;
 		const SpriteFrame *frame = sprites->getFrame(ie._frameNumber);
 
 		Common::Rect bounds(pt.x, pt.y, pt.x + frame->w, pt.y + frame->h);
-		if (!_imgUnscaled) {
+		if (!imgUnscaled) {
 			bounds.setWidth(_screen->_scaleTable1[frame->w]);
 			bounds.setHeight(_screen->_scaleTable1[frame->h]);
 		}
@@ -415,7 +414,7 @@ void AccessEngine::plotList1() {
 
 			_newRects.push_back(bounds);
 
-			if (!_imgUnscaled) {
+			if (!imgUnscaled) {
 				_buffer2._rightSkip /= _scale;
 				bounds.setWidth(bounds.width() / _scale);
 
diff --git a/engines/access/access.h b/engines/access/access.h
index a2176740621..a7525d1644d 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -256,7 +256,6 @@ public:
 	int _scaleI;
 	int _scrollX, _scrollY;
 	int _scrollCol, _scrollRow;
-	bool _imgUnscaled;
 	bool _canSaveLoad;
 
 	Resource *_establish;


Commit: c368cd658c6ae75012dd8dc4858f73bf8e670fe2
    https://github.com/scummvm/scummvm/commit/c368cd658c6ae75012dd8dc4858f73bf8e670fe2
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Allow video skip while interface is off

Changed paths:
    engines/access/events.cpp


diff --git a/engines/access/events.cpp b/engines/access/events.cpp
index daa4a20367b..3d88141652d 100644
--- a/engines/access/events.cpp
+++ b/engines/access/events.cpp
@@ -238,7 +238,8 @@ void EventsManager::actionControl(Common::CustomEventType action, bool isKeyDown
 		return;
 	}
 
-	if (_interfaceOff)
+	// Ignore all actions except skip when the inteface is locked.
+	if (_interfaceOff && action != kActionSkip)
 		return;
 
 	_action = action;


Commit: 462d9f12db8802550c0bf24e67fc3a0ec005ad80
    https://github.com/scummvm/scummvm/commit/462d9f12db8802550c0bf24e67fc3a0ec005ad80
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix small stil scale issues

Changed paths:
    engines/access/animation.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_player.cpp
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/player.cpp


diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index d2bdee9a91d..b9afa8b9181 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -259,6 +259,8 @@ void Animation::anim11() {
 	const AnimationFrame *frame = calcFrame();
 	_countdownTicks += frame->_frameDelay;
 	_scaling = _vm->_scale;
+	debugC(kDebugGraphics, "anim11: idle %s scale %d (%d, %d) yoffset %d", (_vm->_curPlayer == _vm->_player ? "peter" : "stil"),
+		_vm->_scale, _vm->_curPlayer->_playerX, _vm->_curPlayer->_playerY, _vm->_curPlayer->_playerOffset.y);
 	setFrame1(frame, _vm->_curPlayer->_playerX, _vm->_curPlayer->_playerY - _vm->_curPlayer->_playerOffset.y);
 }
 
@@ -320,7 +322,8 @@ void Animation::anim12() {
 		}
 
 		_countdownTicks += frame->_frameDelay;
-		debugC(kDebugGraphics, "anim12: player pos %d, %d (change %d %d -> %d %d) scale %d", _vm->_curPlayer->_playerX, _vm->_curPlayer->_playerY, deltaX, deltaY, xadd, yadd, _vm->_scale);
+
+		debugC(kDebugGraphics, "anim12: %s pos %d, %d yoff %d (change %d %d -> %d %d) scale %d", (_vm->_curPlayer == _vm->_player ? "peter" : "stil"), _vm->_curPlayer->_playerX, _vm->_curPlayer->_playerY, _vm->_curPlayer->_playerOffset.y, deltaX, deltaY, xadd, yadd, _vm->_scale);
 	}
 	_scaling = _vm->_scale;
 	setFrame1(frame, _vm->_curPlayer->_playerX, _vm->_curPlayer->_playerY - _vm->_curPlayer->_playerOffset.y);
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index cc8dbcb82aa..a0ce9ba8d93 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -90,7 +90,7 @@ void NoctropolisEngine::initVariables() {
 	_inventory->_startInvBox = 0;
 	Common::fill(&_objectsTable[0], &_objectsTable[128], (SpriteResource *)nullptr);
 	_player->_playerOff = false;
-	debug("TODO: set player starting point - using first _TravManPos entry for now");
+	debug("TODO: set player starting point? using first _TravManPos entry for now");
 	_player->_playerX = _player->_rawPlayer.x = _player->_moveTo.x = 280;
 	_player->_playerY = _player->_rawPlayer.y = _player->_moveTo.y = 390;
 	_room->_selectCommand = -1;
diff --git a/engines/access/noctropolis/noctropolis_player.cpp b/engines/access/noctropolis/noctropolis_player.cpp
index c3d0043a567..9b0e25341cf 100644
--- a/engines/access/noctropolis/noctropolis_player.cpp
+++ b/engines/access/noctropolis/noctropolis_player.cpp
@@ -138,7 +138,12 @@ void NoctropolisPlayer::updatePlayerDirection() {
 }
 
 void NoctropolisPlayer::calcManScale() {
-	if (!_vm->_player->_playerOff) {
+	// Note: original does _vm->_player->_playerOff check here, but that
+	// makes no sense - should check for the current player's on/off value surely?
+
+	// If we don't do this, Stil warps in at the wrong size/offset after we
+	// defeat the succubus becuase her _playerOffset is never configured.
+	if (!_playerOff) {
 		calcManScale1();
 	}
 }
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 69511c4ae14..4cc0a03de4c 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -291,7 +291,8 @@ int NoctropolisRoom::checkPlayerBox(const Common::Point &pt) {
 		}
 	}
 
-	if (_vm->_flags[0xcd] == 1 || (_roomFlag & kRoomFlagStiletto) == 0 || _vm->_flags[0xea] != 2)
+	// These flags are vm->_stilFlag1 and vm->_stilFlag2
+	if (_vm->_flags[205] == 1 || (_roomFlag & kRoomFlagStiletto) == 0 || _vm->_flags[234] != 2)
 		return 1;
 
 	Player *stil = ((NoctropolisEngine *)_vm)->_stil;
@@ -308,12 +309,12 @@ int NoctropolisRoom::checkPlayerBox(const Common::Point &pt) {
 						 / (uint)_vm->_scaleH1) >> 8);
 	}
 	_vm->_screen->setScaleTable(_vm->_scale);
-	_vm->_player->_playerOffset.y = _vm->_screen->_scaleTable1[180];
-	_vm->_player->_playerOffset.x = _vm->_screen->_scaleTable1[60];
+	stil->_playerOffset.y = _vm->_screen->_scaleTable1[180];
+	stil->_playerOffset.x = _vm->_screen->_scaleTable1[60];
 	if (pt.x < stil->_rawPlayer.x || stil->_rawPlayer.y < pt.y)
 		return 1;
 
-	if ((stil->_rawPlayer.y - _vm->_player->_playerOffset.y) <= pt.y && (pt.x <= (_vm->_player->_playerOffset.x + stil->_rawPlayer.x))) {
+	if ((stil->_rawPlayer.y - stil->_playerOffset.y) <= pt.y && (pt.x <= (stil->_playerOffset.x + stil->_rawPlayer.x))) {
 		_plotter._blockIn = 98;
 		return 0;
 	}
diff --git a/engines/access/player.cpp b/engines/access/player.cpp
index 68882f00f68..357300e0b49 100644
--- a/engines/access/player.cpp
+++ b/engines/access/player.cpp
@@ -114,7 +114,7 @@ void Player::load() {
 	_walkOffDL = new Common::Point[dataCount];
 
 	// NOTE: Although the values get set here to Amazon defaults, they are overridden
-	// in both AmazonPlayer and MartianPlayer load() functions.
+	// in all the sub-class load() functions.
 	_playerOffset.x = _vm->_screen->_scaleTable1[25];
 	_playerOffset.y = _vm->_screen->_scaleTable1[67];
 	_leftDelta = -3;


Commit: eb3ce5e5bece04c8123c5505ca6f9164b9b9fcd7
    https://github.com/scummvm/scummvm/commit/eb3ce5e5bece04c8123c5505ca6f9164b9b9fcd7
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix Noctropolis Shoto cutscene

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index a0ce9ba8d93..1e9ab512ca3 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -683,7 +683,6 @@ void NoctropolisEngine::shotoMeanwhile() {
 	_midi->midiPlay();
 	_screen->fadeOut();
 	_screen->clearScreen();
-	// TODO: Check these colors
 	Font::_fontColors[0] = 0;
 	Font::_fontColors[1] = 244;
 	const char *meanwhileTxt = ((NoctropolisResources *)_res)->getMeanwhileMessage();
@@ -697,11 +696,13 @@ void NoctropolisEngine::shotoMeanwhile() {
 	_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctPlain);
 	_bubbleBox->_bubbleDisplStr = ((NoctropolisResources *)_res)->getShotoTitle();
 	_bubbleBox->placeBubble(((NoctropolisResources *)_res)->getShotoText());
-	_events->waitKeyActionMouse();
 	VideoPlayer_v2 vidPlayer(this, true);
 	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(120, 30), Common::Path("VID1/B126MEAN.VID"), 0);
+	_screen->setIconPalette();
+	_screen->setPalette();
 	vidPlayer.playToEnd();
 	_midi->stopSong();
+	_screen->copyRawPalToTempPal();
 	_screen->fadeOut();
 	_system->showMouse(true);
 }


Commit: 957cf0a63445be6ecf742b3dcab8020b7e124a9a
    https://github.com/scummvm/scummvm/commit/957cf0a63445be6ecf742b3dcab8020b7e124a9a
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix Noctropolis Stiletto scaling

Changed paths:
    engines/access/access.cpp
    engines/access/animation.cpp
    engines/access/asurface.cpp
    engines/access/asurface.h


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 6962d96f246..8b1f5a2d76d 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -396,13 +396,15 @@ void AccessEngine::plotList1() {
 
 		Common::Rect bounds(pt.x, pt.y, pt.x + frame->w, pt.y + frame->h);
 		if (!imgUnscaled) {
-			bounds.setWidth(_screen->_scaleTable1[frame->w]);
-			bounds.setHeight(_screen->_scaleTable1[frame->h]);
+			int sizex = ie._sizeOverride.x ? ie._sizeOverride.x : _screen->_scaleTable1[frame->w];
+			int sizey = ie._sizeOverride.y ? ie._sizeOverride.y : _screen->_scaleTable1[frame->h];
+			bounds.setWidth(sizex);
+			bounds.setHeight(sizey);
 		}
 
 		// Make a copy - some of the drawing methods I've adapted need the full
 		// scaled dimensions on-screen, and handle clipping themselves
-		Common::Rect destBounds = bounds;
+		const Common::Rect destBounds = bounds;
 
 		if (_buffer2.clip(bounds)) {
 			ie._flags |= IMGFLAG_CROPPED;
@@ -415,8 +417,9 @@ void AccessEngine::plotList1() {
 			_newRects.push_back(bounds);
 
 			if (!imgUnscaled) {
-				_buffer2._rightSkip /= _scale;
-				bounds.setWidth(bounds.width() / _scale);
+				int scale = ie._scaleOverride ? ie._scaleOverride : _scale;
+				_buffer2._rightSkip /= scale;
+				bounds.setWidth(bounds.width() / scale);
 
 				if (ie._flags & IMGFLAG_BACKWARDS) {
 					_buffer2.sPlotB(frame, destBounds);
diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index b9afa8b9181..c2922b6f701 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -363,9 +363,16 @@ void Animation::setFrame1(const AnimationFrame *frame, int16 xoff, int16 yoff) {
 		ie._position.x = xoff ? xoff : (part._position.x + _vm->_animation->_base.x);
 		ie._position.y = yoff ? yoff : (part._position.y + _vm->_animation->_base.y);
 		if (xoff && _scaling != -1) {
-			// If xoff is set, the animation is for an actor so we need to apply scale factor
-			// to frame height for priority.
+			// If xoff is set, the animation is for an actor so we need to apply scale
+			// factor to frame offset for priority.  We also need to determine its size
+			// now so Stiletto and Peter can have different scale factors in Noctropolis
 			ie._offsetY = (part._offsetY - frame->_baseY - part._position.y) * _scaling / 256;
+			ie._scaleOverride = _scaling;
+			const SpriteFrame *frame = ie._spritesPtr->getFrame(ie._frameNumber);
+			ie._sizeOverride = Common::Point(
+				_vm->_screen->_scaleTable1[frame->w],
+				_vm->_screen->_scaleTable1[frame->h]
+			);
 		} else {
 			ie._offsetY = part._offsetY - ie._position.y;
 		}
diff --git a/engines/access/asurface.cpp b/engines/access/asurface.cpp
index ac95244c992..1d77533cb6b 100644
--- a/engines/access/asurface.cpp
+++ b/engines/access/asurface.cpp
@@ -101,7 +101,7 @@ SpriteFrame::~SpriteFrame() {
 
 /*------------------------------------------------------------------------*/
 
-ImageEntry::ImageEntry() : _frameNumber(0), _spritesPtr(nullptr), _offsetY(0), _flags(0) {
+ImageEntry::ImageEntry() : _frameNumber(0), _spritesPtr(nullptr), _offsetY(0), _flags(0), _scaleOverride(0) {
 }
 
 /*------------------------------------------------------------------------*/
diff --git a/engines/access/asurface.h b/engines/access/asurface.h
index bd252ca7923..08087c6011f 100644
--- a/engines/access/asurface.h
+++ b/engines/access/asurface.h
@@ -170,6 +170,8 @@ public:
 	int _offsetY; // offset to apply to y position when sorting draw order
 	Common::Point _position;
 	int _flags;
+	int _scaleOverride;
+	Common::Point _sizeOverride;
 public:
 	ImageEntry();
 };


Commit: 3c7f7376f3521bc8171ef0091cc008b5bfe252b8
    https://github.com/scummvm/scummvm/commit/3c7f7376f3521bc8171ef0091cc008b5bfe252b8
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix fade in Noctropolis greenhouse´

Changed paths:
    engines/access/noctropolis/noctropolis_player.cpp
    engines/access/noctropolis/noctropolis_scripts.cpp
    engines/access/screen.cpp


diff --git a/engines/access/noctropolis/noctropolis_player.cpp b/engines/access/noctropolis/noctropolis_player.cpp
index 9b0e25341cf..d128d4be28c 100644
--- a/engines/access/noctropolis/noctropolis_player.cpp
+++ b/engines/access/noctropolis/noctropolis_player.cpp
@@ -238,7 +238,7 @@ void NoctropolisPlayer::setDirFromScript(byte newDir) {
 void NoctropolisPlayer::synchronize(Common::Serializer &s) {
 	Player::synchronize(s);
 	s.syncAsSint16LE(_moveTo.x);
-	s.syncAsSint16LE(_moveTo.x);
+	s.syncAsSint16LE(_moveTo.y);
 	s.syncAsByte(_playerMove);
 }
 
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index e1efcfcf0bf..39f87faa6a3 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -136,7 +136,7 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 		vm->_midi->loadMusic(98, param1);
 		break;
 	case 8:
-		vm->_screen->setDarkPalette(param1 | (param1 << 8), 0, 238);
+		vm->_screen->setDarkPalette(param1 | (param1 << 8), 0, 236);
 		break;
 	case 9:
 		vm->_screen->setDarkPalette(0x3200, 192, 43);
diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp
index b756f65d2f8..5192cf01fff 100644
--- a/engines/access/screen.cpp
+++ b/engines/access/screen.cpp
@@ -151,12 +151,12 @@ void Screen::setIconPalette() {
 void Screen::setDarkPalette(int16 mulValue, uint firstIndex, uint count) {
 	uint lastIndex = firstIndex + count;
 	for (uint i = firstIndex; i <= lastIndex; i++) {
-		_rawPalette[i * 3 + 0] = (_rawPalette[i * 3 + 0] * mulValue) >> 16;
-		_rawPalette[i * 3 + 1] = (_rawPalette[i * 3 + 1] * mulValue) >> 16;
-		_rawPalette[i * 3 + 2] = (_rawPalette[i * 3 + 2] * mulValue) >> 16;
+		_tempPalette[i * 3 + 0] = (_rawPalette[i * 3 + 0] * mulValue) >> 16;
+		_tempPalette[i * 3 + 1] = (_rawPalette[i * 3 + 1] * mulValue) >> 16;
+		_tempPalette[i * 3 + 2] = (_rawPalette[i * 3 + 2] * mulValue) >> 16;
 	}
 
-	setPalette();
+	updatePalette();
 }
 
 


Commit: 7cf8ce7179b19f9bdb3da18c353b37dc39b82482
    https://github.com/scummvm/scummvm/commit/7cf8ce7179b19f9bdb3da18c353b37dc39b82482
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Misc fixes, Noctropolis can now be completed

Changed paths:
    engines/access/animation.h
    engines/access/bubble_box.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_inventory.cpp
    engines/access/noctropolis/noctropolis_player.cpp
    engines/access/noctropolis/noctropolis_scripts.cpp
    engines/access/room.cpp
    engines/access/screen.cpp
    engines/access/screen.h
    engines/access/scripts.cpp
    engines/access/video.cpp
    engines/access/video.h


diff --git a/engines/access/animation.h b/engines/access/animation.h
index 816a9ed3b4f..6af2371dc53 100644
--- a/engines/access/animation.h
+++ b/engines/access/animation.h
@@ -73,6 +73,11 @@ public:
 	 * Remove the last animation timer
 	 */
 	void popBackTimer() { if (_animationTimers.size()) _animationTimers.pop_back(); }
+
+	/**
+	 * True if there is an anim running
+	 */
+	bool hasTimer() const { return !_animationTimers.empty(); };
 };
 
 class AnimationResource {
diff --git a/engines/access/bubble_box.cpp b/engines/access/bubble_box.cpp
index 41b335c867a..5c2246d31ca 100644
--- a/engines/access/bubble_box.cpp
+++ b/engines/access/bubble_box.cpp
@@ -59,10 +59,26 @@ void BubbleBox::clearBubbles() {
 	// Loop through the bubble list to restore the screen areas
 	if (_vm->getGameID() == kGameNoctropolis) {
 		for (Common::Rect r: _bubbles) {
+
+			// clear the areas outside the background if the bubble went outside it
+			if (r.left < _vm->_screen->_windowXAdd || r.top < _vm->_screen->_windowYAdd) {
+				_vm->_screen->fillRect(Common::Rect(0, 0, _vm->_screen->w, _vm->_screen->_windowYAdd), 0);
+				_vm->_screen->fillRect(Common::Rect(0, 0, _vm->_screen->_windowXAdd, _vm->_screen->h), 0);
+			}
+			if (r.right > _vm->_screen->w - _vm->_screen->_windowXAdd || r.bottom > _vm->_screen->h - _vm->_screen->_windowYAdd) {
+				_vm->_screen->fillRect(Common::Rect(_vm->_screen->w - _vm->_screen->_windowXAdd, 0, _vm->_screen->w, _vm->_screen->h), 0);
+				_vm->_screen->fillRect(Common::Rect(0, _vm->_screen->h - _vm->_screen->_windowYAdd, _vm->_screen->w, _vm->_screen->h), 0);
+			}
+
 			_vm->_screen->_screenYOff = 0;
 			r.left -= (MIN((int)r.left, 2) + _vm->_screen->_windowXAdd);
 			r.right = MIN(r.right, (int16)(_vm->_screen->w - _vm->_screen->_windowXAdd));
+			r.top -= _vm->_screen->_windowYAdd;
+			r.bottom -= _vm->_screen->_windowYAdd;
+
+			r.clip(Common::Rect(_vm->_screen->w, _vm->_screen->h));
 
+			// then copy in the bit we need from the draw buffer.
 			_vm->_screen->copyBlock(&_vm->_buffer2, r);
 		}
 	} else {
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 1e9ab512ca3..af08b77b4e1 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -98,6 +98,8 @@ void NoctropolisEngine::initVariables() {
 	_mouseMode = 0;
 	_animation->clearTimers();
 
+	initMinigame();
+
 	// This is Noct_InitTravel in the original
 	_travScrollRow = 15;
 	_travScrollCol = 0;
@@ -504,9 +506,6 @@ void NoctropolisEngine::setStilettoPos() {
 
 void NoctropolisEngine::dead(int deathType) {
 	// aka DeadMeat1
-
-	Common::String vidfile = Common::String::format("VID2/DEATH%d.VID", deathType + 1);
-
 	static constexpr struct { int16 x, y; } DEAD_COORD[] = {
 		{167, 21},
 		{161, 22},
@@ -522,15 +521,17 @@ void NoctropolisEngine::dead(int deathType) {
 		3, 0, 0, 0, 0, 0, 5, 6, 7, 1, 1, 2, 6, 4, 3, 3, 0, 3,
 	};
 
+	const int vidType = DEAD_VIDS[deathType];
+
+	const Common::Path vidFile(Common::String::format("VID2/DEATH%d.VID", vidType + 1));
+
 	const char *deathScreenFile =
 		(deathType < 6 || deathType == 9 || deathType == 10 || deathType == 11)
 		 ? "DEATH1.SCN" : "DEATH.SCN";
 
-	const int vidtype = DEAD_VIDS[deathType];
-
-	const Common::Point vidPos(DEAD_COORD[vidtype].x, DEAD_COORD[vidtype].y);
+	const Common::Point vidPos(DEAD_COORD[vidType].x, DEAD_COORD[vidType].y);
 
-	NoctropolisResources *res = (NoctropolisResources *)_res;
+	const NoctropolisResources *res = (const NoctropolisResources *)_res;
 
 	int16 deathTextX = deathType == 8 ? 80 : 130;
 	int16 deathTextY = deathType == 8 ? 310 : 220;
@@ -549,10 +550,12 @@ void NoctropolisEngine::dead(int deathType) {
 	_bubbleBox->_bubbleTitle = deathTextCaption;
 	_bubbleBox->placeBubble(res->getDeathText(deathType));
 
+	_screen->setIconPalette();
+	_screen->setPalette();
 	_screen->fadeIn();
 
 	VideoPlayer_v2 vidPlayer(this);
-	vidPlayer.VideoPlayer::setVideo(_screen, vidPos, Common::Path(vidfile), 0);
+	vidPlayer.VideoPlayer::setVideo(_screen, vidPos, vidFile, 0);
 	vidPlayer.playToEnd();
 
 	_events->waitKeyActionMouse();
@@ -601,8 +604,7 @@ void NoctropolisEngine::displayPegsTick() {
 		ie._position.x = pegPos[_minigameCurrentConfig[i]].x + 181 - 4;
 		ie._position.y = pegPos[_minigameCurrentConfig[i]].y + 116 - 3;
 		ie._offsetY = 7;
-		//spriteDrawItem.flags = 8; // Why? Scaling is 0! CHECKME
-		//spriteDrawItem.scaling;
+		ie._flags |= IMGFLAG_UNSCALED;
 		_images.addToList(ie);
 	}
 }
@@ -667,7 +669,10 @@ void NoctropolisEngine::playStilMorph() {
 	_screen->clearScreen();
 	VideoPlayer_v2 vidPlayer(this, true);
 	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(118, 118), Common::Path("VID1/DRLM00.VID"), 0);
+	_screen->setIconPalette();
+	_screen->setPalette();
 	vidPlayer.playToEnd();
+	_system->showMouse(true);
 }
 
 void NoctropolisEngine::flashPaletteEffect() {
diff --git a/engines/access/noctropolis/noctropolis_inventory.cpp b/engines/access/noctropolis/noctropolis_inventory.cpp
index 0fddebaccc5..a9c440d4f3c 100644
--- a/engines/access/noctropolis/noctropolis_inventory.cpp
+++ b/engines/access/noctropolis/noctropolis_inventory.cpp
@@ -118,11 +118,12 @@ int NoctropolisInventory::displayInv() {
 					spriteIndex++;
 				uint16 slotX = _inventoryBase.x + 23 + (slotNum % 5) * 41;
 				uint16 slotY = _inventoryBase.y + 26 + (slotNum / 5) * 38;
-				screen->plotImage(inventorySprites, 3, Common::Point(slotX, slotY)); // draw empty slot
-				slotX += 20 - inventorySprites->getFrame(spriteIndex)->w / 2;
-				slotY += MAX(0, 38 - inventorySprites->getFrame(spriteIndex)->h) / 2;
+				screen->plotF(inventorySprites->getFrame(3), Common::Point(slotX, slotY)); // draw empty slot
+				// Centre the item icon
+				slotX += MAX(0, 20 - inventorySprites->getFrame(spriteIndex)->w / 2);
+				slotY += MAX(0, 19 - inventorySprites->getFrame(spriteIndex)->h / 2);
 				const Common::Point slotPt(slotX, slotY);
-				screen->plotImage(inventorySprites, spriteIndex, slotPt);
+				screen->plotF(inventorySprites->getFrame(spriteIndex), slotPt);
 				font->drawString(screen, Common::String::format("%d", spriteIndex), slotPt);
 			}
 
diff --git a/engines/access/noctropolis/noctropolis_player.cpp b/engines/access/noctropolis/noctropolis_player.cpp
index d128d4be28c..1f93d57b90d 100644
--- a/engines/access/noctropolis/noctropolis_player.cpp
+++ b/engines/access/noctropolis/noctropolis_player.cpp
@@ -192,7 +192,7 @@ void NoctropolisPlayer::walk() {
 	} else {
 		// Move animation
 		int dirAnimNum = _animNumForDir(_playerDirection);
-		if (_playerDirection != _lastDirection) {
+		if (_playerDirection != _lastDirection || (_animManager && !_animManager->hasTimer())) {
 			_lastDirection = _playerDirection;
 			if (_animManager) {
 				_animManager->popBackTimer();
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index 39f87faa6a3..7c10b655f81 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -108,7 +108,7 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 		vm->_buffer2.clear();
 		result = true;
 		if (_vm->_player->_roomNumber == 54) {
-			error("TODO: Implement special pal hack for fade in room 54?");
+			warning("TODO: Implement special pal hack for fade in room 54?");
 			/*
 			NoctPal_ClearRawPalette();
 			pbVar4 = GetRawPalette();
@@ -162,6 +162,10 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 		if (!_vm->_midi->isPlaying())
 			_vm->_midi->newMusic(0, 1);
 		break;
+	case 16:
+		// This gets called at the start of the end credits.. do nothing?
+		((VideoPlayer_v2 *)_vm->_video)->enableSetPal();
+		break;
 	case 17:
 		warning("TODO: Add Nightdive credits here if playing that edition?");
 		// see NoctEndGame::drawer.
@@ -170,6 +174,7 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 	case 19:
 		warning("TODO: work our correct step on Special 19 (flashpalette)");
 		_vm->_screen->flashPalette(20);
+		break;
 	case 20:
 		vm->doLastComic();
 		result = true;
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 1d159d3bf0c..9ea8f868de6 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -630,6 +630,11 @@ void Room::loadPlayField(int fileNum, int subfile) {
 
 	// Copy the new palette
 	screen.loadRawPalette(playData->_stream);
+	// WORKAROUND: Screen 46 in Noctropolis has a color 0 of (0, 0, 63) which
+	// causes the background to be blue?
+	if (_vm->getGameID() == kGameNoctropolis && fileNum == 46) {
+		screen.clearColor0();
+	}
 
 	// Copy off the tile data
 	int tileSize = (int)header._tilesCount * TILE_WIDTH * TILE_HEIGHT;
diff --git a/engines/access/screen.cpp b/engines/access/screen.cpp
index 5192cf01fff..e188bdd3cfc 100644
--- a/engines/access/screen.cpp
+++ b/engines/access/screen.cpp
@@ -188,6 +188,10 @@ void Screen::loadRawPalette(Common::SeekableReadStream *stream) {
 		*p = PALETTE_6BIT_TO_8BIT(*p);
 }
 
+void Screen::clearColor0() {
+	_rawPalette[0] = _rawPalette[1] = _rawPalette[2] = 0;
+}
+
 void Screen::updatePalette() {
 	g_system->getPaletteManager()->setPalette(&_tempPalette[0], 0, Graphics::PALETTE_COUNT);
 	update();
diff --git a/engines/access/screen.h b/engines/access/screen.h
index e525671fdea..3b8d88e7631 100644
--- a/engines/access/screen.h
+++ b/engines/access/screen.h
@@ -199,6 +199,12 @@ public:
 	void cyclePaletteForward();
 
 	void cyclePaletteBackwards();
+
+	/**
+	 * Clear colour 0 in the palette back to black
+	 * (workaround for Noctropolis)
+	 */
+	void clearColor0();
 };
 
 } // End of namespace Access
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 5f40024f039..b3dcc404d50 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -749,9 +749,12 @@ void Scripts::cmdCheckLoc() {
 	int maxY = _data->readUint16LE();
 	debugCN(1, kDebugScripts, "cmdCheckLoc(minX=%d, minY=%d, maxX=%d, maxY=%d)", minX, minY, maxX, maxY);
 
-	int curX = _vm->_player->_rawPlayer.x + _vm->_player->_playerOffset.x;
+	int curX = _vm->_player->_rawPlayer.x;
 	int curY = _vm->_player->_rawPlayer.y;
 
+	if (_vm->getGameID() != kGameNoctropolis)
+		curX += _vm->_player->_playerOffset.x;
+
 	if ((curX >= minX) && (curX <= maxX) && (curY >= minY) && (curY <= maxY)) {
 		debugC(1, kDebugScripts, " -> True");
 		cmdGoto();
diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index 069c13a2b57..a5f1683380e 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -331,6 +331,8 @@ void VideoPlayer_v2::handlePaletteChunk() {
 		_vm->_screen->setRawPalette(pal);
 		_vm->_screen->setPalette();
 		_vm->_screen->copyRawPalToTempPal();
+		// only do it once?
+		_setPal = false;
 	}
 }
 
diff --git a/engines/access/video.h b/engines/access/video.h
index a252ea79d29..a1b4196d3ac 100644
--- a/engines/access/video.h
+++ b/engines/access/video.h
@@ -168,6 +168,7 @@ public:
 
 	int getHeight() override { return _header._height; }
 
+	void enableSetPal() { _setPal = true; }
 };
 
 


Commit: 4293ebe5c98f80d55e8617ea33abddb605f8c095
    https://github.com/scummvm/scummvm/commit/4293ebe5c98f80d55e8617ea33abddb605f8c095
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Cleanup sound handling a bit

Fixes duplicate inventory sounds in Noctropolis, but also makes code a bit
cleaner overall.

Changed paths:
    engines/access/access.cpp
    engines/access/amazon/amazon_game.cpp
    engines/access/amazon/amazon_logic.cpp
    engines/access/amazon/amazon_scripts.cpp
    engines/access/char.cpp
    engines/access/files.cpp
    engines/access/files.h
    engines/access/martian/martian_scripts.cpp
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_font.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/noctropolis/noctropolis_scripts.cpp
    engines/access/room.cpp
    engines/access/scripts.cpp
    engines/access/sound.cpp
    engines/access/sound.h
    engines/access/video.cpp
    engines/access/video.h


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 8b1f5a2d76d..5133600fa7e 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -316,8 +316,7 @@ void AccessEngine::speakText(BaseSurface *s, const Common::String &msg) {
 
 	while (soundsLeft) {
 		_sound->freeSounds();
-		Resource *res = _sound->loadSound(_narateFile + 99, _sndSubFile);
-		_sound->_soundTable.push_back(SoundEntry(res, 1));
+		_sound->loadAndAddSound(_narateFile + 99, _sndSubFile);
 		_sound->playSound(0);
 
 		while(_sound->isSFXPlaying() && !shouldQuit())
diff --git a/engines/access/amazon/amazon_game.cpp b/engines/access/amazon/amazon_game.cpp
index 86bd0c99706..43daaeb4774 100644
--- a/engines/access/amazon/amazon_game.cpp
+++ b/engines/access/amazon/amazon_game.cpp
@@ -670,7 +670,7 @@ void AmazonEngine::dead(int deathId) {
 	_events->debounceLeft();
 	_events->zeroKeysActions();
 
-	_sound->_soundTable.push_back(SoundEntry(_files->loadFile(98, 44), 1));
+	_sound->loadAndAddSound(98, 44);
 
 	_screen->clearScreen();
 	_screen->setPanel(3);
diff --git a/engines/access/amazon/amazon_logic.cpp b/engines/access/amazon/amazon_logic.cpp
index c433b42c16f..e4925d1b253 100644
--- a/engines/access/amazon/amazon_logic.cpp
+++ b/engines/access/amazon/amazon_logic.cpp
@@ -553,7 +553,7 @@ void Opening::doTent() {
 
 	_vm->_events->showCursor();
 	_vm->_midi->newMusic(11, 1);
-	_vm->_sound->_soundTable.clear();
+	_vm->_sound->freeSounds();
 
 	_vm->establishCenter(0, 4);
 }
diff --git a/engines/access/amazon/amazon_scripts.cpp b/engines/access/amazon/amazon_scripts.cpp
index c187a26f39f..4b089b62fd9 100644
--- a/engines/access/amazon/amazon_scripts.cpp
+++ b/engines/access/amazon/amazon_scripts.cpp
@@ -248,8 +248,7 @@ void AmazonScripts::loadBackground(int param1, int param2) {
 }
 
 void AmazonScripts::loadNSound(int param1, int param2) {
-	Resource *sound = _vm->_files->loadFile(param1, param2);
-	_vm->_sound->_soundTable.push_back(SoundEntry(sound, 1));
+	_vm->_sound->loadAndAddSound(param1, param2);
 }
 
 void AmazonScripts::setInactive() {
diff --git a/engines/access/char.cpp b/engines/access/char.cpp
index 5e90303a21d..2916cbed27c 100644
--- a/engines/access/char.cpp
+++ b/engines/access/char.cpp
@@ -61,7 +61,7 @@ CharEntry::CharEntry(const byte *data, AccessEngine *vm) {
 	for (int16 v = s.readSint16LE(); v != -1; v = s.readSint16LE()) {
 		ExtraCell ec;
 		ec._vid._fileNum = v;
-		ec._vid._subfile = s.readSint16LE();
+		ec._vid._subFile = s.readSint16LE();
 		ec._vidSound.load(s);
 
 		_extraCells.push_back(ec);
@@ -103,7 +103,7 @@ void CharManager::loadChar(int charId) {
 		if (!_vm->_establishFlag)
 			_vm->_screen->fadeOut();
 
-		_vm->_files->loadScreen(ce._screenFile._fileNum, ce._screenFile._subfile);
+		_vm->_files->loadScreen(ce._screenFile._fileNum, ce._screenFile._subFile);
 		_vm->_screen->setIconPalette();
 		_vm->_screen->fadeIn();
 	}
@@ -130,7 +130,7 @@ void CharManager::loadChar(int charId) {
 	_vm->_screen->_numColors = ce._numColors;
 	if (ce._paletteFile._fileNum != -1) {
 		int srcOffset = (_vm->getGameID() == kGameMartianMemorandum ? ce._startColor * 3 : 0);
-		_vm->_screen->loadPalette(ce._paletteFile._fileNum, ce._paletteFile._subfile, srcOffset);
+		_vm->_screen->loadPalette(ce._paletteFile._fileNum, ce._paletteFile._subFile, srcOffset);
 	}
 	_vm->_screen->setIconPalette();
 	_vm->_screen->setPalette();
diff --git a/engines/access/files.cpp b/engines/access/files.cpp
index 852490872c4..882c8eb7088 100644
--- a/engines/access/files.cpp
+++ b/engines/access/files.cpp
@@ -29,12 +29,12 @@ namespace Access {
 
 FileIdent::FileIdent() {
 	_fileNum = -1;
-	_subfile = 0;
+	_subFile = 0;
 }
 
 void FileIdent::load(Common::SeekableReadStream &s) {
 	_fileNum = s.readSint16LE();
-	_subfile = s.readUint16LE();
+	_subFile = s.readUint16LE();
 }
 
 /*------------------------------------------------------------------------*/
@@ -46,7 +46,7 @@ CellIdent::	CellIdent() {
 CellIdent::CellIdent(int cell, int fileNum, int subfile) {
 	_cell = cell;
 	_fileNum = fileNum;
-	_subfile = subfile;
+	_subFile = subfile;
 }
 
 /*------------------------------------------------------------------------*/
@@ -117,7 +117,7 @@ Resource *FileManager::loadFile(int fileNum, int subfile) {
 }
 
 Resource *FileManager::loadFile(const FileIdent &fileIdent) {
-	return loadFile(fileIdent._fileNum, fileIdent._subfile);
+	return loadFile(fileIdent._fileNum, fileIdent._subFile);
 }
 
 Resource *FileManager::loadRawFile(const Common::Path &filename) {
diff --git a/engines/access/files.h b/engines/access/files.h
index b565bd6ca29..746c3fd34a0 100644
--- a/engines/access/files.h
+++ b/engines/access/files.h
@@ -35,10 +35,10 @@ class AccessEngine;
 
 struct FileIdent {
 	int _fileNum;
-	int _subfile;
+	int _subFile;
 
 	FileIdent();
-	FileIdent(int fileNum, int subfile) { _fileNum = fileNum; _subfile = subfile; }
+	FileIdent(int fileNum, int subfile) { _fileNum = fileNum; _subFile = subfile; }
 
 	void load(Common::SeekableReadStream &s);
 };
diff --git a/engines/access/martian/martian_scripts.cpp b/engines/access/martian/martian_scripts.cpp
index d16e72c0830..9930694c1e4 100644
--- a/engines/access/martian/martian_scripts.cpp
+++ b/engines/access/martian/martian_scripts.cpp
@@ -191,8 +191,7 @@ void MartianScripts::cmdSpecial7() {
 	_vm->_midi->loadMusic(47, 8);
 
 	_vm->_sound->freeSounds();
-	Resource *sound = _vm->_sound->loadSound(46, 14);
-	_vm->_sound->_soundTable.push_back(SoundEntry(sound, 1));
+	_vm->_sound->loadAndAddSound(46, 14);
 
 	_vm->_screen->setDisplayScan();
 	_vm->_screen->forceFadeOut();
@@ -278,12 +277,9 @@ void MartianScripts::cmdSpecial7() {
 	}
 
 	_vm->_sound->freeSounds();
-	sound = _vm->_sound->loadSound(40, 8);
-	_vm->_sound->_soundTable.push_back(SoundEntry(sound, 1));
-	sound = _vm->_sound->loadSound(40, 9);
-	_vm->_sound->_soundTable.push_back(SoundEntry(sound, 1));
-	sound = _vm->_sound->loadSound(40, 10);
-	_vm->_sound->_soundTable.push_back(SoundEntry(sound, 1));
+	_vm->_sound->loadAndAddSound(40, 8);
+	_vm->_sound->loadAndAddSound(40, 9);
+	_vm->_sound->loadAndAddSound(40, 10);
 
 	_vm->_screen->forceFadeOut();
 	_vm->_files->loadScreen(40, 7);
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index 3a8d4833a8e..e6a6b264bc7 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -157,9 +157,7 @@ PageResult ComicViewer::runPage(const ComicPage *page) {
 	}
 
 	if (playedSound) {
-		_vm->_sound->stopSound();
-		delete _vm->_sound->_soundTable[1]._res;
-		_vm->_sound->_soundTable[1]._res = nullptr;
+		_vm->_sound->freeSound(1);
 	}
 
 	delete _bubbleSprites;
diff --git a/engines/access/noctropolis/noctropolis_font.cpp b/engines/access/noctropolis/noctropolis_font.cpp
index 19bc7cb4ded..581a9c49bcb 100644
--- a/engines/access/noctropolis/noctropolis_font.cpp
+++ b/engines/access/noctropolis/noctropolis_font.cpp
@@ -90,7 +90,9 @@ void NoctropolisFont::makeCharSurface(Graphics::Surface &surface, byte ch, const
 }
 
 
+#if DUMP_FONTS
 static int dumpno = 0;
+#endif
 
 void NoctropolisFont::load(const uint16 *offsets, const byte *data) {
 	_chars.resize(_lastChar - _firstCharIndex);
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index af08b77b4e1..9ffe483d637 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -787,6 +787,16 @@ void NoctropolisEngine::stilWalk() {
 	_stil->walk();
 }
 
+void NoctropolisEngine::playInventoryStinger() {
+	static const FileIdent stingerIdent = FileIdent(99, 64);
+
+	if (!_sound->hasLoadedSound(stingerIdent))
+		_sound->loadAndAddSound(99, 64, 1);
+
+	// playSound will not add it to the queue if it's already there.
+	_sound->playSoundByIdent(stingerIdent);
+}
+
 Common::Error NoctropolisEngine::synchronize(Common::Serializer &s) {
 	Common::Error result = AccessEngine::synchronize(s);
 
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index cd91e63f644..6eee15a1b9e 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -91,6 +91,9 @@ public:
 	void doLastComic();
 	void doSpecialComic();
 
+	/** Play SFX for item added to inv, debounced */
+	void playInventoryStinger();
+
 protected:
 	void setupGame() override;
 	void initObjects() override;
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index 7c10b655f81..333ea136c14 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -163,8 +163,8 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 			_vm->_midi->newMusic(0, 1);
 		break;
 	case 16:
-		// This gets called at the start of the end credits.. do nothing?
-		((VideoPlayer_v2 *)_vm->_video)->enableSetPal();
+		// This gets called at the start of the end credits
+		((VideoPlayer_v2 *)_vm->_video)->setVideoPalNow();
 		break;
 	case 17:
 		warning("TODO: Add Nightdive credits here if playing that edition?");
diff --git a/engines/access/room.cpp b/engines/access/room.cpp
index 9ea8f868de6..f773aac2dc6 100644
--- a/engines/access/room.cpp
+++ b/engines/access/room.cpp
@@ -390,7 +390,7 @@ void Room::loadRoomData(const byte *roomData) {
 
 	if (roomInfo._playFieldFile._fileNum != -1) {
 		loadPlayField(roomInfo._playFieldFile._fileNum,
-			roomInfo._playFieldFile._subfile);
+			roomInfo._playFieldFile._subFile);
 		setupRoom();
 
 		_vm->_scaleMaxY = _playFieldHeight << 4;
@@ -423,7 +423,7 @@ void Room::loadRoomData(const byte *roomData) {
 		_vm->_screen->_startColor = roomInfo._startColor;
 		_vm->_screen->_numColors = roomInfo._numColors;
 		_vm->_screen->loadPalette(roomInfo._paletteFile._fileNum,
-			roomInfo._paletteFile._subfile);
+			roomInfo._paletteFile._subFile);
 	}
 
 	// Load extra cells
@@ -1213,7 +1213,7 @@ RoomInfo::RoomInfo(const byte *data, AccessGameType gameType, bool isCD, bool is
 		for (int16 v = stream.readSint16LE(); v != -1; v = stream.readSint16LE()) {
 			ExtraCell ec;
 			ec._vid._fileNum = v;
-			ec._vid._subfile = stream.readSint16LE();
+			ec._vid._subFile = stream.readSint16LE();
 
 			_extraCells.push_back(ec);
 		}
@@ -1236,7 +1236,7 @@ RoomInfo::RoomInfo(const byte *data, AccessGameType gameType, bool isCD, bool is
 			fi._fileNum = -1;
 			fi._soundFilename = stream.readString();
 		} else {
-			fi._subfile = stream.readUint16LE();
+			fi._subFile = stream.readUint16LE();
 		}
 		fi._priority = stream.readUint16LE();
 
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index b3dcc404d50..3570aa37746 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -600,12 +600,7 @@ void Scripts::cmdSetInventory() {
 	_vm->_inventory->_invChangeFlag = true;
 
 	if (itemVal == 1 && _vm->getGameID() == kGameNoctropolis) {
-		// Slight hack - add a new sound to play the stinger.  This won't be freed
-		// until we leave the room, but there are only a few inv items in each room
-		// so the total leak is tiny.
-		Resource *sound = _vm->_sound->loadSound(99, 64);
-		_vm->_sound->_soundTable.push_back(SoundEntry(sound, 1));
-		_vm->_sound->playSound(_vm->_sound->_soundTable.size() - 1);
+		((Noctropolis::NoctropolisEngine *)_vm)->playInventoryStinger();
 	}
 }
 
@@ -1008,7 +1003,7 @@ void Scripts::cmdSetBufVid() {
 	debugC(1, kDebugScripts, "cmdSetBufVid(vidX=%d, vidY=%d, idx=%d, rate=%d)", vidX, vidY, idx, rate);
 	_vm->_vidX = vidX;
 	_vm->_vidY = vidY;
-	_vm->_video->setVideo(&_vm->_vidBuf, Common::Point(0, 0), FileIdent(_vm->_extraCells[idx]._vid._fileNum, _vm->_extraCells[idx]._vid._subfile), rate);
+	_vm->_video->setVideo(&_vm->_vidBuf, Common::Point(0, 0), FileIdent(_vm->_extraCells[idx]._vid._fileNum, _vm->_extraCells[idx]._vid._subFile), rate);
 }
 
 void Scripts::cmdPlayBufVid() {
@@ -1438,16 +1433,15 @@ void Scripts::cmdClearBlock() {
 void Scripts::cmdLoadSound() {
 	int idx = _data->readSint16LE();
 	debugC(1, kDebugScripts, "cmdLoadSound(idx=%d)", idx);
-	_vm->_sound->_soundTable.clear();
-	Resource *sound = _vm->_files->loadFile(_vm->_extraCells[idx]._vidSound);
-	_vm->_sound->_soundTable.push_back(SoundEntry(sound, 1));
+	_vm->_sound->freeSounds();
+	_vm->_sound->loadAndAddSound(_vm->_extraCells[idx]._vidSound);
 }
 
 void Scripts::cmdFreeSound() {
 	debugC(1, kDebugScripts, "cmdFreeSound()");
 	SoundManager &sound = *_vm->_sound;
 
-	if (sound._soundTable.size() > 0 && sound._soundTable[0]._res) {
+	if (sound.hasSounds()) {
 		// Keep doing char display loop if playing sound for it
 		do {
 			if (_vm->getGameID() == kGameAmazon && _vm->_flags[236] == 1)
@@ -1881,6 +1875,7 @@ void Scripts::cmdRestoreBlock() {
 	debugC(1, kDebugScripts, "cmdRestoreBlock(%d, %d, %d, %d)", x, y, w, h);
 	Common::Rect r(Common::Point(x, y), w, h);
 	r.translate(-_vm->_screen->_windowXAdd, -_vm->_screen->_windowYAdd);
+	r.clip(_vm->_screen->w, _vm->_screen->h);
 	_vm->_screen->copyBlock(&_vm->_buffer2, r);
 
 	// Remake does this, but it doesn't use same buffer setup..
diff --git a/engines/access/sound.cpp b/engines/access/sound.cpp
index eaf3ed4ba92..646723a871f 100644
--- a/engines/access/sound.cpp
+++ b/engines/access/sound.cpp
@@ -48,14 +48,14 @@ SoundManager::~SoundManager() {
 void SoundManager::clearSounds() {
 	debugC(1, kDebugSound, "clearSounds()");
 
+	if (_mixer->isSoundHandleActive(*_effectsHandle))
+		_mixer->stopHandle(*_effectsHandle);
+
 	for (auto &sound : _soundTable)
 		delete sound._res;
 
 	_soundTable.clear();
 
-	if (_mixer->isSoundHandleActive(*_effectsHandle))
-		_mixer->stopHandle(*_effectsHandle);
-
 	while (_queue.size()) {
 		delete _queue[0]._stream;
 		_queue.remove_at(0);
@@ -74,20 +74,39 @@ bool SoundManager::isSoundQueued(int soundId) const {
 void SoundManager::loadSoundTable(int idx, int fileNum, int subfile, int priority) {
 	debugC(1, kDebugSound, "loadSoundTable(%d, %d, %d)", idx, fileNum, subfile);
 
-	Resource *soundResource;
-
 	if (idx >= (int)_soundTable.size())
 		_soundTable.resize(idx + 1);
+	else
+		freeSound(idx);
 
-	delete _soundTable[idx]._res;
-	soundResource = _vm->_files->loadFile(fileNum, subfile);
-	_soundTable[idx]._res = soundResource;
-	_soundTable[idx]._priority = priority;
+	Resource *soundResource = _vm->_files->loadFile(fileNum, subfile);
+	_soundTable[idx] = SoundEntry(soundResource, priority, fileNum, subfile);
+}
+
+void SoundManager::loadAndAddSound(const FileIdent &ident, int priority) {
+	loadAndAddSound(ident._fileNum, ident._subFile);
+}
+
+void SoundManager::loadAndAddSound(int fileNum, int subfile, int priority) {
+	Resource *res = _vm->_files->loadFile(fileNum, subfile);
+	_soundTable.push_back(SoundEntry(res, priority, fileNum, subfile));
 }
 
-Resource *SoundManager::loadSound(int fileNum, int subfile) {
-	debugC(1, kDebugSound, "loadSound(%d, %d)", fileNum, subfile);
-	return _vm->_files->loadFile(fileNum, subfile);
+bool SoundManager::hasLoadedSound(const FileIdent &ident) const {
+	for (const auto &entry : _soundTable) {
+		if (entry.matches(ident))
+			return true;
+	}
+	return false;
+}
+
+void SoundManager::freeSound(int idx) {
+	assert(idx >= 0 && idx < (int)_soundTable.size());
+	// make sure we don't try to use the resource
+	stopSound();
+	assert(!isSoundQueued(idx));
+	delete _soundTable[idx]._res;
+	_soundTable[idx] = SoundEntry();
 }
 
 void SoundManager::playSound(int soundIndex, bool loop /* = false */) {
@@ -100,6 +119,14 @@ void SoundManager::playSound(int soundIndex, bool loop /* = false */) {
 	playSound(_soundTable[soundIndex]._res, priority, loop, soundIndex);
 }
 
+void SoundManager::playSoundByIdent(const FileIdent &ident, bool loop /* = false*/) {
+	for (int i = 0; i < (int)_soundTable.size(); i++) {
+		if (_soundTable[i].matches(ident))
+			playSound(i);
+	}
+}
+
+
 void SoundManager::playSound(Resource *res, int priority, bool loop, int soundIndex) {
 	debugC(1, kDebugSound, "playSound");
 
@@ -163,10 +190,11 @@ void SoundManager::playSound(Resource *res, int priority, bool loop, int soundIn
 		_queue.push_back(QueuedSound(audioStream, soundIndex));
 	}
 
-	if (!_mixer->isSoundHandleActive(*_effectsHandle))
+	if (!_mixer->isSoundHandleActive(*_effectsHandle)) {
 		_mixer->playStream(Audio::Mixer::kSFXSoundType, _effectsHandle,
 						_queue[0]._stream, -1, _mixer->kMaxChannelVolume, 0,
 						DisposeAfterUse::NO);
+	}
 }
 
 void SoundManager::checkSoundQueue() {
@@ -201,7 +229,7 @@ void SoundManager::loadSounds(const Common::Array<RoomInfo::SoundIdent> &sounds)
 	for (const auto &sound : sounds) {
 		Resource *soundRes;
 		if (sound._soundFilename.empty()) {
-			soundRes = loadSound(sound._fileNum, sound._subfile);
+			loadAndAddSound(sound._fileNum, sound._subFile, sound._priority);
 		} else {
 			//
 			// In Noctropolis, sounds are defined by filenames, eg,
@@ -216,8 +244,8 @@ void SoundManager::loadSounds(const Common::Array<RoomInfo::SoundIdent> &sounds)
 			path.joinInPlace(components[2]);
 			debugC(1, kDebugSound, "loadRawSound(%s)", path.toString().c_str());
 			soundRes = _vm->_files->loadRawFile(path);
+			_soundTable.push_back(SoundEntry(soundRes, sound._priority));
 		}
-		_soundTable.push_back(SoundEntry(soundRes, sound._priority));
 	}
 }
 
@@ -410,7 +438,7 @@ void MusicManager::loadMusic(int fileNum, int subfile) {
 }
 
 void MusicManager::loadMusic(FileIdent file) {
-	debugC(1, kDebugSound, "loadMusic(%d, %d)", file._fileNum, file._subfile);
+	debugC(1, kDebugSound, "loadMusic(%d, %d)", file._fileNum, file._subFile);
 
 	_music = _vm->_files->loadFile(file);
 }
diff --git a/engines/access/sound.h b/engines/access/sound.h
index 5e5a8b900ac..747dcff4266 100644
--- a/engines/access/sound.h
+++ b/engines/access/sound.h
@@ -37,51 +37,65 @@ namespace Access {
 
 class AccessEngine;
 
-struct SoundEntry {
-	Resource *_res;
-	int _priority;
+class SoundManager {
+	struct SoundEntry {
+		Resource *_res;
+		int _priority;
+		int _fileNum;
+		int _subFileNum;
 
-	SoundEntry() { _res = nullptr; _priority = 0; }
-	SoundEntry(Resource *res, int priority) { _res = res; _priority = priority; }
-};
+		SoundEntry() : _res(nullptr), _priority(0), _fileNum(0), _subFileNum(0) { }
+		SoundEntry(Resource *res, int priority, int fileNum = -1, int subFileNum = -1) :
+			_res(res), _priority(priority), _fileNum(fileNum), _subFileNum(subFileNum) { }
+
+		bool matches(const FileIdent &ident) const { return _fileNum == ident._fileNum && _subFileNum == ident._subFile; }
+	};
 
-class SoundManager {
 	struct QueuedSound {
 		Audio::AudioStream *_stream;
 		int _soundId;
 
 		QueuedSound() : _stream(nullptr), _soundId(-1) {}
-		QueuedSound(Audio::AudioStream *stream, int soundId) : _stream(stream), _soundId(soundId) {}
+		QueuedSound(Audio::AudioStream *stream, int soundIdx) : _stream(stream), _soundId(soundIdx) {}
 	};
 private:
 	AccessEngine *_vm;
 	Audio::Mixer *_mixer;
 	Audio::SoundHandle *_effectsHandle;
 	Common::Array<QueuedSound> _queue;
+	Common::Array<SoundEntry> _soundTable;
 
 	void clearSounds();
 
 	void playSound(Resource *res, int priority, bool loop, int soundIndex = -1);
 
 	bool isSoundQueued(int soundId) const;
-public:
-	Common::Array<SoundEntry> _soundTable;
+
 public:
 	SoundManager(AccessEngine *vm, Audio::Mixer *mixer);
 	~SoundManager();
 
+	// replace the current table entry at idx with a new one
 	void loadSoundTable(int idx, int fileNum, int subfile, int priority = 1);
 
+	// load and add a single sound resource to the table
+	void loadAndAddSound(int fileNum, int subfile, int priority = 1);
+	void loadAndAddSound(const FileIdent &ident, int priority = 1);
+
+	bool hasLoadedSound(const FileIdent &ident) const;
+
 	void playSound(int soundIndex, bool loop = false);
+	void playSoundByIdent(const FileIdent &ident, bool loop = false);
 	void checkSoundQueue();
 	bool isSFXPlaying();
 
-	Resource *loadSound(int fileNum, int subfile);
 	void loadSounds(const Common::Array<RoomInfo::SoundIdent> &sounds);
 	void syncVolume();
 
 	void stopSound();
 	void freeSounds();
+	void freeSound(int idx);
+	bool hasSounds() const { return _soundTable.size() > 0 && _soundTable[0]._res; }
 };
 
 class MusicManager : public Audio::MidiPlayer {
diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index a5f1683380e..50e1ab69698 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -324,18 +324,22 @@ void VideoPlayer_v2::handlePaletteChunk() {
 	debugC(kDebugGraphics, "VideoPlayer_v2::handlePaletteChunk()");
 	byte buf[768];
 	_videoData->_stream->read(buf, 768);
+	for (int i = 0; i < 768; i++)
+		buf[i] *= 4;
+	_pal = Graphics::Palette(buf, 256);
 	if (_setPal) {
-		for (int i = 0; i < 768; i++)
-			buf[i] *= 4;
-		Graphics::Palette pal(buf, 256);
-		_vm->_screen->setRawPalette(pal);
-		_vm->_screen->setPalette();
-		_vm->_screen->copyRawPalToTempPal();
+		setVideoPalNow();
 		// only do it once?
 		_setPal = false;
 	}
 }
 
+void VideoPlayer_v2::setVideoPalNow() {
+	_vm->_screen->setRawPalette(_pal);
+	_vm->_screen->setPalette();
+	_vm->_screen->copyRawPalToTempPal();
+}
+
 void VideoPlayer_v2::calcNextFrameTime(int delay) {
 	if (delay)
 		_delayTotal += delay;
diff --git a/engines/access/video.h b/engines/access/video.h
index a1b4196d3ac..ad0ba66b824 100644
--- a/engines/access/video.h
+++ b/engines/access/video.h
@@ -141,6 +141,7 @@ private:
 
 	Audio::QueuingAudioStream *_audioStream;
 	Audio::SoundHandle _audioStreamHandle;
+	Graphics::Palette _pal;
 
 	void handleStraitChunk();
 	void handlePaletteChunk();
@@ -168,7 +169,7 @@ public:
 
 	int getHeight() override { return _header._height; }
 
-	void enableSetPal() { _setPal = true; }
+	void setVideoPalNow();
 };
 
 


Commit: 17dcea944792b9c16df4b84786d60412bb956cfc
    https://github.com/scummvm/scummvm/commit/17dcea944792b9c16df4b84786d60412bb956cfc
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Clean up Noctropolis restart issues

Changed paths:
    engines/access/access.h
    engines/access/martian/martian_game.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_inventory.cpp


diff --git a/engines/access/access.h b/engines/access/access.h
index a7525d1644d..0e2698252fc 100644
--- a/engines/access/access.h
+++ b/engines/access/access.h
@@ -291,7 +291,7 @@ public:
 	int _numLines;
 	int _bcnt;
 
-	bool _clearSummaryFlag;
+	bool _clearSummaryFlag; // amazon only
 	bool _cheatFl; 	 // cheats are enabled
 	bool _restartFl; // game should restart
 	bool _textFlag;  // whether subtitles are enabled
diff --git a/engines/access/martian/martian_game.cpp b/engines/access/martian/martian_game.cpp
index b41ef8af4fa..a71bd2d40b0 100644
--- a/engines/access/martian/martian_game.cpp
+++ b/engines/access/martian/martian_game.cpp
@@ -78,7 +78,6 @@ void MartianEngine::initVariables() {
 	_ask[33] = 1;
 
 	ARRAYCLEAR(_flags);
-
 }
 
 void MartianEngine::setNoteParams() {
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 9ffe483d637..6cb88a4f057 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -99,6 +99,11 @@ void NoctropolisEngine::initVariables() {
 	_animation->clearTimers();
 
 	initMinigame();
+	ARRAYCLEAR(_flags);
+	ARRAYCLEAR(_ask);
+	for (auto &entry : _inventory->_inv) {
+		entry._value = ITEM_NOT_FOUND;
+	}
 
 	// This is Noct_InitTravel in the original
 	_travScrollRow = 15;
@@ -814,6 +819,9 @@ Common::Error NoctropolisEngine::synchronize(Common::Serializer &s) {
 		s.syncAsByte(_establishTable[i]);
 
 	_stil->synchronize(s);
+	
+	if (s.isLoading()) // clear minigame state on load
+		initMinigame();
 
 	return result;
 }
diff --git a/engines/access/noctropolis/noctropolis_inventory.cpp b/engines/access/noctropolis/noctropolis_inventory.cpp
index a9c440d4f3c..746928bbfed 100644
--- a/engines/access/noctropolis/noctropolis_inventory.cpp
+++ b/engines/access/noctropolis/noctropolis_inventory.cpp
@@ -124,7 +124,8 @@ int NoctropolisInventory::displayInv() {
 				slotY += MAX(0, 19 - inventorySprites->getFrame(spriteIndex)->h / 2);
 				const Common::Point slotPt(slotX, slotY);
 				screen->plotF(inventorySprites->getFrame(spriteIndex), slotPt);
-				font->drawString(screen, Common::String::format("%d", spriteIndex), slotPt);
+				// Useful for debugging - draw sprite number
+				//font->drawString(screen, Common::String::format("%d", spriteIndex), slotPt);
 			}
 
 		}


Commit: 0a0539639fc3f07304be1e813dd72629dce51396
    https://github.com/scummvm/scummvm/commit/0a0539639fc3f07304be1e813dd72629dce51396
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Small fixes for Noctropolis death screen

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 6cb88a4f057..4289edff250 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -532,7 +532,7 @@ void NoctropolisEngine::dead(int deathType) {
 
 	const char *deathScreenFile =
 		(deathType < 6 || deathType == 9 || deathType == 10 || deathType == 11)
-		 ? "DEATH1.SCN" : "DEATH.SCN";
+		 ? "DEATH.SCN" : "DEATH1.SCN";
 
 	const Common::Point vidPos(DEAD_COORD[vidType].x, DEAD_COORD[vidType].y);
 
@@ -552,7 +552,7 @@ void NoctropolisEngine::dead(int deathType) {
 
 	_screen->_printOrg = _screen->_printStart = Common::Point(deathTextX, deathTextY);
 	_bubbleBox->_type = (BoxType)(kTextBoxNoctCaption | kTextBoxNoctPlain);
-	_bubbleBox->_bubbleTitle = deathTextCaption;
+	_bubbleBox->_bubbleDisplStr = deathTextCaption;
 	_bubbleBox->placeBubble(res->getDeathText(deathType));
 
 	_screen->setIconPalette();


Commit: b7be69dc26e22e420aea342cd6a013da43fe7138
    https://github.com/scummvm/scummvm/commit/b7be69dc26e22e420aea342cd6a013da43fe7138
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix cmdRetPos in MM

This fixes #16732.

Changed paths:
    engines/access/scripts.cpp


diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 3570aa37746..7fb89f542c9 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -323,10 +323,12 @@ void Scripts::cmdObject() {
 void Scripts::cmdEndObject() {
 	const char *msg = _vm->_res->getGeneralMessage(_vm->_room->_selectCommand);
 	debugC(1, kDebugScripts, "cmdEndObject(msg=\"%s\")", msg);
-	if (_vm->getGameID() == kGameMartianMemorandum)
+	if (_vm->getGameID() == kGameMartianMemorandum) {
 		doCmdPrint_v1(msg);
-	else
+		cmdRetPos();
+	} else {
 		printString(msg);
+	}
 }
 
 


Commit: ec15fef92a76a9b7ce7cbe0255a9d834d9d8d99a
    https://github.com/scummvm/scummvm/commit/ec15fef92a76a9b7ce7cbe0255a9d834d9d8d99a
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix v1 video player

Broke it during refactoring for Noctropolis

Changed paths:
    engines/access/video.cpp
    engines/access/video.h


diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index 50e1ab69698..e35a4262e52 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -94,8 +94,6 @@ VideoPlayer_v1::VideoPlayer_v1(AccessEngine *vm) : VideoPlayer(vm) {
 void VideoPlayer_v1::setVideo(const Common::Point &pt) {
 	_vidSurface->_orgX1 = pt.x;
 	_vidSurface->_orgY1 = pt.y;
-	_vm->_timers[31]._timer = _rate;
-	_vm->_timers[31]._initTm = _rate;
 
 	// Load in header
 	_header._frameCount = _videoData->_stream->readUint16LE();
@@ -132,6 +130,12 @@ void VideoPlayer_v1::setVideo(const Common::Point &pt) {
 	_videoEnd = false;
 }
 
+void VideoPlayer_v1::setRate(int rate) {
+	_rate = rate;
+	_vm->_timers[31]._timer = rate;
+	_vm->_timers[31]._initTm = _rate;
+}
+
 
 void VideoPlayer_v1::getFrame() {
 	_frameSize = _videoData->_stream->readUint16LE();
diff --git a/engines/access/video.h b/engines/access/video.h
index ad0ba66b824..a6f923c697b 100644
--- a/engines/access/video.h
+++ b/engines/access/video.h
@@ -104,7 +104,7 @@ private:
 protected:
 	void setVideo(const Common::Point &pt) override;
 
-	void setRate(int rate) override { _rate = rate; }
+	void setRate(int rate) override;
 
 	void delayToNextFrame() override;
 


Commit: 7fd8c6aab68689ecb65c5f2bc5273ce1f6e22f48
    https://github.com/scummvm/scummvm/commit/7fd8c6aab68689ecb65c5f2bc5273ce1f6e22f48
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix build after rebase

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 4289edff250..14775b92cd1 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -667,7 +667,7 @@ bool NoctropolisEngine::minigameIsSolved(uint rowIndex, const byte *finalRow) {
 
 void NoctropolisEngine::playStilMorph() {
 	_midi->stopSong();
-	_system->showMouse(false);
+	_events->hideCursor();
 	_midi->loadMusic(98, 4);
 	_midi->midiPlay();
 	_screen->fadeOut();
@@ -677,7 +677,7 @@ void NoctropolisEngine::playStilMorph() {
 	_screen->setIconPalette();
 	_screen->setPalette();
 	vidPlayer.playToEnd();
-	_system->showMouse(true);
+	_events->showCursor();
 }
 
 void NoctropolisEngine::flashPaletteEffect() {
@@ -688,7 +688,7 @@ void NoctropolisEngine::flashPaletteEffect() {
 
 void NoctropolisEngine::shotoMeanwhile() {
 	_midi->stopSong();
-	_system->showMouse(false);
+	_events->hideCursor();
 	_midi->loadMusic(98, 2);
 	_midi->midiPlay();
 	_screen->fadeOut();
@@ -714,7 +714,7 @@ void NoctropolisEngine::shotoMeanwhile() {
 	_midi->stopSong();
 	_screen->copyRawPalToTempPal();
 	_screen->fadeOut();
-	_system->showMouse(true);
+	_events->showCursor();
 }
 
 void NoctropolisEngine::showComicCover() {


Commit: d6fc8b3ec3b81ce5640aac9a499fc13bf4723004
    https://github.com/scummvm/scummvm/commit/d6fc8b3ec3b81ce5640aac9a499fc13bf4723004
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix whitespace and remove unused files

Changed paths:
  R engines/access/noctropolis/noctropolis_intro.cpp
  R engines/access/noctropolis/noctropolis_map.cpp
    engines/access/access.cpp
    engines/access/data.h
    engines/access/detection_tables.h
    engines/access/files.h
    engines/access/martian/martian_duct.cpp
    engines/access/martian/martian_resources.cpp
    engines/access/metaengine.cpp
    engines/access/noctropolis/noctropolis_font.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_last_comic.cpp
    engines/access/noctropolis/noctropolis_special_comic.cpp
    engines/access/player.h
    engines/access/resources.cpp
    engines/access/room.h


diff --git a/engines/access/access.cpp b/engines/access/access.cpp
index 5133600fa7e..70c3f2a6804 100644
--- a/engines/access/access.cpp
+++ b/engines/access/access.cpp
@@ -518,8 +518,8 @@ Common::Error AccessEngine::saveGameStream(Common::WriteStream *stream, bool isA
 	return synchronize(s);
 }
 
-Common::Error AccessEngine::loadGameStream(Common::SeekableReadStream *stream) {	
-	Common::Serializer s(stream, nullptr);	
+Common::Error AccessEngine::loadGameStream(Common::SeekableReadStream *stream) {
+	Common::Serializer s(stream, nullptr);
 	Common::Error result = synchronize(s);
 
 	// Set extra post-load state
@@ -544,7 +544,7 @@ Common::Error AccessEngine::loadGameState(int slot) {
 		delete saveFile;
 		return Engine::loadGameState(slot);
 	}
-		
+
 	// Load most of the savegame data
 	synchronize(s);
 	delete saveFile;
@@ -624,8 +624,8 @@ bool AccessEngine::readSavegameHeader(Common::InSaveFile *in, AccessSavegameHead
 
 	// Read the Total PlayTime (if available)
 	if (header._version > 1)
-		header._totalPlayTime = in->readUint32LE();	
-	
+		header._totalPlayTime = in->readUint32LE();
+
 	return true;
 }
 
@@ -661,17 +661,17 @@ static const AccessActionCode MARTIAN_ACTION_CODES[] = {
 };
 
 static const AccessActionCode NOCTROPOLIS_ACTION_CODES[] = {
-    { kActionLook,      0, },
-    { kActionOpen,      1, },
-    { kActionMove,      2, },
-    { kActionTake,      3, },
-    { kActionTalk,      4, },
-    { kActionUse,       5, },
-    { kActionWalk,      6, },
-    { kActionInventory, 7, },
-    { kActionTravel,    8, },
-    { kActionOptions,   9, },
-    { kActionSaveLoad,  10 },
+	{ kActionLook,      0, },
+	{ kActionOpen,      1, },
+	{ kActionMove,      2, },
+	{ kActionTake,      3, },
+	{ kActionTalk,      4, },
+	{ kActionUse,       5, },
+	{ kActionWalk,      6, },
+	{ kActionInventory, 7, },
+	{ kActionTravel,    8, },
+	{ kActionOptions,   9, },
+	{ kActionSaveLoad,  10 },
 	{ kActionNone, -1 },
 };
 
diff --git a/engines/access/data.h b/engines/access/data.h
index 41ccce31082..52dd7935570 100644
--- a/engines/access/data.h
+++ b/engines/access/data.h
@@ -45,7 +45,7 @@ struct TimerEntry {
 	int _initTm;
 	int _timer;
 	byte _flag;
-	
+
 	bool isActive() const { return _flag != 0; }
 
 	void reset() {
diff --git a/engines/access/detection_tables.h b/engines/access/detection_tables.h
index 22de7784469..270435bd981 100644
--- a/engines/access/detection_tables.h
+++ b/engines/access/detection_tables.h
@@ -129,7 +129,7 @@ static const AccessGameDescription gameDescriptions[] = {
 		kGameMartianMemorandum,
 		0
 	},
-	
+
 	{
 		// Noctropolis (Sum from GOG Windows and macOS versions)
 		{
diff --git a/engines/access/files.h b/engines/access/files.h
index 746c3fd34a0..ea83ae92e31 100644
--- a/engines/access/files.h
+++ b/engines/access/files.h
@@ -97,7 +97,7 @@ private:
 	 * Open up a sub-file resource within an alrady opened container file.
 	 */
 	void gotoAppended(Resource *file, int subfile);
-	
+
 	/**
 	 * Read index data from the container file
 	 */
diff --git a/engines/access/martian/martian_duct.cpp b/engines/access/martian/martian_duct.cpp
index 0bf27f441c1..daafaed558a 100644
--- a/engines/access/martian/martian_duct.cpp
+++ b/engines/access/martian/martian_duct.cpp
@@ -739,7 +739,7 @@ int MartianDuct::addPointsToMainPrimArray(int tempCount) {
 		_primZ2Array.resize(dstIdx + tempCount);
 	}
 
-    for (int srcidx = 0; srcidx < tempCount; srcidx += 2) {
+	for (int srcidx = 0; srcidx < tempCount; srcidx += 2) {
 		_primX1Array[dstIdx] = _tempPoints[srcidx].x;
 		_primY1Array[dstIdx] = _tempPoints[srcidx].y;
 		_primZ1Array[dstIdx] = _tempPoints[srcidx].z;
diff --git a/engines/access/martian/martian_resources.cpp b/engines/access/martian/martian_resources.cpp
index 15fa3865df7..adb14560eb5 100644
--- a/engines/access/martian/martian_resources.cpp
+++ b/engines/access/martian/martian_resources.cpp
@@ -313,7 +313,7 @@ const DuctMapPoint DUCT_MAP_DATA[] = {
 	{ 0xFF,     0xE,   0xA8C,   0x1F4, },
 	{ 0xFF,     0xE,   0xA8C,   0x3E8, },
 	{ 0xFF,     0xE,   0x3E8,   0x1F4, },
-    { -1,  -1,  -1,  -1, },
+	{ -1,  -1,  -1,  -1, },
 };
 
 static const Point3 DUCT_SHAPE_0_POINTS[] = {
@@ -476,12 +476,12 @@ static const Point3 DUCT_SHAPE_16_POINTS[] = {
 };
 
 static const uint16 DUCT_SHAPE_0_DATA[] = {
-    1, 4, 8, 0xA, 2, 0, 2, 4, 1, 9, 8, 0, 3, 4, 0xB, 3,
-    1, 9, 4, 4, 0xC, 0xA, 2, 4, 5, 4, 0xD, 0xB, 3, 5, 6, 4,
-    0xE, 0xC, 4, 6, 7, 4, 0xF, 0xE, 6, 7, 8, 4, 0xF, 0xD, 5, 7
+	1, 4, 8, 0xA, 2, 0, 2, 4, 1, 9, 8, 0, 3, 4, 0xB, 3,
+	1, 9, 4, 4, 0xC, 0xA, 2, 4, 5, 4, 0xD, 0xB, 3, 5, 6, 4,
+	0xE, 0xC, 4, 6, 7, 4, 0xF, 0xE, 6, 7, 8, 4, 0xF, 0xD, 5, 7
 };
 static const uint16 DUCT_SHAPE_1_DATA[] = {
-    1, 4, 8, 0xA, 2, 0, 2, 4, 1, 9, 8, 0, 3, 4, 0xB, 3, 1, 9,
+	1, 4, 8, 0xA, 2, 0, 2, 4, 1, 9, 8, 0, 3, 4, 0xB, 3, 1, 9,
 	4, 4, 0xC, 0xA, 2, 4, 5, 4, 0xD, 0xB, 3, 5, 6, 4, 0xE, 0xC,
 	4, 6, 7, 4, 0xF, 0xE, 6, 7, 8, 4, 0xF, 0xD, 5, 7
 };
@@ -575,8 +575,8 @@ static const uint16 DUCT_SHAPE_14_DATA[] = {
 	1, 4, 0, 6, 4, 2, 2, 4, 1, 7, 5, 3
 };
 static const uint16 DUCT_SHAPE_15_DATA[] = {
-    6, 4, 0, 2, 3, 1, 4, 4, 0, 6, 4, 2,
-    3, 4, 1, 7, 5, 3, 5, 4, 6, 7, 5, 4
+	6, 4, 0, 2, 3, 1, 4, 4, 0, 6, 4, 2,
+	3, 4, 1, 7, 5, 3, 5, 4, 6, 7, 5, 4
 };
 static const uint16 DUCT_SHAPE_16_DATA[] = {
 	4, 4, 0, 6, 4, 2, 3, 4, 1, 7, 5, 3,
@@ -773,71 +773,71 @@ static const byte CURSOR_2_DATA[] = {
 };
 
 static const byte BITFONT_DATA[] = {
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x08, 0x08, 0x08, 0x00, 0x08, 0x00, 0x00,
-    0x00, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x14, 0x3E, 0x14, 0x3E, 0x14, 0x00, 0x00,
-    0x3C, 0x50, 0x38, 0x14, 0x78, 0x10, 0x00, 0x00,
-    0x00, 0x22, 0x04, 0x08, 0x10, 0x22, 0x00, 0x00,
-    0x00, 0x30, 0x48, 0x30, 0x2A, 0x4C, 0x32, 0x00,
-    0x00, 0x18, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x0C, 0x18, 0x10, 0x18, 0x0C, 0x00, 0x00,
-    0x00, 0x30, 0x18, 0x08, 0x18, 0x30, 0x00, 0x00,
-    0x00, 0x2A, 0x1C, 0x3E, 0x1C, 0x2A, 0x00, 0x00,
-    0x00, 0x00, 0x08, 0x1C, 0x08, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x18, 0x08, 0x10, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-    0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00,
-    0x00, 0x3C, 0x4A, 0x52, 0x62, 0x3C, 0x00, 0x00,
-    0x00, 0x08, 0x18, 0x08, 0x08, 0x1C, 0x00, 0x00,
-    0x00, 0x3C, 0x42, 0x0C, 0x30, 0x7E, 0x00, 0x00,
-    0x00, 0x3C, 0x42, 0x1C, 0x42, 0x3C, 0x00, 0x00,
-    0x00, 0x42, 0x42, 0x7E, 0x02, 0x02, 0x00, 0x00,
-    0x00, 0x7E, 0x40, 0x7C, 0x02, 0x7C, 0x00, 0x00,
-    0x00, 0x3C, 0x40, 0x7C, 0x42, 0x3C, 0x00, 0x00,
-    0x00, 0x7E, 0x02, 0x04, 0x08, 0x08, 0x00, 0x00,
-    0x00, 0x3C, 0x42, 0x3C, 0x42, 0x3C, 0x00, 0x00,
-    0x00, 0x3C, 0x42, 0x3E, 0x02, 0x3C, 0x00, 0x00,
-    0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x08, 0x00, 0x18, 0x08, 0x10, 0x00,
-    0x00, 0x08, 0x10, 0x20, 0x10, 0x08, 0x00, 0x00,
-    0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00,
-    0x00, 0x10, 0x08, 0x04, 0x08, 0x10, 0x00, 0x00,
-    0x00, 0x3C, 0x24, 0x0C, 0x00, 0x08, 0x00, 0x00,
-    0x00, 0x3C, 0x42, 0x5E, 0x40, 0x3E, 0x00, 0x00,
-    0x00, 0x3C, 0x42, 0x42, 0x7E, 0x42, 0x00, 0x00,
-    0x00, 0x7C, 0x42, 0x7C, 0x42, 0x7C, 0x00, 0x00,
-    0x00, 0x3C, 0x42, 0x40, 0x42, 0x3C, 0x00, 0x00,
-    0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00,
-    0x00, 0x7E, 0x40, 0x7C, 0x40, 0x7E, 0x00, 0x00,
-    0x00, 0x7E, 0x40, 0x7C, 0x40, 0x40, 0x00, 0x00,
-    0x00, 0x3C, 0x40, 0x4E, 0x42, 0x3C, 0x00, 0x00,
-    0x00, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x00, 0x00,
-    0x00, 0x7C, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,
-    0x00, 0x1E, 0x04, 0x04, 0x44, 0x38, 0x00, 0x00,
-    0x00, 0x42, 0x4C, 0x70, 0x4C, 0x42, 0x00, 0x00,
-    0x00, 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00,
-    0x00, 0x41, 0x63, 0x55, 0x49, 0x41, 0x00, 0x00,
-    0x00, 0x42, 0x62, 0x5A, 0x46, 0x42, 0x00, 0x00,
-    0x00, 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,
-    0x00, 0x7C, 0x42, 0x7C, 0x40, 0x40, 0x00, 0x00,
-    0x00, 0x3C, 0x42, 0x42, 0x44, 0x3A, 0x00, 0x00,
-    0x00, 0x7C, 0x42, 0x7C, 0x44, 0x42, 0x00, 0x00,
-    0x00, 0x3C, 0x40, 0x3C, 0x02, 0x3C, 0x00, 0x00,
-    0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,
-    0x00, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,
-    0x00, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00,
-    0x00, 0x41, 0x49, 0x55, 0x63, 0x41, 0x00, 0x00,
-    0x00, 0x42, 0x24, 0x18, 0x24, 0x42, 0x00, 0x00,
-    0x00, 0x42, 0x42, 0x24, 0x18, 0x18, 0x00, 0x00,
-    0x00, 0x7E, 0x04, 0x18, 0x20, 0x7E, 0x00, 0x00,
-    0x00, 0x10, 0x38, 0x7C, 0x38, 0x38, 0x00, 0x00,
-    0x00, 0x38, 0x38, 0x7C, 0x38, 0x10, 0x00, 0x00,
-    0x00, 0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x00,
-    0x00, 0x7F, 0x55, 0x49, 0x55, 0x7F, 0x00, 0x00,
-    0xFF, 0x91, 0xBD, 0xBD, 0x91, 0xFF, 0x00, 0x00,
-    0xFF, 0x89, 0xBD, 0xBD, 0x89, 0xFF, 0x00, 0x00
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x08, 0x08, 0x08, 0x00, 0x08, 0x00, 0x00,
+	0x00, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x14, 0x3E, 0x14, 0x3E, 0x14, 0x00, 0x00,
+	0x3C, 0x50, 0x38, 0x14, 0x78, 0x10, 0x00, 0x00,
+	0x00, 0x22, 0x04, 0x08, 0x10, 0x22, 0x00, 0x00,
+	0x00, 0x30, 0x48, 0x30, 0x2A, 0x4C, 0x32, 0x00,
+	0x00, 0x18, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x0C, 0x18, 0x10, 0x18, 0x0C, 0x00, 0x00,
+	0x00, 0x30, 0x18, 0x08, 0x18, 0x30, 0x00, 0x00,
+	0x00, 0x2A, 0x1C, 0x3E, 0x1C, 0x2A, 0x00, 0x00,
+	0x00, 0x00, 0x08, 0x1C, 0x08, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x18, 0x08, 0x10, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
+	0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00,
+	0x00, 0x3C, 0x4A, 0x52, 0x62, 0x3C, 0x00, 0x00,
+	0x00, 0x08, 0x18, 0x08, 0x08, 0x1C, 0x00, 0x00,
+	0x00, 0x3C, 0x42, 0x0C, 0x30, 0x7E, 0x00, 0x00,
+	0x00, 0x3C, 0x42, 0x1C, 0x42, 0x3C, 0x00, 0x00,
+	0x00, 0x42, 0x42, 0x7E, 0x02, 0x02, 0x00, 0x00,
+	0x00, 0x7E, 0x40, 0x7C, 0x02, 0x7C, 0x00, 0x00,
+	0x00, 0x3C, 0x40, 0x7C, 0x42, 0x3C, 0x00, 0x00,
+	0x00, 0x7E, 0x02, 0x04, 0x08, 0x08, 0x00, 0x00,
+	0x00, 0x3C, 0x42, 0x3C, 0x42, 0x3C, 0x00, 0x00,
+	0x00, 0x3C, 0x42, 0x3E, 0x02, 0x3C, 0x00, 0x00,
+	0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x08, 0x00, 0x18, 0x08, 0x10, 0x00,
+	0x00, 0x08, 0x10, 0x20, 0x10, 0x08, 0x00, 0x00,
+	0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00,
+	0x00, 0x10, 0x08, 0x04, 0x08, 0x10, 0x00, 0x00,
+	0x00, 0x3C, 0x24, 0x0C, 0x00, 0x08, 0x00, 0x00,
+	0x00, 0x3C, 0x42, 0x5E, 0x40, 0x3E, 0x00, 0x00,
+	0x00, 0x3C, 0x42, 0x42, 0x7E, 0x42, 0x00, 0x00,
+	0x00, 0x7C, 0x42, 0x7C, 0x42, 0x7C, 0x00, 0x00,
+	0x00, 0x3C, 0x42, 0x40, 0x42, 0x3C, 0x00, 0x00,
+	0x00, 0x7C, 0x42, 0x42, 0x42, 0x7C, 0x00, 0x00,
+	0x00, 0x7E, 0x40, 0x7C, 0x40, 0x7E, 0x00, 0x00,
+	0x00, 0x7E, 0x40, 0x7C, 0x40, 0x40, 0x00, 0x00,
+	0x00, 0x3C, 0x40, 0x4E, 0x42, 0x3C, 0x00, 0x00,
+	0x00, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x00, 0x00,
+	0x00, 0x7C, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,
+	0x00, 0x1E, 0x04, 0x04, 0x44, 0x38, 0x00, 0x00,
+	0x00, 0x42, 0x4C, 0x70, 0x4C, 0x42, 0x00, 0x00,
+	0x00, 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00,
+	0x00, 0x41, 0x63, 0x55, 0x49, 0x41, 0x00, 0x00,
+	0x00, 0x42, 0x62, 0x5A, 0x46, 0x42, 0x00, 0x00,
+	0x00, 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,
+	0x00, 0x7C, 0x42, 0x7C, 0x40, 0x40, 0x00, 0x00,
+	0x00, 0x3C, 0x42, 0x42, 0x44, 0x3A, 0x00, 0x00,
+	0x00, 0x7C, 0x42, 0x7C, 0x44, 0x42, 0x00, 0x00,
+	0x00, 0x3C, 0x40, 0x3C, 0x02, 0x3C, 0x00, 0x00,
+	0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,
+	0x00, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,
+	0x00, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00,
+	0x00, 0x41, 0x49, 0x55, 0x63, 0x41, 0x00, 0x00,
+	0x00, 0x42, 0x24, 0x18, 0x24, 0x42, 0x00, 0x00,
+	0x00, 0x42, 0x42, 0x24, 0x18, 0x18, 0x00, 0x00,
+	0x00, 0x7E, 0x04, 0x18, 0x20, 0x7E, 0x00, 0x00,
+	0x00, 0x10, 0x38, 0x7C, 0x38, 0x38, 0x00, 0x00,
+	0x00, 0x38, 0x38, 0x7C, 0x38, 0x10, 0x00, 0x00,
+	0x00, 0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x00,
+	0x00, 0x7F, 0x55, 0x49, 0x55, 0x7F, 0x00, 0x00,
+	0xFF, 0x91, 0xBD, 0xBD, 0x91, 0xFF, 0x00, 0x00,
+	0xFF, 0x89, 0xBD, 0xBD, 0x89, 0xFF, 0x00, 0x00
 };
 
 static const byte CURSOR_3_DATA[] = {
diff --git a/engines/access/metaengine.cpp b/engines/access/metaengine.cpp
index 3e405eeb05e..4da9f8dedb9 100644
--- a/engines/access/metaengine.cpp
+++ b/engines/access/metaengine.cpp
@@ -181,7 +181,7 @@ SaveStateDescriptor AccessMetaEngine::querySaveMetaInfos(const char *target, int
 			desc.setPlayTime(eHeader.playtime);
 			return desc;
 		}
-			
+
 		Access::AccessSavegameHeader header;
 		if (Access::AccessEngine::readSavegameHeader(f, header, false)) {
 			delete f;
@@ -195,7 +195,7 @@ SaveStateDescriptor AccessMetaEngine::querySaveMetaInfos(const char *target, int
 
 		delete f;
 
-		return SaveStateDescriptor();				
+		return SaveStateDescriptor();
 	}
 
 	return SaveStateDescriptor();
diff --git a/engines/access/noctropolis/noctropolis_font.cpp b/engines/access/noctropolis/noctropolis_font.cpp
index 581a9c49bcb..13a3f805b75 100644
--- a/engines/access/noctropolis/noctropolis_font.cpp
+++ b/engines/access/noctropolis/noctropolis_font.cpp
@@ -113,7 +113,7 @@ void NoctropolisFont::load(const uint16 *offsets, const byte *data) {
 		dump.copyRectToSurface(_chars[ch], x, 0, Common::Rect(_chars[ch].w, _chars[ch].h));
 		x += _chars[ch].w;
 	}
-	
+
 	byte pal[768];
 	ARRAYCLEAR(pal);
 	pal[3] = pal[4] = pal[5] = 0xff;
@@ -126,1049 +126,1049 @@ void NoctropolisFont::load(const uint16 *offsets, const byte *data) {
 // Just a bunch of data from here onward.
 
 const uint16 CHALETEU_OFFSETS[] = {
-    0x0,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
-    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
-    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
-    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
-    0x5,     0x8,     0xE,     0x15,    0x1B,    0x23,    0x2A,    0x2D,
-    0x30,    0x33,    0x39,    0x40,    0x43,    0x48,    0x4B,    0x50,
-    0x58,    0x5C,    0x62,    0x68,    0x6E,    0x74,    0x7A,    0x80,
-    0x86,    0x8C,    0x8F,    0x92,    0x96,    0x9B,    0x9F,    0xA5,
-    0xAD,    0xB5,    0xBB,    0xC3,    0xCA,    0xD0,    0xD6,    0xDF,
-    0xE6,    0xE9,    0xEE,    0xF4,    0xFA,    0x103,   0x10B,   0x114,
-    0x11A,   0x123,   0x129,   0x12F,   0x135,   0x13D,   0x145,   0x150,
-    0x159,   0x161,   0x168,   0x16B,   0x170,   0x173,   0x178,   0x17A,
-    0x17D,   0x184,   0x18B,   0x192,   0x199,   0x1A0,   0x1A4,   0x1AB,
-    0x1B2,   0x1B5,   0x1BA,   0x1C0,   0x1C3,   0x1CD,   0x1D4,   0x1DB,
-    0x1E2,   0x1E9,   0x1EE,   0x1F3,   0x1F7,   0x1FE,   0x204,   0x20E,
-    0x215,   0x21B,   0x221,   0x225,   0x227,   0x22B,   0x230,   0x230,
-    0x237,   0x23E,   0x245,   0x24C,   0x253,   0x25A,   0x261,   0x268,
-    0x26F,   0x276,   0x27D,   0x282,   0x289,   0x28D,   0x295,   0x29B,
-    0x2A2,   0x2AA,   0x2B0,   0x2B7,   0x2BE,   0x2C5,   0x2CC,   0x2D3,
-    0x2D9,   0x2DF,   0x2E7,   0x2E7,   0x2E7,   0x2E7,   0x2EE,   0x2EE,
-    0x2F5,   0x2F9,   0x300,   0x307,   0x30E,   0x315,   0x31B,   0x320,
-    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
-    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
-    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
-    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
-    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
-    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
-    0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
-    0x320,   0x326
+	0x0,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+	0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+	0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+	0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+	0x5,     0x8,     0xE,     0x15,    0x1B,    0x23,    0x2A,    0x2D,
+	0x30,    0x33,    0x39,    0x40,    0x43,    0x48,    0x4B,    0x50,
+	0x58,    0x5C,    0x62,    0x68,    0x6E,    0x74,    0x7A,    0x80,
+	0x86,    0x8C,    0x8F,    0x92,    0x96,    0x9B,    0x9F,    0xA5,
+	0xAD,    0xB5,    0xBB,    0xC3,    0xCA,    0xD0,    0xD6,    0xDF,
+	0xE6,    0xE9,    0xEE,    0xF4,    0xFA,    0x103,   0x10B,   0x114,
+	0x11A,   0x123,   0x129,   0x12F,   0x135,   0x13D,   0x145,   0x150,
+	0x159,   0x161,   0x168,   0x16B,   0x170,   0x173,   0x178,   0x17A,
+	0x17D,   0x184,   0x18B,   0x192,   0x199,   0x1A0,   0x1A4,   0x1AB,
+	0x1B2,   0x1B5,   0x1BA,   0x1C0,   0x1C3,   0x1CD,   0x1D4,   0x1DB,
+	0x1E2,   0x1E9,   0x1EE,   0x1F3,   0x1F7,   0x1FE,   0x204,   0x20E,
+	0x215,   0x21B,   0x221,   0x225,   0x227,   0x22B,   0x230,   0x230,
+	0x237,   0x23E,   0x245,   0x24C,   0x253,   0x25A,   0x261,   0x268,
+	0x26F,   0x276,   0x27D,   0x282,   0x289,   0x28D,   0x295,   0x29B,
+	0x2A2,   0x2AA,   0x2B0,   0x2B7,   0x2BE,   0x2C5,   0x2CC,   0x2D3,
+	0x2D9,   0x2DF,   0x2E7,   0x2E7,   0x2E7,   0x2E7,   0x2EE,   0x2EE,
+	0x2F5,   0x2F9,   0x300,   0x307,   0x30E,   0x315,   0x31B,   0x320,
+	0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+	0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+	0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+	0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+	0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+	0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+	0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,   0x320,
+	0x320,   0x326
 };
 const byte   CHALETEU_DATA[] = {
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x4,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xc,    0x20,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x31,   0x80,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0xa,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x3,    0xff,   0x6,    0xd9,
-    0x21,   0xc,    0xe,    0x32,   0x95,   0x0,    0x0,    0x2,
-    0x38,   0x27,   0x3e,   0xb,    0xe1,   0x3e,   0x71,   0xc0,
-    0x0,    0x0,    0xe1,   0xc0,   0x87,   0x87,   0x1e,   0x3e,
-    0xf8,   0xf1,   0xa,    0xa,    0x28,   0x20,   0x50,   0x47,
-    0x8f,   0xf,    0x1e,   0x39,   0xf4,   0x14,   0x14,   0x82,
-    0x81,   0x41,   0x7e,   0xd0,   0xd2,   0x10,   0x8,    0x0,
-    0x1,    0x0,    0x30,   0x10,   0x31,   0xa0,   0xc0,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x15,   0x14,   0x78,   0x0,    0x33,   0xc0,
-    0x0,    0x0,    0x0,    0x79,   0xb,    0x4,    0x9e,   0x63,
-    0x61,   0x1,    0x80,   0x0,    0x78,   0x0,    0x3,    0xc0,
-    0x0,    0x45,   0x5,    0xc0,   0x3,    0x0,    0x0,    0x3,
-    0xf0,   0x0,    0x73,   0xff,   0x2,    0xd9,   0x23,   0x92,
-    0x51,   0x34,   0x4a,   0x0,    0x0,    0x2,    0x44,   0x68,
-    0x82,   0x12,   0x2,    0x2,    0x8a,   0x20,   0x0,    0x1,
-    0x12,   0x20,   0x84,   0x48,   0x91,   0x20,   0x81,   0x9,
-    0xa,    0xa,    0x48,   0x30,   0xd8,   0x48,   0x48,   0x90,
-    0x91,   0x44,   0x44,   0x14,   0x14,   0x82,   0x42,   0x22,
-    0x2,    0x90,   0x40,   0x8,    0x8,    0x0,    0x1,    0x0,
-    0x40,   0x10,   0x0,    0x20,   0x40,   0x0,    0x0,    0x0,
-    0x0,    0x0,    0x10,   0x0,    0x0,    0x0,    0x0,    0x0,
-    0x24,   0x80,   0x85,   0x8,    0x4,    0x28,   0x58,   0x4,
-    0x0,    0x84,   0x0,    0x0,    0x21,   0x0,    0x81,   0x0,
-    0x0,    0xe,    0x85,   0xb,    0x4,    0x2c,   0x11,   0x10,
-    0x1,    0x20,   0x30,   0x6,    0xd,    0xf0,   0x0,    0x0,
-    0x8b,   0xff,   0x2,    0x4b,   0xf5,   0x52,   0x91,   0x14,
-    0x4a,   0x10,   0x0,    0x4,    0x82,   0xa8,   0x84,   0x22,
-    0x4,    0x2,    0x8a,   0x2d,   0x88,   0x11,   0x14,   0x91,
-    0x44,   0x50,   0x50,   0xa0,   0x82,   0x5,    0xa,    0xa,
-    0x88,   0x29,   0x54,   0x50,   0x28,   0xa0,   0x51,   0x44,
-    0x44,   0x12,   0x22,   0x44,   0x24,   0x14,   0x4,    0x88,
-    0x40,   0x3,    0xef,   0x8f,   0x1f,   0x3c,   0xe7,   0xdf,
-    0x30,   0xa4,   0x5e,   0xe7,   0xc7,   0x9f,   0x1f,   0x59,
-    0x99,   0xa,    0x28,   0x8a,   0x14,   0x5f,   0x24,   0x80,
-    0x80,   0x1,    0xe0,   0x0,    0x0,    0x4,    0x3c,   0x78,
-    0xf1,   0xe3,   0xc,    0x31,   0x40,   0x1f,   0x9f,   0x94,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x29,   0x5,    0x20,
-    0x6,    0x0,    0x0,    0x2,    0x13,   0x9c,   0xf3,   0xff,
-    0x2,    0x91,   0x23,   0xd,    0xa,    0x24,   0x55,   0x10,
-    0x0,    0x4,    0x82,   0x21,   0x8,    0x53,   0xcb,   0x4,
-    0x72,   0x2d,   0x90,   0x8,    0x25,   0x51,   0x47,   0x90,
-    0x10,   0xbc,   0xf2,   0x1,    0xfa,   0xb,    0x8,    0x26,
-    0x52,   0x50,   0x28,   0xa0,   0x51,   0x30,   0x44,   0x12,
-    0x22,   0x44,   0x18,   0x8,    0x8,    0x88,   0x40,   0x4,
-    0x28,   0x50,   0xa1,   0x42,   0x48,   0x50,   0x90,   0xa8,
-    0x51,   0x14,   0x28,   0x50,   0xa1,   0x62,   0x51,   0xa,
-    0x28,   0x89,   0x24,   0x42,   0x24,   0x80,   0x81,   0xa,
-    0x13,   0xe7,   0xcf,   0x9f,   0x40,   0x85,   0xa,    0x11,
-    0x4,    0x11,   0x43,   0x88,   0x4,    0x24,   0x78,   0xf1,
-    0xe4,   0x28,   0x51,   0x45,   0x5,    0xf1,   0xf2,   0x3c,
-    0x85,   0xf3,   0x14,   0x92,   0x8b,   0xff,   0x2,    0x3,
-    0xf1,   0x83,   0x94,   0x4,    0x44,   0x7c,   0x1e,   0x8,
-    0x82,   0x22,   0x4,    0x90,   0x28,   0x84,   0x89,   0xa0,
-    0x23,   0xc4,   0x45,   0x52,   0x24,   0x50,   0x10,   0xa0,
-    0x82,   0x3d,   0xa,    0xb,    0x8,    0x20,   0x51,   0x50,
-    0x28,   0xa2,   0x51,   0x8,    0x44,   0x11,   0x41,   0x28,
-    0x18,   0x8,    0x10,   0x84,   0x40,   0x4,    0x28,   0x50,
-    0x21,   0x7e,   0x48,   0x50,   0x90,   0xb0,   0x51,   0x14,
-    0x28,   0x50,   0xa1,   0x41,   0x91,   0x9,    0x45,   0x50,
-    0xc2,   0x84,   0x44,   0x40,   0x85,   0xb,    0xf4,   0x28,
-    0x50,   0xa1,   0x40,   0xfd,   0xfb,   0xf1,   0x4,    0x12,
-    0x24,   0x48,   0x1f,   0x3e,   0x85,   0xa,    0x14,   0x28,
-    0x4a,   0x45,   0x5,    0x12,   0x12,   0x42,   0x85,   0xa,
-    0x94,   0x92,   0xf3,   0xff,   0x0,    0x1,    0x21,   0x46,
-    0x52,   0x84,   0x40,   0x10,   0x0,    0x8,    0x82,   0x24,
-    0x22,   0xfa,   0x28,   0x88,   0x88,   0x40,   0x10,   0x8,
-    0x4,    0xe2,   0x24,   0x50,   0x50,   0xa0,   0x82,   0x5,
-    0xa,    0xa,    0x88,   0x20,   0x50,   0xd0,   0x2f,   0x21,
-    0x5e,   0x44,   0x44,   0x11,   0x41,   0x68,   0x24,   0x8,
-    0x20,   0x84,   0x40,   0x4,    0x28,   0x50,   0x21,   0x40,
-    0x48,   0x50,   0x90,   0xa8,   0x51,   0x14,   0x28,   0x50,
-    0xa1,   0x40,   0x51,   0x9,    0x45,   0x50,   0xc2,   0x88,
-    0x24,   0x80,   0x79,   0xa,    0x4,    0x28,   0x50,   0xa1,
-    0x40,   0x81,   0x2,    0x1,    0x4,    0x12,   0x24,   0x4e,
-    0x24,   0x24,   0x85,   0xa,    0x14,   0x28,   0x4a,   0x45,
-    0x5,    0x3a,   0x12,   0x42,   0x85,   0xa,    0x53,   0xcc,
-    0x81,   0x14,   0x6,    0x1,    0x25,   0x4a,   0x51,   0x4,
-    0x40,   0x10,   0xc0,   0xd0,   0x44,   0x28,   0x22,   0x12,
-    0x28,   0x88,   0x88,   0x8d,   0x8b,   0xd0,   0xc2,   0x5,
-    0xd4,   0x48,   0x91,   0x20,   0x81,   0x9,    0xa,    0x4a,
-    0x48,   0x20,   0x50,   0x48,   0x48,   0x10,   0x92,   0x44,
-    0x42,   0x20,   0x80,   0x90,   0x42,   0x8,    0x40,   0x82,
-    0x40,   0x4,    0x28,   0x50,   0xa1,   0x42,   0x48,   0x50,
-    0x90,   0xa4,   0x51,   0x14,   0x28,   0x50,   0xa1,   0x42,
-    0x51,   0x8,    0x82,   0x21,   0x21,   0x10,   0x24,   0x80,
-    0x9,    0xa,    0x14,   0x28,   0x50,   0xa1,   0x3c,   0x85,
-    0xa,    0x11,   0x4,    0x15,   0xd7,   0xc8,   0x24,   0x24,
-    0x85,   0xa,    0x14,   0x28,   0x44,   0x28,   0x89,   0x12,
-    0x12,   0x42,   0x85,   0xa,    0x30,   0x0,    0x83,   0xff,
-    0x6,    0x0,    0x3,    0x91,   0x8e,   0x84,   0x40,   0x0,
-    0xc0,   0xd0,   0x38,   0x2f,   0x9c,   0x11,   0xc7,   0x10,
-    0x71,   0xd,    0x80,   0x0,    0xc1,   0xe4,   0x17,   0x87,
-    0x1e,   0x3e,   0x80,   0xf1,   0xa,    0x32,   0x2f,   0xa0,
-    0x50,   0x47,   0x88,   0xf,    0x51,   0x38,   0x41,   0xc0,
-    0x80,   0x90,   0x81,   0x8,    0x7e,   0x82,   0x40,   0xc3,
-    0xef,   0x8f,   0x1f,   0x3c,   0x47,   0xd0,   0x90,   0xa2,
-    0x51,   0x14,   0x27,   0x9f,   0x1f,   0x41,   0x8c,   0xf0,
-    0x82,   0x22,   0x11,   0x1f,   0x24,   0x80,   0x4,    0xf1,
-    0xe3,   0xe7,   0xcf,   0x9f,   0x2,    0x78,   0xf1,   0xe1,
-    0x4,    0x14,   0x14,   0x5f,   0x9f,   0xa6,   0x78,   0xf1,
-    0xe3,   0xc7,   0x84,   0x10,   0x71,   0x19,   0xf2,   0x3c,
-    0x79,   0xa,    0x17,   0xde,   0x83,   0xff,   0x0,    0x0,
-    0x1,    0x0,    0x0,    0x2,    0x80,   0x0,    0x40,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x80,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0xc0,   0xc0,   0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x40,   0x4,    0x80,   0x0,    0x0,
-    0x0,    0x10,   0x1,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x2,    0x0,    0x15,   0x0,    0x38,   0x0,    0x0,    0x0,
-    0x0,    0x0,    0xc,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x3,    0xff,   0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x80,   0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x1,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x7,    0x80,   0x3,    0x0,    0x0,    0x0,    0x0,    0x10,
-    0x1,    0x0,    0x0,    0x0,    0x0,    0x0,    0x2,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x8,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x3,    0xff,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x4,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xc,    0x20,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x31,   0x80,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0xa,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x3,    0xff,   0x6,    0xd9,
+	0x21,   0xc,    0xe,    0x32,   0x95,   0x0,    0x0,    0x2,
+	0x38,   0x27,   0x3e,   0xb,    0xe1,   0x3e,   0x71,   0xc0,
+	0x0,    0x0,    0xe1,   0xc0,   0x87,   0x87,   0x1e,   0x3e,
+	0xf8,   0xf1,   0xa,    0xa,    0x28,   0x20,   0x50,   0x47,
+	0x8f,   0xf,    0x1e,   0x39,   0xf4,   0x14,   0x14,   0x82,
+	0x81,   0x41,   0x7e,   0xd0,   0xd2,   0x10,   0x8,    0x0,
+	0x1,    0x0,    0x30,   0x10,   0x31,   0xa0,   0xc0,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x15,   0x14,   0x78,   0x0,    0x33,   0xc0,
+	0x0,    0x0,    0x0,    0x79,   0xb,    0x4,    0x9e,   0x63,
+	0x61,   0x1,    0x80,   0x0,    0x78,   0x0,    0x3,    0xc0,
+	0x0,    0x45,   0x5,    0xc0,   0x3,    0x0,    0x0,    0x3,
+	0xf0,   0x0,    0x73,   0xff,   0x2,    0xd9,   0x23,   0x92,
+	0x51,   0x34,   0x4a,   0x0,    0x0,    0x2,    0x44,   0x68,
+	0x82,   0x12,   0x2,    0x2,    0x8a,   0x20,   0x0,    0x1,
+	0x12,   0x20,   0x84,   0x48,   0x91,   0x20,   0x81,   0x9,
+	0xa,    0xa,    0x48,   0x30,   0xd8,   0x48,   0x48,   0x90,
+	0x91,   0x44,   0x44,   0x14,   0x14,   0x82,   0x42,   0x22,
+	0x2,    0x90,   0x40,   0x8,    0x8,    0x0,    0x1,    0x0,
+	0x40,   0x10,   0x0,    0x20,   0x40,   0x0,    0x0,    0x0,
+	0x0,    0x0,    0x10,   0x0,    0x0,    0x0,    0x0,    0x0,
+	0x24,   0x80,   0x85,   0x8,    0x4,    0x28,   0x58,   0x4,
+	0x0,    0x84,   0x0,    0x0,    0x21,   0x0,    0x81,   0x0,
+	0x0,    0xe,    0x85,   0xb,    0x4,    0x2c,   0x11,   0x10,
+	0x1,    0x20,   0x30,   0x6,    0xd,    0xf0,   0x0,    0x0,
+	0x8b,   0xff,   0x2,    0x4b,   0xf5,   0x52,   0x91,   0x14,
+	0x4a,   0x10,   0x0,    0x4,    0x82,   0xa8,   0x84,   0x22,
+	0x4,    0x2,    0x8a,   0x2d,   0x88,   0x11,   0x14,   0x91,
+	0x44,   0x50,   0x50,   0xa0,   0x82,   0x5,    0xa,    0xa,
+	0x88,   0x29,   0x54,   0x50,   0x28,   0xa0,   0x51,   0x44,
+	0x44,   0x12,   0x22,   0x44,   0x24,   0x14,   0x4,    0x88,
+	0x40,   0x3,    0xef,   0x8f,   0x1f,   0x3c,   0xe7,   0xdf,
+	0x30,   0xa4,   0x5e,   0xe7,   0xc7,   0x9f,   0x1f,   0x59,
+	0x99,   0xa,    0x28,   0x8a,   0x14,   0x5f,   0x24,   0x80,
+	0x80,   0x1,    0xe0,   0x0,    0x0,    0x4,    0x3c,   0x78,
+	0xf1,   0xe3,   0xc,    0x31,   0x40,   0x1f,   0x9f,   0x94,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x29,   0x5,    0x20,
+	0x6,    0x0,    0x0,    0x2,    0x13,   0x9c,   0xf3,   0xff,
+	0x2,    0x91,   0x23,   0xd,    0xa,    0x24,   0x55,   0x10,
+	0x0,    0x4,    0x82,   0x21,   0x8,    0x53,   0xcb,   0x4,
+	0x72,   0x2d,   0x90,   0x8,    0x25,   0x51,   0x47,   0x90,
+	0x10,   0xbc,   0xf2,   0x1,    0xfa,   0xb,    0x8,    0x26,
+	0x52,   0x50,   0x28,   0xa0,   0x51,   0x30,   0x44,   0x12,
+	0x22,   0x44,   0x18,   0x8,    0x8,    0x88,   0x40,   0x4,
+	0x28,   0x50,   0xa1,   0x42,   0x48,   0x50,   0x90,   0xa8,
+	0x51,   0x14,   0x28,   0x50,   0xa1,   0x62,   0x51,   0xa,
+	0x28,   0x89,   0x24,   0x42,   0x24,   0x80,   0x81,   0xa,
+	0x13,   0xe7,   0xcf,   0x9f,   0x40,   0x85,   0xa,    0x11,
+	0x4,    0x11,   0x43,   0x88,   0x4,    0x24,   0x78,   0xf1,
+	0xe4,   0x28,   0x51,   0x45,   0x5,    0xf1,   0xf2,   0x3c,
+	0x85,   0xf3,   0x14,   0x92,   0x8b,   0xff,   0x2,    0x3,
+	0xf1,   0x83,   0x94,   0x4,    0x44,   0x7c,   0x1e,   0x8,
+	0x82,   0x22,   0x4,    0x90,   0x28,   0x84,   0x89,   0xa0,
+	0x23,   0xc4,   0x45,   0x52,   0x24,   0x50,   0x10,   0xa0,
+	0x82,   0x3d,   0xa,    0xb,    0x8,    0x20,   0x51,   0x50,
+	0x28,   0xa2,   0x51,   0x8,    0x44,   0x11,   0x41,   0x28,
+	0x18,   0x8,    0x10,   0x84,   0x40,   0x4,    0x28,   0x50,
+	0x21,   0x7e,   0x48,   0x50,   0x90,   0xb0,   0x51,   0x14,
+	0x28,   0x50,   0xa1,   0x41,   0x91,   0x9,    0x45,   0x50,
+	0xc2,   0x84,   0x44,   0x40,   0x85,   0xb,    0xf4,   0x28,
+	0x50,   0xa1,   0x40,   0xfd,   0xfb,   0xf1,   0x4,    0x12,
+	0x24,   0x48,   0x1f,   0x3e,   0x85,   0xa,    0x14,   0x28,
+	0x4a,   0x45,   0x5,    0x12,   0x12,   0x42,   0x85,   0xa,
+	0x94,   0x92,   0xf3,   0xff,   0x0,    0x1,    0x21,   0x46,
+	0x52,   0x84,   0x40,   0x10,   0x0,    0x8,    0x82,   0x24,
+	0x22,   0xfa,   0x28,   0x88,   0x88,   0x40,   0x10,   0x8,
+	0x4,    0xe2,   0x24,   0x50,   0x50,   0xa0,   0x82,   0x5,
+	0xa,    0xa,    0x88,   0x20,   0x50,   0xd0,   0x2f,   0x21,
+	0x5e,   0x44,   0x44,   0x11,   0x41,   0x68,   0x24,   0x8,
+	0x20,   0x84,   0x40,   0x4,    0x28,   0x50,   0x21,   0x40,
+	0x48,   0x50,   0x90,   0xa8,   0x51,   0x14,   0x28,   0x50,
+	0xa1,   0x40,   0x51,   0x9,    0x45,   0x50,   0xc2,   0x88,
+	0x24,   0x80,   0x79,   0xa,    0x4,    0x28,   0x50,   0xa1,
+	0x40,   0x81,   0x2,    0x1,    0x4,    0x12,   0x24,   0x4e,
+	0x24,   0x24,   0x85,   0xa,    0x14,   0x28,   0x4a,   0x45,
+	0x5,    0x3a,   0x12,   0x42,   0x85,   0xa,    0x53,   0xcc,
+	0x81,   0x14,   0x6,    0x1,    0x25,   0x4a,   0x51,   0x4,
+	0x40,   0x10,   0xc0,   0xd0,   0x44,   0x28,   0x22,   0x12,
+	0x28,   0x88,   0x88,   0x8d,   0x8b,   0xd0,   0xc2,   0x5,
+	0xd4,   0x48,   0x91,   0x20,   0x81,   0x9,    0xa,    0x4a,
+	0x48,   0x20,   0x50,   0x48,   0x48,   0x10,   0x92,   0x44,
+	0x42,   0x20,   0x80,   0x90,   0x42,   0x8,    0x40,   0x82,
+	0x40,   0x4,    0x28,   0x50,   0xa1,   0x42,   0x48,   0x50,
+	0x90,   0xa4,   0x51,   0x14,   0x28,   0x50,   0xa1,   0x42,
+	0x51,   0x8,    0x82,   0x21,   0x21,   0x10,   0x24,   0x80,
+	0x9,    0xa,    0x14,   0x28,   0x50,   0xa1,   0x3c,   0x85,
+	0xa,    0x11,   0x4,    0x15,   0xd7,   0xc8,   0x24,   0x24,
+	0x85,   0xa,    0x14,   0x28,   0x44,   0x28,   0x89,   0x12,
+	0x12,   0x42,   0x85,   0xa,    0x30,   0x0,    0x83,   0xff,
+	0x6,    0x0,    0x3,    0x91,   0x8e,   0x84,   0x40,   0x0,
+	0xc0,   0xd0,   0x38,   0x2f,   0x9c,   0x11,   0xc7,   0x10,
+	0x71,   0xd,    0x80,   0x0,    0xc1,   0xe4,   0x17,   0x87,
+	0x1e,   0x3e,   0x80,   0xf1,   0xa,    0x32,   0x2f,   0xa0,
+	0x50,   0x47,   0x88,   0xf,    0x51,   0x38,   0x41,   0xc0,
+	0x80,   0x90,   0x81,   0x8,    0x7e,   0x82,   0x40,   0xc3,
+	0xef,   0x8f,   0x1f,   0x3c,   0x47,   0xd0,   0x90,   0xa2,
+	0x51,   0x14,   0x27,   0x9f,   0x1f,   0x41,   0x8c,   0xf0,
+	0x82,   0x22,   0x11,   0x1f,   0x24,   0x80,   0x4,    0xf1,
+	0xe3,   0xe7,   0xcf,   0x9f,   0x2,    0x78,   0xf1,   0xe1,
+	0x4,    0x14,   0x14,   0x5f,   0x9f,   0xa6,   0x78,   0xf1,
+	0xe3,   0xc7,   0x84,   0x10,   0x71,   0x19,   0xf2,   0x3c,
+	0x79,   0xa,    0x17,   0xde,   0x83,   0xff,   0x0,    0x0,
+	0x1,    0x0,    0x0,    0x2,    0x80,   0x0,    0x40,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x80,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0xc0,   0xc0,   0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x40,   0x4,    0x80,   0x0,    0x0,
+	0x0,    0x10,   0x1,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x2,    0x0,    0x15,   0x0,    0x38,   0x0,    0x0,    0x0,
+	0x0,    0x0,    0xc,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x8,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x3,    0xff,   0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x80,   0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x1,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x7,    0x80,   0x3,    0x0,    0x0,    0x0,    0x0,    0x10,
+	0x1,    0x0,    0x0,    0x0,    0x0,    0x0,    0x2,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x8,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x3,    0xff,
 };
 
 const uint16 SYSTEMEU_OFFSETS[] = {
-    0x0,     0x5,     0xA,     0x10,    0x18,    0x1F,    0x26,    0x26,
-    0x2A,    0x2F,    0x34,    0x34,    0x3A,    0x3E,    0x44,    0x48,
-    0x4E,    0x54,    0x59,    0x5F,    0x65,    0x6B,    0x71,    0x77,
-    0x7D,    0x83,    0x89,    0x8C,    0x8F,    0x8F,    0x95,    0x95,
-    0x9B,    0xA1,    0xA7,    0xAD,    0xB3,    0xB9,    0xBF,    0xC5,
-    0xCB,    0xD1,    0xD6,    0xDC,    0xE2,    0xE8,    0xF0,    0xF6,
-    0xFC,    0x102,   0x108,   0x10E,   0x114,   0x119,   0x11F,   0x125,
-    0x12D,   0x133,   0x139,   0x13F,   0x144,   0x14A,   0x14F,   0x155,
-    0x15C,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,
-    0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,
-    0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,
-    0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,
-    0x161,   0x167,   0x16D,   0x173,   0x179,   0x17F,   0x185,   0x18B,
-    0x191,   0x197,   0x19D,   0x1A3,   0x1A9,   0x1AF,   0x1B5,   0x1BB,
-    0x1C1,   0x1C7,   0x1CE,   0x1D5,   0x1DB,   0x1E1,   0x1E7,   0x1ED,
-    0x1F3,   0x1F9,   0x1FF,   0x205,   0x205,   0x205,   0x205,   0x205,
-    0x205,   0x20B,   0x210,   0x216,   0x21C,   0x222,   0x228,   0x22D,
-    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
-    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
-    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
-    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
-    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
-    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
-    0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
-    0x232,   0x232,   0x237,
+	0x0,     0x5,     0xA,     0x10,    0x18,    0x1F,    0x26,    0x26,
+	0x2A,    0x2F,    0x34,    0x34,    0x3A,    0x3E,    0x44,    0x48,
+	0x4E,    0x54,    0x59,    0x5F,    0x65,    0x6B,    0x71,    0x77,
+	0x7D,    0x83,    0x89,    0x8C,    0x8F,    0x8F,    0x95,    0x95,
+	0x9B,    0xA1,    0xA7,    0xAD,    0xB3,    0xB9,    0xBF,    0xC5,
+	0xCB,    0xD1,    0xD6,    0xDC,    0xE2,    0xE8,    0xF0,    0xF6,
+	0xFC,    0x102,   0x108,   0x10E,   0x114,   0x119,   0x11F,   0x125,
+	0x12D,   0x133,   0x139,   0x13F,   0x144,   0x14A,   0x14F,   0x155,
+	0x15C,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,
+	0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,
+	0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,
+	0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,   0x161,
+	0x161,   0x167,   0x16D,   0x173,   0x179,   0x17F,   0x185,   0x18B,
+	0x191,   0x197,   0x19D,   0x1A3,   0x1A9,   0x1AF,   0x1B5,   0x1BB,
+	0x1C1,   0x1C7,   0x1CE,   0x1D5,   0x1DB,   0x1E1,   0x1E7,   0x1ED,
+	0x1F3,   0x1F9,   0x1FF,   0x205,   0x205,   0x205,   0x205,   0x205,
+	0x205,   0x20B,   0x210,   0x216,   0x21C,   0x222,   0x228,   0x22D,
+	0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+	0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+	0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+	0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+	0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+	0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+	0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,   0x232,
+	0x232,   0x232,   0x237,
 };
 const byte   SYSTEMEU_DATA[] = {
-    0x3,    0x36,   0x6c,   0x10,   0x1,    0x8d,   0x80,   0x0,
-    0x0,    0x1,    0xc6,   0x79,   0xe0,   0x9f,   0x1d,   0xf3,
-    0x8e,   0x0,    0x3,    0x8e,   0x11,   0xe3,   0xde,   0x7d,
-    0xf3,   0xdb,   0x78,   0xec,   0xb0,   0xc6,   0x99,   0xcf,
-    0x1c,   0xf1,   0xef,   0x6d,   0xb6,   0x34,   0x51,   0x7d,
-    0xe0,   0x3c,   0x40,   0x6,    0x38,   0x0,    0xce,   0x45,
-    0x81,   0x0,    0x39,   0x16,   0x11,   0x39,   0x86,   0xc4,
-    0xc,    0x0,    0xf0,   0x0,    0x0,    0xe0,   0x11,   0x45,
-    0x10,   0xc6,   0x0,    0x0,    0x3e,   0x0,    0x19,   0x98,
-    0x7,    0xb6,   0xfe,   0x7d,   0x89,   0x98,   0xc2,   0x0,
-    0x0,    0xb,    0x6e,   0xc,    0x31,   0x98,   0x30,   0x36,
-    0xdb,   0x60,   0x6,    0xd3,   0x39,   0xb6,   0x1b,   0x61,
-    0x86,   0x1b,   0x30,   0x6d,   0xb0,   0xee,   0xdb,   0x6d,
-    0xb6,   0xdb,   0x6,    0x6d,   0xb6,   0x36,   0xd1,   0xd,
-    0x88,   0xc,    0xe0,   0x6,    0x65,   0x10,   0x11,   0x0,
-    0x1,    0x0,    0x44,   0x0,    0x0,    0x44,   0x1,    0x4,
-    0x0,    0x1,    0xe3,   0x91,   0x61,   0x16,   0x0,    0x10,
-    0x0,    0x0,    0x18,   0x6f,   0x0,    0x67,   0x24,   0xc,
-    0x7,    0xb6,   0x6c,   0xd1,   0x93,   0x30,   0x62,   0x0,
-    0x0,    0x12,   0x66,   0xc,    0x33,   0x98,   0x60,   0x36,
-    0xdb,   0x6d,   0xf0,   0xd7,   0x6d,   0xb6,   0x1b,   0x61,
-    0x86,   0x1b,   0x30,   0x6f,   0x30,   0xfe,   0xfb,   0x6d,
-    0xb6,   0xdb,   0x6,    0x6d,   0xb6,   0x33,   0x9b,   0x19,
-    0x8c,   0xd,    0xb0,   0x3,    0x60,   0x3,    0x8e,   0x38,
-    0xe3,   0x8e,   0x38,   0xe3,   0x8e,   0x38,   0xe3,   0x80,
-    0x7c,   0xfb,   0x64,   0x40,   0x0,    0x0,    0x1b,   0x39,
-    0xb3,   0x9c,   0x0,    0x0,    0x26,   0xa4,   0xb9,   0xc,
-    0x3,    0x0,    0x6c,   0x78,   0x20,   0x30,   0x6f,   0x83,
-    0xe0,   0x22,   0xa6,   0x18,   0xe6,   0x9e,   0x78,   0x63,
-    0x8f,   0xc,    0x1,    0x97,   0x6d,   0xe6,   0x1b,   0x79,
-    0xe6,   0xdf,   0x30,   0x6e,   0x30,   0xd6,   0xfb,   0x6f,
-    0x36,   0xf1,   0xc6,   0x6d,   0xb6,   0xb1,   0xe,    0x31,
-    0x86,   0xd,    0x10,   0x0,    0x61,   0xb6,   0xc3,   0xc,
-    0x30,   0xd0,   0x6d,   0xb6,   0xc6,   0x18,   0x66,   0xce,
-    0x30,   0x23,   0xf3,   0x8e,   0x39,   0xb6,   0xdb,   0x6d,
-    0xb0,   0xcc,   0x73,   0x6f,   0x36,   0xa4,   0xa5,   0x61,
-    0x3,    0x0,    0xfe,   0x14,   0x40,   0x30,   0x62,   0x0,
-    0x0,    0x43,   0x26,   0x30,   0x37,   0xc3,   0x6c,   0xc6,
-    0xc3,   0x61,   0xf3,   0x17,   0x7d,   0xb6,   0x1b,   0x61,
-    0x86,   0x5b,   0x30,   0x6f,   0x30,   0xc6,   0xdb,   0x6c,
-    0x36,   0xe0,   0x66,   0x6d,   0xb7,   0xf3,   0x84,   0x61,
-    0x83,   0xc,    0x0,    0x0,    0x65,   0xb7,   0xcf,   0x3c,
-    0xf3,   0xd0,   0x7d,   0xf7,   0xc6,   0x18,   0x66,   0xdb,
-    0x38,   0xfb,   0x66,   0xdb,   0x6d,   0xb6,   0xdb,   0x6d,
-    0xb3,   0xcc,   0xdb,   0x6d,   0xbe,   0x73,   0x38,   0xc6,
-    0x0,    0x0,    0x6c,   0xf8,   0x98,   0x18,   0xc2,   0x18,
-    0x6,    0x83,   0x66,   0x60,   0x30,   0x83,   0x6d,   0x86,
-    0xc3,   0x6c,   0x0,    0x10,   0x6d,   0xb6,   0x1b,   0x61,
-    0x86,   0x5b,   0x30,   0x6d,   0xb0,   0xc6,   0xdb,   0x6c,
-    0x3c,   0xf0,   0x66,   0x6c,   0xe7,   0x76,   0xc4,   0x61,
-    0x81,   0x8c,   0x0,    0x0,    0x39,   0xb6,   0x1b,   0x6d,
-    0xb6,   0xce,   0x61,   0x86,   0x6,    0x18,   0x67,   0xdf,
-    0x31,   0xa3,   0x66,   0xdb,   0x6d,   0xb6,   0xcf,   0x39,
-    0xb6,   0xcc,   0xdb,   0x6d,   0xb6,   0x0,    0x20,   0x3c,
-    0x3,    0x0,    0x0,    0x11,   0x18,   0xd,    0x80,   0x18,
-    0x6,    0x1,    0xcf,   0x7d,   0xe0,   0x9e,   0x39,   0x83,
-    0x8e,   0xc,    0x3,    0xe,    0x6d,   0xe3,   0xde,   0x7d,
-    0x83,   0xdb,   0x7b,   0xcc,   0xbe,   0xc6,   0xc9,   0xcc,
-    0x1a,   0xdb,   0xc6,   0x3c,   0x46,   0x34,   0x44,   0x7d,
-    0xe0,   0xbc,   0x0,    0x0,    0x4,    0xf3,   0xcf,   0x3c,
-    0xf3,   0xc1,   0x3c,   0xf3,   0xcf,   0x3c,   0xf6,   0xdb,
-    0x7c,   0xfb,   0x73,   0x8e,   0x38,   0xf3,   0xc3,   0x10,
-    0xe3,   0xde,   0x71,   0xed,   0xb2,   0xf7,   0xa0,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x30,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x7,    0xe0,   0x78,   0x0,    0x0,    0x0,
-    0x0,    0xe,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xe,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x3,    0x36,   0x6c,   0x10,   0x1,    0x8d,   0x80,   0x0,
+	0x0,    0x1,    0xc6,   0x79,   0xe0,   0x9f,   0x1d,   0xf3,
+	0x8e,   0x0,    0x3,    0x8e,   0x11,   0xe3,   0xde,   0x7d,
+	0xf3,   0xdb,   0x78,   0xec,   0xb0,   0xc6,   0x99,   0xcf,
+	0x1c,   0xf1,   0xef,   0x6d,   0xb6,   0x34,   0x51,   0x7d,
+	0xe0,   0x3c,   0x40,   0x6,    0x38,   0x0,    0xce,   0x45,
+	0x81,   0x0,    0x39,   0x16,   0x11,   0x39,   0x86,   0xc4,
+	0xc,    0x0,    0xf0,   0x0,    0x0,    0xe0,   0x11,   0x45,
+	0x10,   0xc6,   0x0,    0x0,    0x3e,   0x0,    0x19,   0x98,
+	0x7,    0xb6,   0xfe,   0x7d,   0x89,   0x98,   0xc2,   0x0,
+	0x0,    0xb,    0x6e,   0xc,    0x31,   0x98,   0x30,   0x36,
+	0xdb,   0x60,   0x6,    0xd3,   0x39,   0xb6,   0x1b,   0x61,
+	0x86,   0x1b,   0x30,   0x6d,   0xb0,   0xee,   0xdb,   0x6d,
+	0xb6,   0xdb,   0x6,    0x6d,   0xb6,   0x36,   0xd1,   0xd,
+	0x88,   0xc,    0xe0,   0x6,    0x65,   0x10,   0x11,   0x0,
+	0x1,    0x0,    0x44,   0x0,    0x0,    0x44,   0x1,    0x4,
+	0x0,    0x1,    0xe3,   0x91,   0x61,   0x16,   0x0,    0x10,
+	0x0,    0x0,    0x18,   0x6f,   0x0,    0x67,   0x24,   0xc,
+	0x7,    0xb6,   0x6c,   0xd1,   0x93,   0x30,   0x62,   0x0,
+	0x0,    0x12,   0x66,   0xc,    0x33,   0x98,   0x60,   0x36,
+	0xdb,   0x6d,   0xf0,   0xd7,   0x6d,   0xb6,   0x1b,   0x61,
+	0x86,   0x1b,   0x30,   0x6f,   0x30,   0xfe,   0xfb,   0x6d,
+	0xb6,   0xdb,   0x6,    0x6d,   0xb6,   0x33,   0x9b,   0x19,
+	0x8c,   0xd,    0xb0,   0x3,    0x60,   0x3,    0x8e,   0x38,
+	0xe3,   0x8e,   0x38,   0xe3,   0x8e,   0x38,   0xe3,   0x80,
+	0x7c,   0xfb,   0x64,   0x40,   0x0,    0x0,    0x1b,   0x39,
+	0xb3,   0x9c,   0x0,    0x0,    0x26,   0xa4,   0xb9,   0xc,
+	0x3,    0x0,    0x6c,   0x78,   0x20,   0x30,   0x6f,   0x83,
+	0xe0,   0x22,   0xa6,   0x18,   0xe6,   0x9e,   0x78,   0x63,
+	0x8f,   0xc,    0x1,    0x97,   0x6d,   0xe6,   0x1b,   0x79,
+	0xe6,   0xdf,   0x30,   0x6e,   0x30,   0xd6,   0xfb,   0x6f,
+	0x36,   0xf1,   0xc6,   0x6d,   0xb6,   0xb1,   0xe,    0x31,
+	0x86,   0xd,    0x10,   0x0,    0x61,   0xb6,   0xc3,   0xc,
+	0x30,   0xd0,   0x6d,   0xb6,   0xc6,   0x18,   0x66,   0xce,
+	0x30,   0x23,   0xf3,   0x8e,   0x39,   0xb6,   0xdb,   0x6d,
+	0xb0,   0xcc,   0x73,   0x6f,   0x36,   0xa4,   0xa5,   0x61,
+	0x3,    0x0,    0xfe,   0x14,   0x40,   0x30,   0x62,   0x0,
+	0x0,    0x43,   0x26,   0x30,   0x37,   0xc3,   0x6c,   0xc6,
+	0xc3,   0x61,   0xf3,   0x17,   0x7d,   0xb6,   0x1b,   0x61,
+	0x86,   0x5b,   0x30,   0x6f,   0x30,   0xc6,   0xdb,   0x6c,
+	0x36,   0xe0,   0x66,   0x6d,   0xb7,   0xf3,   0x84,   0x61,
+	0x83,   0xc,    0x0,    0x0,    0x65,   0xb7,   0xcf,   0x3c,
+	0xf3,   0xd0,   0x7d,   0xf7,   0xc6,   0x18,   0x66,   0xdb,
+	0x38,   0xfb,   0x66,   0xdb,   0x6d,   0xb6,   0xdb,   0x6d,
+	0xb3,   0xcc,   0xdb,   0x6d,   0xbe,   0x73,   0x38,   0xc6,
+	0x0,    0x0,    0x6c,   0xf8,   0x98,   0x18,   0xc2,   0x18,
+	0x6,    0x83,   0x66,   0x60,   0x30,   0x83,   0x6d,   0x86,
+	0xc3,   0x6c,   0x0,    0x10,   0x6d,   0xb6,   0x1b,   0x61,
+	0x86,   0x5b,   0x30,   0x6d,   0xb0,   0xc6,   0xdb,   0x6c,
+	0x3c,   0xf0,   0x66,   0x6c,   0xe7,   0x76,   0xc4,   0x61,
+	0x81,   0x8c,   0x0,    0x0,    0x39,   0xb6,   0x1b,   0x6d,
+	0xb6,   0xce,   0x61,   0x86,   0x6,    0x18,   0x67,   0xdf,
+	0x31,   0xa3,   0x66,   0xdb,   0x6d,   0xb6,   0xcf,   0x39,
+	0xb6,   0xcc,   0xdb,   0x6d,   0xb6,   0x0,    0x20,   0x3c,
+	0x3,    0x0,    0x0,    0x11,   0x18,   0xd,    0x80,   0x18,
+	0x6,    0x1,    0xcf,   0x7d,   0xe0,   0x9e,   0x39,   0x83,
+	0x8e,   0xc,    0x3,    0xe,    0x6d,   0xe3,   0xde,   0x7d,
+	0x83,   0xdb,   0x7b,   0xcc,   0xbe,   0xc6,   0xc9,   0xcc,
+	0x1a,   0xdb,   0xc6,   0x3c,   0x46,   0x34,   0x44,   0x7d,
+	0xe0,   0xbc,   0x0,    0x0,    0x4,    0xf3,   0xcf,   0x3c,
+	0xf3,   0xc1,   0x3c,   0xf3,   0xcf,   0x3c,   0xf6,   0xdb,
+	0x7c,   0xfb,   0x73,   0x8e,   0x38,   0xf3,   0xc3,   0x10,
+	0xe3,   0xde,   0x71,   0xed,   0xb2,   0xf7,   0xa0,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x30,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x7,    0xe0,   0x78,   0x0,    0x0,    0x0,
+	0x0,    0xe,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xe,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
 };
 
 const uint16 SML3X5_OFFSETS[] = {
-    0x0,     0x2,     0x4,     0x8,     0x8,     0x8,     0xC,     0xC,
-    0xF,     0x12,    0x15,    0x15,    0x19,    0x1C,    0x20,    0x22,
-    0x26,    0x2A,    0x2E,    0x32,    0x36,    0x3A,    0x3E,    0x42,
-    0x46,    0x4A,    0x4E,    0x50,    0x53,    0x57,    0x5B,    0x5F,
-    0x64,    0x64,    0x68,    0x6C,    0x70,    0x74,    0x78,    0x7C,
-    0x81,    0x85,    0x89,    0x8E,    0x92,    0x96,    0x9C,    0xA0,
-    0xA4,    0xA8,    0xAD,    0xB1,    0xB5,    0xB9,    0xBD,    0xC1,
-    0xC7,    0xCB,    0xCF,    0xD3,    0xD7,    0xDB,    0xDF,    0xE3,
-    0xE7,    0xEA,
+	0x0,     0x2,     0x4,     0x8,     0x8,     0x8,     0xC,     0xC,
+	0xF,     0x12,    0x15,    0x15,    0x19,    0x1C,    0x20,    0x22,
+	0x26,    0x2A,    0x2E,    0x32,    0x36,    0x3A,    0x3E,    0x42,
+	0x46,    0x4A,    0x4E,    0x50,    0x53,    0x57,    0x5B,    0x5F,
+	0x64,    0x64,    0x68,    0x6C,    0x70,    0x74,    0x78,    0x7C,
+	0x81,    0x85,    0x89,    0x8E,    0x92,    0x96,    0x9C,    0xA0,
+	0xA4,    0xA8,    0xAD,    0xB1,    0xB5,    0xB9,    0xBD,    0xC1,
+	0xC7,    0xCB,    0xCF,    0xD3,    0xD7,    0xDB,    0xDF,    0xE3,
+	0xE7,    0xEA,
 };
 const byte   SML3X5_DATA[] = {
-    0x2a,   0xa4,   0xa0,   0x0,    0x1,    0x13,   0x32,   0xbb,
-    0xbb,   0xb8,   0x4,    0x10,   0xc4,   0xc6,   0xce,   0xe7,
-    0x57,   0x3a,   0xa2,   0x2c,   0x4e,   0x66,   0x37,   0x55,
-    0x45,   0x55,   0xdd,   0x1c,   0x81,   0x3,    0x2a,   0x29,
-    0x12,   0x0,    0xa,    0xb0,   0x8a,   0xa2,   0xa,    0xaa,
-    0x49,   0xc9,   0x2a,   0xa8,   0xa8,   0x88,   0x52,   0x12,
-    0xa3,   0x6a,   0xaa,   0x95,   0x42,   0x55,   0x45,   0x54,
-    0x50,   0x85,   0x40,   0x94,   0x20,   0x41,   0x17,   0xe,
-    0x12,   0x91,   0x13,   0xbb,   0x93,   0xb8,   0x10,   0x4,
-    0x4e,   0xc8,   0xae,   0xeb,   0x72,   0x13,   0x22,   0xaa,
-    0xae,   0x96,   0x22,   0x55,   0x54,   0x88,   0x90,   0x84,
-    0x0,    0x6,    0x0,    0x81,   0x12,   0x0,    0x12,   0x92,
-    0x8,    0x8a,   0xa2,   0x8a,   0x49,   0xc8,   0xa,    0xa8,
-    0xa8,   0x89,   0x52,   0x12,   0xa2,   0x2a,   0xa8,   0xa5,
-    0x12,   0x55,   0x55,   0x49,   0x10,   0x84,   0x0,    0x6,
-    0x20,   0xa0,   0xa0,   0x20,   0x11,   0x3b,   0xb0,   0xbb,
-    0xa3,   0x88,   0x84,   0x10,   0x4a,   0xc6,   0xce,   0x86,
-    0x57,   0x72,   0xba,   0x2a,   0x48,   0x55,   0x62,   0x72,
-    0x29,   0x49,   0xdc,   0x5c,   0x0,    0x6,    0x0,    0x0,
-    0x0,    0x40,   0xa0,   0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x1c,   0x6,
+	0x2a,   0xa4,   0xa0,   0x0,    0x1,    0x13,   0x32,   0xbb,
+	0xbb,   0xb8,   0x4,    0x10,   0xc4,   0xc6,   0xce,   0xe7,
+	0x57,   0x3a,   0xa2,   0x2c,   0x4e,   0x66,   0x37,   0x55,
+	0x45,   0x55,   0xdd,   0x1c,   0x81,   0x3,    0x2a,   0x29,
+	0x12,   0x0,    0xa,    0xb0,   0x8a,   0xa2,   0xa,    0xaa,
+	0x49,   0xc9,   0x2a,   0xa8,   0xa8,   0x88,   0x52,   0x12,
+	0xa3,   0x6a,   0xaa,   0x95,   0x42,   0x55,   0x45,   0x54,
+	0x50,   0x85,   0x40,   0x94,   0x20,   0x41,   0x17,   0xe,
+	0x12,   0x91,   0x13,   0xbb,   0x93,   0xb8,   0x10,   0x4,
+	0x4e,   0xc8,   0xae,   0xeb,   0x72,   0x13,   0x22,   0xaa,
+	0xae,   0x96,   0x22,   0x55,   0x54,   0x88,   0x90,   0x84,
+	0x0,    0x6,    0x0,    0x81,   0x12,   0x0,    0x12,   0x92,
+	0x8,    0x8a,   0xa2,   0x8a,   0x49,   0xc8,   0xa,    0xa8,
+	0xa8,   0x89,   0x52,   0x12,   0xa2,   0x2a,   0xa8,   0xa5,
+	0x12,   0x55,   0x55,   0x49,   0x10,   0x84,   0x0,    0x6,
+	0x20,   0xa0,   0xa0,   0x20,   0x11,   0x3b,   0xb0,   0xbb,
+	0xa3,   0x88,   0x84,   0x10,   0x4a,   0xc6,   0xce,   0x86,
+	0x57,   0x72,   0xba,   0x2a,   0x48,   0x55,   0x62,   0x72,
+	0x29,   0x49,   0xdc,   0x5c,   0x0,    0x6,    0x0,    0x0,
+	0x0,    0x40,   0xa0,   0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x1c,   0x6,
 };
 
 const uint16 NAPLES12_OFFSETS[] = {
-    0x0,     0x6,     0xB,     0x14,    0x1D,    0x25,    0x31,    0x3B,
-    0x40,    0x46,    0x4C,    0x56,    0x5F,    0x64,    0x6D,    0x74,
-    0x7E,    0x86,    0x8E,    0x96,    0x9E,    0xA7,    0xAF,    0xB7,
-    0xBF,    0xC7,    0xCF,    0xD4,    0xD9,    0xE0,    0xE8,    0xEF,
-    0xF8,    0x103,   0x110,   0x11A,   0x122,   0x12D,   0x137,   0x140,
-    0x14A,   0x156,   0x15E,   0x165,   0x171,   0x17A,   0x188,   0x194,
-    0x19D,   0x1A7,   0x1B0,   0x1BC,   0x1C4,   0x1CD,   0x1D8,   0x1E2,
-    0x1EF,   0x1FC,   0x205,   0x20E,   0x214,   0x21C,   0x222,   0x22A,
-    0x233,   0x233,   0x23C,   0x244,   0x24B,   0x255,   0x25C,   0x263,
-    0x26B,   0x274,   0x27A,   0x280,   0x289,   0x28E,   0x29D,   0x2A7,
-    0x2AF,   0x2B8,   0x2C0,   0x2C7,   0x2CE,   0x2D4,   0x2DE,   0x2E7,
-    0x2F5,   0x2FF,   0x308,   0x310,   0x317,   0x31C,   0x323,   0x32C,
+	0x0,     0x6,     0xB,     0x14,    0x1D,    0x25,    0x31,    0x3B,
+	0x40,    0x46,    0x4C,    0x56,    0x5F,    0x64,    0x6D,    0x74,
+	0x7E,    0x86,    0x8E,    0x96,    0x9E,    0xA7,    0xAF,    0xB7,
+	0xBF,    0xC7,    0xCF,    0xD4,    0xD9,    0xE0,    0xE8,    0xEF,
+	0xF8,    0x103,   0x110,   0x11A,   0x122,   0x12D,   0x137,   0x140,
+	0x14A,   0x156,   0x15E,   0x165,   0x171,   0x17A,   0x188,   0x194,
+	0x19D,   0x1A7,   0x1B0,   0x1BC,   0x1C4,   0x1CD,   0x1D8,   0x1E2,
+	0x1EF,   0x1FC,   0x205,   0x20E,   0x214,   0x21C,   0x222,   0x22A,
+	0x233,   0x233,   0x23C,   0x244,   0x24B,   0x255,   0x25C,   0x263,
+	0x26B,   0x274,   0x27A,   0x280,   0x289,   0x28E,   0x29D,   0x2A7,
+	0x2AF,   0x2B8,   0x2C0,   0x2C7,   0x2CE,   0x2D4,   0x2DE,   0x2E7,
+	0x2F5,   0x2FF,   0x308,   0x310,   0x317,   0x31C,   0x323,   0x32C,
 };
 const byte   NAPLES12_DATA[] = {
-    0x0,    0x0,    0x0,    0x0,    0x80,   0x0,    0x0,    0x0,
-    0x33,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x38,   0x10,   0x0,    0x4,    0x0,    0x80,   0x20,
-    0x0,    0x0,    0x38,   0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x10,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x7,
-    0x80,   0x0,    0x70,   0x1,    0xe0,   0xf,    0x0,    0x0,
-    0x78,   0x38,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x3,    0x1b,
-    0x1,    0x23,   0xe3,   0x3,    0x38,   0x18,   0x61,   0x80,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x1,    0xe0,   0xc1,
-    0xf1,   0xe0,   0x19,   0xf8,   0x71,   0xfc,   0xf0,   0xf0,
-    0x0,    0x0,    0x0,    0x0,    0xf0,   0x3f,   0x0,    0x4c,
-    0x7e,   0x1f,   0x1f,   0xc3,   0xfc,   0xff,   0x3f,   0x1c,
-    0x61,   0xe1,   0xe3,   0x86,   0x1f,   0x1c,   0x1c,   0x70,
-    0x63,   0xc3,   0xf8,   0x78,   0x7f,   0x7,    0xe7,   0xfb,
-    0xc,    0x61,   0x18,   0x8,    0xc0,   0x66,   0x33,   0xfb,
-    0xc8,   0xf,    0x0,    0x0,    0x0,    0xc,    0x0,    0x0,
-    0xc0,   0x3,    0x0,    0x18,   0x2,    0x4,    0xc0,   0x60,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x39,   0xe,    0x0,    0x2,    0x3,    0x1b,   0x1,    0x26,
-    0xb4,   0x86,   0x64,   0x18,   0xc0,   0xc1,   0x0,    0x0,
-    0x0,    0x0,    0x0,    0xf,    0x33,   0xc3,   0x1b,   0x30,
-    0x39,   0x98,   0xc1,   0x8d,   0x99,   0x98,   0x0,    0x0,
-    0x0,    0x1,    0x98,   0x40,   0x80,   0xc,    0xb3,   0x30,
-    0xac,   0x65,   0x85,   0x61,   0x61,   0x2c,   0x62,   0x62,
-    0x65,   0x8c,   0x30,   0x2c,   0x18,   0xb0,   0xc4,   0x65,
-    0x8c,   0xcc,   0xb1,   0x8c,   0x28,   0xc7,   0xc,    0xe3,
-    0xb8,   0x1d,   0x60,   0xce,   0x34,   0x1b,   0xc,    0x3,
-    0x4,    0x0,    0x0,    0xc,    0x0,    0x0,    0xc0,   0x3,
-    0x0,    0x18,   0x4,    0x8,    0xc0,   0x60,   0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x80,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x61,   0x3,
-    0x0,    0x0,    0x3,    0x1b,   0x7,    0xf6,   0xb4,   0x8c,
-    0x64,   0x18,   0xc0,   0xc5,   0x40,   0x40,   0x0,    0x0,
-    0x0,    0x1b,   0x30,   0xc3,   0x1b,   0x30,   0x79,   0x81,
-    0x80,   0x19,   0x99,   0x98,   0x0,    0xc,    0x0,    0xc1,
-    0x98,   0x8e,   0x40,   0x1c,   0xb3,   0x30,   0xac,   0x35,
-    0x81,   0x60,   0xc2,   0x2c,   0x62,   0x62,   0x65,   0x98,
-    0x30,   0x2e,   0x38,   0xb8,   0xcc,   0x35,   0x8d,   0x86,
-    0xb1,   0x8e,   0x48,   0xc3,   0xc,    0x61,   0x98,   0xd,
-    0x31,   0x86,   0x34,   0x33,   0x4,    0x3,    0xe,    0x0,
-    0x0,    0xc,    0x0,    0x0,    0xc0,   0x3,    0x0,    0x18,
-    0x0,    0x0,    0xc0,   0x60,   0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x1,    0x80,   0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x61,   0x3,    0xc,    0x0,
-    0x3,    0x0,    0x2,    0x46,   0x83,   0x18,   0x64,   0x0,
-    0xc0,   0xc3,   0x80,   0x40,   0x0,    0x0,    0x0,    0x33,
-    0x30,   0xc0,   0x18,   0x30,   0xd9,   0x81,   0x80,   0x19,
-    0x99,   0x98,   0x0,    0x18,   0x0,    0x60,   0x18,   0x92,
-    0x40,   0x3c,   0x33,   0x31,   0xc,    0x31,   0x80,   0x60,
-    0xc0,   0xc,    0x60,   0x60,   0x61,   0xb0,   0x30,   0xe,
-    0x38,   0x38,   0xcc,   0x31,   0x8d,   0x86,   0x31,   0x87,
-    0x0,    0xc3,   0xc,    0x61,   0x98,   0xc,    0x1b,   0x6,
-    0x30,   0x63,   0x6,    0x3,    0x1b,   0x0,    0xf,    0xcd,
-    0xc7,   0xcf,   0xc3,   0xe7,   0xcf,   0xd9,   0xc6,   0xc,
-    0xd8,   0x61,   0x9c,   0xe3,   0x38,   0xf8,   0xdc,   0x7e,
-    0x6c,   0xf3,   0xf6,   0x31,   0x8c,   0xc6,   0x33,   0x8,
-    0xc6,   0x7e,   0x61,   0x3,    0x12,   0x49,   0x3,    0x0,
-    0x2,    0x43,   0xe0,   0x30,   0x38,   0x0,    0xc0,   0xce,
-    0xe3,   0xf8,   0xf,    0xe0,   0x0,    0x63,   0x30,   0xc0,
-    0x30,   0xe1,   0x99,   0xf1,   0xf0,   0x30,   0xf1,   0x99,
-    0x8c,   0x30,   0xfc,   0x30,   0x30,   0x92,   0x40,   0x6c,
-    0x3e,   0x30,   0xc,    0x31,   0xf0,   0x7c,   0xcf,   0x1f,
-    0xe0,   0x60,   0x61,   0xe0,   0x30,   0xe,    0x38,   0x34,
-    0xcc,   0x31,   0x8d,   0x86,   0x31,   0x83,   0x80,   0xc3,
-    0xc,    0x61,   0x98,   0xc,    0xe,    0x6,    0x30,   0xc3,
-    0x2,    0x3,    0x31,   0x80,   0x18,   0xce,   0x6c,   0x58,
-    0xc6,   0x23,   0x18,   0xda,   0xce,   0x1c,   0xe4,   0x63,
-    0xad,   0x67,   0x59,   0x8d,   0xe6,   0xc6,   0xfd,   0x99,
-    0x8e,   0x33,   0x8d,   0xc6,   0x35,   0x91,   0xc6,   0x86,
-    0x61,   0x3,    0x1,    0x8c,   0x3,    0x0,    0xf,    0xe0,
-    0xb0,   0x60,   0x38,   0x40,   0xc0,   0xc3,   0x80,   0x40,
-    0x0,    0x0,    0x0,    0xc3,   0x30,   0xc0,   0x60,   0x33,
-    0x18,   0x19,   0x98,   0x31,   0x98,   0xf9,   0x8c,   0x60,
-    0x0,    0x18,   0x60,   0x92,   0x40,   0xcc,   0x31,   0xb0,
-    0xc,    0x31,   0x80,   0x60,   0xc3,   0x2c,   0x60,   0x60,
-    0x61,   0xc0,   0x30,   0xd,    0x58,   0x32,   0xcc,   0x31,
-    0xf1,   0x86,   0x3f,   0x1,    0xc0,   0xc3,   0xc,    0x63,
-    0x18,   0xc,    0xe,    0x6,    0x31,   0x83,   0x3,    0x3,
-    0x0,    0x0,    0x18,   0xcc,   0x6c,   0x18,   0xc6,   0x43,
-    0x18,   0xdc,   0xc6,   0x2c,   0xc4,   0x61,   0xce,   0x63,
-    0x99,   0x8c,   0xc6,   0xc6,   0x61,   0x81,   0x86,   0x31,
-    0x8c,   0xc6,   0x30,   0xe0,   0xc6,   0xc,    0xc1,   0x1,
-    0x80,   0x3,    0x3,    0x0,    0x4,    0x86,   0xb0,   0xc6,
-    0x64,   0x80,   0xc0,   0xc5,   0x40,   0x40,   0x0,    0x0,
-    0x1,    0x83,   0x30,   0xc0,   0xc0,   0x33,   0xfc,   0x19,
-    0x98,   0x61,   0x98,   0x18,   0x0,    0x30,   0xfc,   0x30,
-    0x60,   0x8f,   0x8f,   0xfc,   0x31,   0xb0,   0xc,    0x31,
-    0x80,   0x60,   0xc3,   0xc,    0x60,   0x60,   0x61,   0xe0,
-    0x30,   0xd,    0x58,   0x31,   0xcc,   0x31,   0x81,   0x86,
-    0x36,   0x0,    0xe0,   0xc3,   0x1c,   0x66,   0x19,   0x98,
-    0x1b,   0x6,    0x73,   0x3,    0x1,    0x3,    0x0,    0x0,
-    0x18,   0xcc,   0x6c,   0x18,   0xc6,   0x83,   0x18,   0xd8,
-    0xc6,   0xc,    0xf8,   0x61,   0x8c,   0x63,   0x19,   0x8c,
-    0xc6,   0xc6,   0x60,   0xf1,   0x86,   0x31,   0x8c,   0xce,
-    0x30,   0x60,   0xc6,   0x18,   0xc1,   0x1,    0x80,   0xd,
-    0x3,    0x0,    0x4,    0x86,   0xb1,   0x89,   0x63,   0x0,
-    0xc0,   0xc1,   0x0,    0x0,    0x0,    0x0,    0x3,    0x3,
-    0x30,   0xc1,   0x83,   0x30,   0x19,   0x99,   0x98,   0x61,
-    0x98,   0x18,   0x0,    0x18,   0x0,    0x60,   0x0,    0x40,
-    0x13,   0xc,    0x31,   0xb0,   0x8c,   0x31,   0x82,   0x60,
-    0xc7,   0x4c,   0x64,   0x64,   0x61,   0xb0,   0xb0,   0x4c,
-    0x99,   0x31,   0xcc,   0x21,   0x81,   0x86,   0x33,   0x18,
-    0x60,   0xc3,   0x2d,   0x6c,   0x1b,   0xb0,   0x31,   0x96,
-    0xb6,   0x7,    0x1,    0x83,   0x0,    0x0,    0x19,   0xdc,
-    0x6c,   0x59,   0xcf,   0x13,   0x19,   0xd8,   0xd6,   0x4c,
-    0xd8,   0xe5,   0x8c,   0x6b,   0x1b,   0x8c,   0xc6,   0xce,
-    0x60,   0x19,   0x96,   0x75,   0x98,   0xd6,   0x60,   0xb0,
-    0xce,   0x30,   0x61,   0x3,    0x0,    0x7,    0x0,    0x0,
-    0x0,    0x3,    0xe3,   0x9,    0x63,   0x0,    0xc0,   0xc0,
-    0x0,    0x1,    0x80,   0x6,    0x6,    0x3,    0x30,   0xc3,
-    0x1b,   0x30,   0x19,   0x99,   0x98,   0xc1,   0x98,   0x31,
-    0x8c,   0xc,    0x0,    0xc0,   0x60,   0x3e,   0x6,    0xc,
-    0x31,   0xb1,   0xc,    0x21,   0x84,   0x60,   0xcb,   0x8c,
-    0x68,   0x68,   0x61,   0x99,   0x30,   0x8c,   0x9a,   0x30,
-    0xc4,   0x41,   0x80,   0xdc,   0x31,   0xac,   0x60,   0xc3,
-    0x4e,   0x78,   0x1c,   0xe0,   0x60,   0xd3,   0x36,   0xb,
-    0x0,    0x83,   0x0,    0x0,    0x1a,   0xec,   0xcc,   0x9a,
-    0xd6,   0x23,   0x1a,   0xd8,   0xe6,   0x8c,   0xcd,   0x69,
-    0x8c,   0x73,   0x1d,   0x98,   0xcc,   0xd6,   0x61,   0x19,
-    0xa6,   0xb9,   0xb0,   0xe6,   0xc1,   0x1a,   0xd6,   0x61,
-    0x61,   0x3,    0x0,    0x8,    0x3,    0x0,    0x0,    0x0,
-    0x86,   0x6,    0x3c,   0xc0,   0x61,   0x80,   0x0,    0x1,
-    0x80,   0x6,    0xc,    0x1,    0xe3,   0xf3,   0xf9,   0xe0,
-    0x18,   0xf0,   0xf0,   0xc0,   0xf0,   0xe1,   0x8c,   0x0,
-    0x0,    0x0,    0x60,   0x0,    0x1c,   0x7,    0xff,   0x1e,
-    0x3f,   0xc7,   0xf9,   0xc0,   0x73,   0x38,   0x70,   0x70,
-    0x67,   0xe,    0x7f,   0x38,   0x1c,   0xe0,   0xc3,   0x83,
-    0xe0,   0x78,   0xe0,   0xcf,   0xc3,   0x81,   0x8c,   0x70,
-    0x18,   0xc0,   0xc0,   0x60,   0x37,   0xf3,   0x0,    0xc3,
-    0x0,    0x3f,   0xcc,   0xcf,   0x87,   0xc,    0xe3,   0xc3,
-    0xc,    0xd8,   0xc7,   0xc,    0xc6,   0x71,   0x8c,   0x63,
-    0x18,   0xf0,   0xf8,   0x66,   0x61,   0xf1,   0xc3,   0x30,
-    0xe0,   0xc3,   0x82,   0xc,    0x66,   0xfe,   0x61,   0x3,
-    0x0,    0xc,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x33,   0x0,    0x0,    0x0,    0x80,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x4,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x60,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xd,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x30,   0x3,    0x0,    0x43,   0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x3,    0x0,    0xc0,
-    0x0,    0xc,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0xc0,   0x6,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x6,    0x0,    0x61,   0x3,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x1,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x60,   0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x6,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x30,   0x3,    0xc0,   0xf,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x3,    0x0,    0xc0,   0x0,    0xc,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xc0,   0x6,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x6,    0x0,    0x39,   0xe,    0x0,    0x1,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x60,   0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x30,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x3,    0x0,    0xc0,   0x0,    0xc,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0xc0,   0x7,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x6,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x3,
-    0xc0,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x7,    0xe0,   0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xe,
-    0x7,    0x80,   0x0,    0x38,   0x0,    0x0,    0x0,    0x0,
-    0x0,    0x1,    0x80,   0x6,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x7c,   0x0,    0x0,    0x0,
-    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x80,   0x0,    0x0,    0x0,
+	0x33,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x38,   0x10,   0x0,    0x4,    0x0,    0x80,   0x20,
+	0x0,    0x0,    0x38,   0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x10,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x7,
+	0x80,   0x0,    0x70,   0x1,    0xe0,   0xf,    0x0,    0x0,
+	0x78,   0x38,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x3,    0x1b,
+	0x1,    0x23,   0xe3,   0x3,    0x38,   0x18,   0x61,   0x80,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x1,    0xe0,   0xc1,
+	0xf1,   0xe0,   0x19,   0xf8,   0x71,   0xfc,   0xf0,   0xf0,
+	0x0,    0x0,    0x0,    0x0,    0xf0,   0x3f,   0x0,    0x4c,
+	0x7e,   0x1f,   0x1f,   0xc3,   0xfc,   0xff,   0x3f,   0x1c,
+	0x61,   0xe1,   0xe3,   0x86,   0x1f,   0x1c,   0x1c,   0x70,
+	0x63,   0xc3,   0xf8,   0x78,   0x7f,   0x7,    0xe7,   0xfb,
+	0xc,    0x61,   0x18,   0x8,    0xc0,   0x66,   0x33,   0xfb,
+	0xc8,   0xf,    0x0,    0x0,    0x0,    0xc,    0x0,    0x0,
+	0xc0,   0x3,    0x0,    0x18,   0x2,    0x4,    0xc0,   0x60,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x39,   0xe,    0x0,    0x2,    0x3,    0x1b,   0x1,    0x26,
+	0xb4,   0x86,   0x64,   0x18,   0xc0,   0xc1,   0x0,    0x0,
+	0x0,    0x0,    0x0,    0xf,    0x33,   0xc3,   0x1b,   0x30,
+	0x39,   0x98,   0xc1,   0x8d,   0x99,   0x98,   0x0,    0x0,
+	0x0,    0x1,    0x98,   0x40,   0x80,   0xc,    0xb3,   0x30,
+	0xac,   0x65,   0x85,   0x61,   0x61,   0x2c,   0x62,   0x62,
+	0x65,   0x8c,   0x30,   0x2c,   0x18,   0xb0,   0xc4,   0x65,
+	0x8c,   0xcc,   0xb1,   0x8c,   0x28,   0xc7,   0xc,    0xe3,
+	0xb8,   0x1d,   0x60,   0xce,   0x34,   0x1b,   0xc,    0x3,
+	0x4,    0x0,    0x0,    0xc,    0x0,    0x0,    0xc0,   0x3,
+	0x0,    0x18,   0x4,    0x8,    0xc0,   0x60,   0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x80,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x61,   0x3,
+	0x0,    0x0,    0x3,    0x1b,   0x7,    0xf6,   0xb4,   0x8c,
+	0x64,   0x18,   0xc0,   0xc5,   0x40,   0x40,   0x0,    0x0,
+	0x0,    0x1b,   0x30,   0xc3,   0x1b,   0x30,   0x79,   0x81,
+	0x80,   0x19,   0x99,   0x98,   0x0,    0xc,    0x0,    0xc1,
+	0x98,   0x8e,   0x40,   0x1c,   0xb3,   0x30,   0xac,   0x35,
+	0x81,   0x60,   0xc2,   0x2c,   0x62,   0x62,   0x65,   0x98,
+	0x30,   0x2e,   0x38,   0xb8,   0xcc,   0x35,   0x8d,   0x86,
+	0xb1,   0x8e,   0x48,   0xc3,   0xc,    0x61,   0x98,   0xd,
+	0x31,   0x86,   0x34,   0x33,   0x4,    0x3,    0xe,    0x0,
+	0x0,    0xc,    0x0,    0x0,    0xc0,   0x3,    0x0,    0x18,
+	0x0,    0x0,    0xc0,   0x60,   0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x1,    0x80,   0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x61,   0x3,    0xc,    0x0,
+	0x3,    0x0,    0x2,    0x46,   0x83,   0x18,   0x64,   0x0,
+	0xc0,   0xc3,   0x80,   0x40,   0x0,    0x0,    0x0,    0x33,
+	0x30,   0xc0,   0x18,   0x30,   0xd9,   0x81,   0x80,   0x19,
+	0x99,   0x98,   0x0,    0x18,   0x0,    0x60,   0x18,   0x92,
+	0x40,   0x3c,   0x33,   0x31,   0xc,    0x31,   0x80,   0x60,
+	0xc0,   0xc,    0x60,   0x60,   0x61,   0xb0,   0x30,   0xe,
+	0x38,   0x38,   0xcc,   0x31,   0x8d,   0x86,   0x31,   0x87,
+	0x0,    0xc3,   0xc,    0x61,   0x98,   0xc,    0x1b,   0x6,
+	0x30,   0x63,   0x6,    0x3,    0x1b,   0x0,    0xf,    0xcd,
+	0xc7,   0xcf,   0xc3,   0xe7,   0xcf,   0xd9,   0xc6,   0xc,
+	0xd8,   0x61,   0x9c,   0xe3,   0x38,   0xf8,   0xdc,   0x7e,
+	0x6c,   0xf3,   0xf6,   0x31,   0x8c,   0xc6,   0x33,   0x8,
+	0xc6,   0x7e,   0x61,   0x3,    0x12,   0x49,   0x3,    0x0,
+	0x2,    0x43,   0xe0,   0x30,   0x38,   0x0,    0xc0,   0xce,
+	0xe3,   0xf8,   0xf,    0xe0,   0x0,    0x63,   0x30,   0xc0,
+	0x30,   0xe1,   0x99,   0xf1,   0xf0,   0x30,   0xf1,   0x99,
+	0x8c,   0x30,   0xfc,   0x30,   0x30,   0x92,   0x40,   0x6c,
+	0x3e,   0x30,   0xc,    0x31,   0xf0,   0x7c,   0xcf,   0x1f,
+	0xe0,   0x60,   0x61,   0xe0,   0x30,   0xe,    0x38,   0x34,
+	0xcc,   0x31,   0x8d,   0x86,   0x31,   0x83,   0x80,   0xc3,
+	0xc,    0x61,   0x98,   0xc,    0xe,    0x6,    0x30,   0xc3,
+	0x2,    0x3,    0x31,   0x80,   0x18,   0xce,   0x6c,   0x58,
+	0xc6,   0x23,   0x18,   0xda,   0xce,   0x1c,   0xe4,   0x63,
+	0xad,   0x67,   0x59,   0x8d,   0xe6,   0xc6,   0xfd,   0x99,
+	0x8e,   0x33,   0x8d,   0xc6,   0x35,   0x91,   0xc6,   0x86,
+	0x61,   0x3,    0x1,    0x8c,   0x3,    0x0,    0xf,    0xe0,
+	0xb0,   0x60,   0x38,   0x40,   0xc0,   0xc3,   0x80,   0x40,
+	0x0,    0x0,    0x0,    0xc3,   0x30,   0xc0,   0x60,   0x33,
+	0x18,   0x19,   0x98,   0x31,   0x98,   0xf9,   0x8c,   0x60,
+	0x0,    0x18,   0x60,   0x92,   0x40,   0xcc,   0x31,   0xb0,
+	0xc,    0x31,   0x80,   0x60,   0xc3,   0x2c,   0x60,   0x60,
+	0x61,   0xc0,   0x30,   0xd,    0x58,   0x32,   0xcc,   0x31,
+	0xf1,   0x86,   0x3f,   0x1,    0xc0,   0xc3,   0xc,    0x63,
+	0x18,   0xc,    0xe,    0x6,    0x31,   0x83,   0x3,    0x3,
+	0x0,    0x0,    0x18,   0xcc,   0x6c,   0x18,   0xc6,   0x43,
+	0x18,   0xdc,   0xc6,   0x2c,   0xc4,   0x61,   0xce,   0x63,
+	0x99,   0x8c,   0xc6,   0xc6,   0x61,   0x81,   0x86,   0x31,
+	0x8c,   0xc6,   0x30,   0xe0,   0xc6,   0xc,    0xc1,   0x1,
+	0x80,   0x3,    0x3,    0x0,    0x4,    0x86,   0xb0,   0xc6,
+	0x64,   0x80,   0xc0,   0xc5,   0x40,   0x40,   0x0,    0x0,
+	0x1,    0x83,   0x30,   0xc0,   0xc0,   0x33,   0xfc,   0x19,
+	0x98,   0x61,   0x98,   0x18,   0x0,    0x30,   0xfc,   0x30,
+	0x60,   0x8f,   0x8f,   0xfc,   0x31,   0xb0,   0xc,    0x31,
+	0x80,   0x60,   0xc3,   0xc,    0x60,   0x60,   0x61,   0xe0,
+	0x30,   0xd,    0x58,   0x31,   0xcc,   0x31,   0x81,   0x86,
+	0x36,   0x0,    0xe0,   0xc3,   0x1c,   0x66,   0x19,   0x98,
+	0x1b,   0x6,    0x73,   0x3,    0x1,    0x3,    0x0,    0x0,
+	0x18,   0xcc,   0x6c,   0x18,   0xc6,   0x83,   0x18,   0xd8,
+	0xc6,   0xc,    0xf8,   0x61,   0x8c,   0x63,   0x19,   0x8c,
+	0xc6,   0xc6,   0x60,   0xf1,   0x86,   0x31,   0x8c,   0xce,
+	0x30,   0x60,   0xc6,   0x18,   0xc1,   0x1,    0x80,   0xd,
+	0x3,    0x0,    0x4,    0x86,   0xb1,   0x89,   0x63,   0x0,
+	0xc0,   0xc1,   0x0,    0x0,    0x0,    0x0,    0x3,    0x3,
+	0x30,   0xc1,   0x83,   0x30,   0x19,   0x99,   0x98,   0x61,
+	0x98,   0x18,   0x0,    0x18,   0x0,    0x60,   0x0,    0x40,
+	0x13,   0xc,    0x31,   0xb0,   0x8c,   0x31,   0x82,   0x60,
+	0xc7,   0x4c,   0x64,   0x64,   0x61,   0xb0,   0xb0,   0x4c,
+	0x99,   0x31,   0xcc,   0x21,   0x81,   0x86,   0x33,   0x18,
+	0x60,   0xc3,   0x2d,   0x6c,   0x1b,   0xb0,   0x31,   0x96,
+	0xb6,   0x7,    0x1,    0x83,   0x0,    0x0,    0x19,   0xdc,
+	0x6c,   0x59,   0xcf,   0x13,   0x19,   0xd8,   0xd6,   0x4c,
+	0xd8,   0xe5,   0x8c,   0x6b,   0x1b,   0x8c,   0xc6,   0xce,
+	0x60,   0x19,   0x96,   0x75,   0x98,   0xd6,   0x60,   0xb0,
+	0xce,   0x30,   0x61,   0x3,    0x0,    0x7,    0x0,    0x0,
+	0x0,    0x3,    0xe3,   0x9,    0x63,   0x0,    0xc0,   0xc0,
+	0x0,    0x1,    0x80,   0x6,    0x6,    0x3,    0x30,   0xc3,
+	0x1b,   0x30,   0x19,   0x99,   0x98,   0xc1,   0x98,   0x31,
+	0x8c,   0xc,    0x0,    0xc0,   0x60,   0x3e,   0x6,    0xc,
+	0x31,   0xb1,   0xc,    0x21,   0x84,   0x60,   0xcb,   0x8c,
+	0x68,   0x68,   0x61,   0x99,   0x30,   0x8c,   0x9a,   0x30,
+	0xc4,   0x41,   0x80,   0xdc,   0x31,   0xac,   0x60,   0xc3,
+	0x4e,   0x78,   0x1c,   0xe0,   0x60,   0xd3,   0x36,   0xb,
+	0x0,    0x83,   0x0,    0x0,    0x1a,   0xec,   0xcc,   0x9a,
+	0xd6,   0x23,   0x1a,   0xd8,   0xe6,   0x8c,   0xcd,   0x69,
+	0x8c,   0x73,   0x1d,   0x98,   0xcc,   0xd6,   0x61,   0x19,
+	0xa6,   0xb9,   0xb0,   0xe6,   0xc1,   0x1a,   0xd6,   0x61,
+	0x61,   0x3,    0x0,    0x8,    0x3,    0x0,    0x0,    0x0,
+	0x86,   0x6,    0x3c,   0xc0,   0x61,   0x80,   0x0,    0x1,
+	0x80,   0x6,    0xc,    0x1,    0xe3,   0xf3,   0xf9,   0xe0,
+	0x18,   0xf0,   0xf0,   0xc0,   0xf0,   0xe1,   0x8c,   0x0,
+	0x0,    0x0,    0x60,   0x0,    0x1c,   0x7,    0xff,   0x1e,
+	0x3f,   0xc7,   0xf9,   0xc0,   0x73,   0x38,   0x70,   0x70,
+	0x67,   0xe,    0x7f,   0x38,   0x1c,   0xe0,   0xc3,   0x83,
+	0xe0,   0x78,   0xe0,   0xcf,   0xc3,   0x81,   0x8c,   0x70,
+	0x18,   0xc0,   0xc0,   0x60,   0x37,   0xf3,   0x0,    0xc3,
+	0x0,    0x3f,   0xcc,   0xcf,   0x87,   0xc,    0xe3,   0xc3,
+	0xc,    0xd8,   0xc7,   0xc,    0xc6,   0x71,   0x8c,   0x63,
+	0x18,   0xf0,   0xf8,   0x66,   0x61,   0xf1,   0xc3,   0x30,
+	0xe0,   0xc3,   0x82,   0xc,    0x66,   0xfe,   0x61,   0x3,
+	0x0,    0xc,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x33,   0x0,    0x0,    0x0,    0x80,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x4,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x60,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xd,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x30,   0x3,    0x0,    0x43,   0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x3,    0x0,    0xc0,
+	0x0,    0xc,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0xc0,   0x6,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x6,    0x0,    0x61,   0x3,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x1,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x60,   0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x6,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x30,   0x3,    0xc0,   0xf,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x3,    0x0,    0xc0,   0x0,    0xc,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xc0,   0x6,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x6,    0x0,    0x39,   0xe,    0x0,    0x1,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x60,   0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x30,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x3,    0x0,    0xc0,   0x0,    0xc,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0xc0,   0x7,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x6,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x3,
+	0xc0,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x7,    0xe0,   0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xe,
+	0x7,    0x80,   0x0,    0x38,   0x0,    0x0,    0x0,    0x0,
+	0x0,    0x1,    0x80,   0x6,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x7c,   0x0,    0x0,    0x0,
+	0x0,    0x0,
 };
 
 const uint16 GOTHICEU_OFFSETS[] = {
-    0x0,     0x5,     0x8,     0xF,     0x16,    0x1D,    0x27,    0x2F,
-    0x33,    0x38,    0x3D,    0x46,    0x4F,    0x53,    0x5B,    0x5E,
-    0x66,    0x6E,    0x71,    0x78,    0x7F,    0x87,    0x8E,    0x95,
-    0x9C,    0xA3,    0xAA,    0xAD,    0xB1,    0xB9,    0xC1,    0xC9,
-    0xD0,    0xD9,    0xE0,    0xE7,    0xEE,    0xF5,    0xFB,    0x101,
-    0x108,   0x10F,   0x112,   0x118,   0x11F,   0x124,   0x12B,   0x132,
-    0x13A,   0x141,   0x149,   0x150,   0x156,   0x15D,   0x164,   0x16B,
-    0x176,   0x17D,   0x184,   0x18B,   0x190,   0x198,   0x19D,   0x1A6,
-    0x1AF,   0x1B4,   0x1BB,   0x1C2,   0x1C9,   0x1D0,   0x1D7,   0x1DC,
-    0x1E3,   0x1E9,   0x1EC,   0x1F0,   0x1F7,   0x1FA,   0x203,   0x209,
-    0x211,   0x218,   0x21F,   0x225,   0x22B,   0x230,   0x237,   0x23E,
-    0x247,   0x24E,   0x255,   0x25B,   0x261,   0x264,   0x26A,   0x272,
-    0x272,   0x279,   0x280,   0x287,   0x28E,   0x295,   0x29C,   0x2A3,
-    0x2AA,   0x2B1,   0x2B8,   0x2BF,   0x2C6,   0x2CD,   0x2D2,   0x2D9,
-    0x2E0,   0x2E7,   0x2EE,   0x2F6,   0x2FE,   0x306,   0x30E,   0x315,
-    0x31C,   0x323,   0x32A,   0x334,   0x334,   0x334,   0x33B,   0x343,
-    0x343,   0x34A,   0x34F,   0x357,   0x35E,   0x364,   0x36B,   0x372,
-    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
-    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
-    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
-    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
-    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
-    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
-    0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
-    0x379,   0x379,   0x37F,   0x385,   0x385,   0x385,   0x38E,   0x395,
-    0x395,   0x395,   0x395,   0x395,   0x39C,
+	0x0,     0x5,     0x8,     0xF,     0x16,    0x1D,    0x27,    0x2F,
+	0x33,    0x38,    0x3D,    0x46,    0x4F,    0x53,    0x5B,    0x5E,
+	0x66,    0x6E,    0x71,    0x78,    0x7F,    0x87,    0x8E,    0x95,
+	0x9C,    0xA3,    0xAA,    0xAD,    0xB1,    0xB9,    0xC1,    0xC9,
+	0xD0,    0xD9,    0xE0,    0xE7,    0xEE,    0xF5,    0xFB,    0x101,
+	0x108,   0x10F,   0x112,   0x118,   0x11F,   0x124,   0x12B,   0x132,
+	0x13A,   0x141,   0x149,   0x150,   0x156,   0x15D,   0x164,   0x16B,
+	0x176,   0x17D,   0x184,   0x18B,   0x190,   0x198,   0x19D,   0x1A6,
+	0x1AF,   0x1B4,   0x1BB,   0x1C2,   0x1C9,   0x1D0,   0x1D7,   0x1DC,
+	0x1E3,   0x1E9,   0x1EC,   0x1F0,   0x1F7,   0x1FA,   0x203,   0x209,
+	0x211,   0x218,   0x21F,   0x225,   0x22B,   0x230,   0x237,   0x23E,
+	0x247,   0x24E,   0x255,   0x25B,   0x261,   0x264,   0x26A,   0x272,
+	0x272,   0x279,   0x280,   0x287,   0x28E,   0x295,   0x29C,   0x2A3,
+	0x2AA,   0x2B1,   0x2B8,   0x2BF,   0x2C6,   0x2CD,   0x2D2,   0x2D9,
+	0x2E0,   0x2E7,   0x2EE,   0x2F6,   0x2FE,   0x306,   0x30E,   0x315,
+	0x31C,   0x323,   0x32A,   0x334,   0x334,   0x334,   0x33B,   0x343,
+	0x343,   0x34A,   0x34F,   0x357,   0x35E,   0x364,   0x36B,   0x372,
+	0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+	0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+	0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+	0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+	0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+	0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+	0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,   0x379,
+	0x379,   0x379,   0x37F,   0x385,   0x385,   0x385,   0x38E,   0x395,
+	0x395,   0x395,   0x395,   0x395,   0x39C,
 };
 const byte   GOTHICEU_DATA[] = {
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x4,    0x80,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x1c,   0x0,    0xe0,   0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x2,    0x48,   0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x22,   0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0xf,    0x80,   0x0,    0x0,
-    0x0,    0x0,    0x0,    0xf,    0x4,    0x0,    0xa0,   0x80,
-    0x10,   0x60,   0x8,    0x40,   0x0,    0x0,    0x0,    0x0,
-    0x10,   0xc2,   0x38,   0x70,   0x11,   0xf0,   0x47,   0xc7,
-    0x4,    0x0,    0x2,    0x0,    0x40,   0x10,   0x38,   0x10,
-    0xe0,   0x63,   0x87,   0x9e,   0x1c,   0x89,   0x4,    0x91,
-    0x8,    0x91,   0xc,    0x38,   0x18,   0x78,   0x63,   0xe4,
-    0x48,   0x91,   0x12,   0x24,   0x4f,   0x90,   0x80,   0x20,
-    0x80,   0x0,    0x80,   0x10,   0x0,    0x4,    0x0,    0x60,
-    0x10,   0x44,   0x81,   0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,    0x4,
-    0x44,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x1c,   0x0,
-    0x18,   0x0,    0xf0,   0x0,    0x0,    0x1,    0xc0,   0x0,
-    0x0,    0x21,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x71,   0xe0,   0x0,    0x0,    0xef,
-    0x4,    0x48,   0xa1,   0xc2,   0x20,   0x90,   0x88,   0x40,
-    0x0,    0x0,    0x0,    0x0,    0x11,   0x22,   0x44,   0x88,
-    0x31,   0x0,    0x80,   0x48,   0x8a,   0x0,    0x4,    0x0,
-    0x20,   0x28,   0x44,   0x10,   0x90,   0x92,   0x44,   0x10,
-    0x20,   0x89,   0x4,    0xa1,   0xd,    0x99,   0x12,   0x24,
-    0x24,   0x44,   0x90,   0x84,   0x48,   0x91,   0x12,   0x22,
-    0x80,   0x90,   0x80,   0x21,   0x40,   0x0,    0x40,   0x10,
-    0x0,    0x4,    0x0,    0x80,   0x10,   0x44,   0x81,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x8,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x8,    0x42,   0x0,    0x0,    0x44,
-    0x18,   0xe2,   0x26,   0x2,    0x0,    0x1c,   0x44,   0xc0,
-    0x0,    0x0,    0x8,    0x0,    0x0,    0x0,    0xa1,   0xe2,
-    0x13,   0x2,    0x26,   0x8,    0x80,   0x0,    0x8,    0x9c,
-    0x3,    0x0,    0x18,   0x33,   0x88,   0x80,   0x0,    0x49,
-    0x20,   0x0,    0x1,    0xf,    0x4,    0x49,   0xf2,   0x85,
-    0x20,   0x90,   0x90,   0x20,   0x80,   0x0,    0x0,    0x0,
-    0x21,   0x22,   0x4,    0x10,   0x31,   0xc1,   0x0,    0x85,
-    0x11,   0x0,    0x8,    0x0,    0x10,   0x44,   0x44,   0x10,
-    0xe1,   0x2,    0x47,   0x9e,   0x4c,   0xf9,   0x4,    0xc1,
-    0xa,    0x95,   0x12,   0x22,   0x24,   0x78,   0x80,   0x84,
-    0x48,   0x91,   0x11,   0x41,   0x1,    0x10,   0x40,   0x22,
-    0x20,   0x0,    0x0,    0x10,   0x0,    0x4,    0x1,    0xc0,
-    0x90,   0x0,    0x91,   0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,    0x8,
-    0x42,   0x0,    0x0,    0x0,    0x1,    0x10,   0x0,    0x2,
-    0x0,    0x22,   0x0,    0x1,    0x11,   0xc6,   0x8,    0x10,
-    0xf8,   0x0,    0xa2,   0x10,   0x0,    0x0,    0x0,    0x0,
-    0x11,   0x21,   0x8,    0x92,   0x0,    0x18,   0x0,    0x0,
-    0xc,    0x80,   0x0,    0x49,   0x0,    0x0,    0x0,    0x8f,
-    0x4,    0x90,   0xa2,   0x82,   0x40,   0x61,   0x10,   0x24,
-    0x90,   0x40,   0x0,    0x0,    0x22,   0x12,   0x8,    0x20,
-    0x50,   0x21,   0x80,   0x82,   0x11,   0x0,    0x10,   0x0,
-    0x8,    0x44,   0x82,   0x38,   0x91,   0x2,    0x24,   0x10,
-    0x44,   0x89,   0x4,    0xa1,   0x8,    0x93,   0x21,   0x22,
-    0x42,   0x50,   0x40,   0x84,   0x48,   0x8a,   0xa1,   0xc1,
-    0x1,    0x10,   0x40,   0x24,   0x10,   0x0,    0x7,    0x1c,
-    0xc,    0x1c,   0x30,   0x83,   0x1c,   0x44,   0xa1,   0x3f,
-    0x1c,   0x18,   0x70,   0x39,   0x63,   0x1c,   0x89,   0x12,
-    0x49,   0x12,   0x27,   0x88,   0x42,   0x19,   0xc,    0x44,
-    0x30,   0xe1,   0xc3,   0x87,   0x6,    0xc,    0x18,   0x30,
-    0x2,    0x20,   0x1c,   0x10,   0x40,   0x1,    0x20,   0xc0,
-    0xc0,   0xc2,   0x24,   0x48,   0x84,   0x21,   0x8,    0x92,
-    0xe,    0x0,    0x61,   0x13,   0x8a,   0x80,   0x0,    0x71,
-    0x1,    0xf9,   0x11,   0x8f,   0x4,    0x0,    0xa1,   0x80,
-    0x40,   0x90,   0x10,   0x22,   0xa0,   0x40,   0x0,    0x0,
-    0x42,   0x12,   0x8,    0x10,   0x50,   0x13,   0x41,   0x5,
-    0x11,   0x0,    0x20,   0x0,    0x4,    0x44,   0x9a,   0x28,
-    0x89,   0x2,    0x24,   0x10,   0x44,   0x89,   0x4,    0xa1,
-    0x8,    0x91,   0x21,   0x22,   0x42,   0x50,   0x40,   0x84,
-    0x45,   0xa,    0xa0,   0x81,   0x2,    0x10,   0x20,   0x20,
-    0x0,    0x0,    0x0,    0x92,   0x12,   0x24,   0x48,   0x85,
-    0x12,   0x44,   0xc1,   0x24,   0x92,   0x24,   0x48,   0x49,
-    0x84,   0x8,    0x89,   0x12,   0x49,   0x12,   0x20,   0x88,
-    0x42,   0x26,   0x12,   0x44,   0x48,   0x10,   0x20,   0x40,
-    0x89,   0x12,   0x24,   0x48,   0x40,   0x81,   0x14,   0x0,
-    0x41,   0xf1,   0x21,   0x21,   0x21,   0x22,   0x24,   0x48,
-    0x8a,   0x21,   0x5,    0x12,   0x1,    0x20,   0x91,   0x12,
-    0x49,   0x8e,   0x3c,   0x49,   0x2,    0x41,   0x12,   0x40,
-    0x4,    0x1,    0xf0,   0xc0,   0x81,   0x8,    0x10,   0x21,
-    0xc0,   0x40,   0x0,    0x0,    0x42,   0x12,   0x10,   0x8,
-    0x90,   0x12,   0x21,   0x8,    0x91,   0x20,   0x40,   0x7e,
-    0x2,    0x8,    0xa6,   0x28,   0x89,   0x2,    0x24,   0x10,
-    0x44,   0x89,   0x4,    0xa1,   0x8,    0x91,   0x21,   0x22,
-    0x42,   0x48,   0x20,   0x84,   0x45,   0xa,    0xa1,   0xc1,
-    0x2,    0x10,   0x20,   0x20,   0x0,    0x0,    0x1,    0x91,
-    0x20,   0x44,   0x88,   0x88,   0x92,   0x44,   0xa1,   0x24,
-    0x92,   0x42,   0x44,   0x89,   0x4,    0x8,    0x89,   0x12,
-    0xa8,   0xa2,   0x21,   0x10,   0x41,   0x0,    0x20,   0x44,
-    0x88,   0x30,   0x60,   0xc1,   0x90,   0x22,   0x44,   0x88,
-    0x40,   0x81,   0x14,   0x38,   0x40,   0x41,   0xf2,   0x12,
-    0x12,   0x12,   0x24,   0x48,   0x91,   0x21,   0x5,    0x1f,
-    0x3,    0x21,   0x9,    0x12,   0x48,   0x92,   0x22,   0x49,
-    0x4,    0x21,   0x14,   0x2f,   0x4,    0x0,    0xa0,   0xa0,
-    0x81,   0x8,    0x10,   0x21,   0xc3,   0xf8,   0x1f,   0x80,
-    0x82,   0x12,   0x20,   0x8,    0x90,   0x12,   0x21,   0x8,
-    0x89,   0x22,   0x20,   0x0,    0x4,    0x10,   0xa6,   0x28,
-    0x89,   0x2,    0x24,   0x10,   0x44,   0x89,   0x4,    0x91,
-    0x8,    0x91,   0x21,   0x22,   0x42,   0x48,   0x20,   0x84,
-    0x45,   0xc,    0x61,   0x41,   0x2,    0x10,   0x10,   0x20,
-    0x0,    0x0,    0x2,    0x91,   0x20,   0x44,   0x90,   0x88,
-    0x92,   0x44,   0xa1,   0x24,   0x92,   0x42,   0x44,   0x89,
-    0x2,    0x8,    0x88,   0xa1,   0x10,   0x41,   0x41,   0x8,
-    0x42,   0x0,    0x20,   0x44,   0x90,   0x50,   0xa1,   0x42,
-    0x90,   0x24,   0x48,   0x90,   0x40,   0x81,   0x14,   0x28,
-    0x70,   0x41,   0x22,   0x12,   0x12,   0x12,   0x24,   0x45,
-    0x11,   0x21,   0x2,    0x11,   0x5,    0x21,   0x9,    0x12,
-    0x48,   0x92,   0x22,   0x71,   0x4,    0x21,   0x14,   0x20,
-    0x4,    0x0,    0xa0,   0xa1,   0x11,   0x8,    0x10,   0x22,
-    0xa0,   0x40,   0x0,    0x0,    0x82,   0x12,   0x20,   0x9,
-    0x10,   0x12,   0x22,   0x8,    0x86,   0x2,    0x10,   0x0,
-    0x8,    0x10,   0x9c,   0x7c,   0x89,   0x2,    0x24,   0x10,
-    0x44,   0x89,   0x4,    0x91,   0x8,    0x91,   0x21,   0x24,
-    0x42,   0x48,   0x10,   0x84,   0x45,   0xc,    0x61,   0x41,
-    0x4,    0x10,   0x10,   0x20,   0x0,    0x0,    0x4,    0x91,
-    0x20,   0x44,   0xa0,   0x85,   0x12,   0x44,   0x91,   0x24,
-    0x92,   0x42,   0x44,   0x89,   0x1,    0x8,    0x88,   0xa1,
-    0x10,   0xa1,   0x42,   0x8,    0x42,   0x0,    0x20,   0x44,
-    0xa0,   0x91,   0x22,   0x44,   0x90,   0x28,   0x50,   0xa0,
-    0x40,   0x81,   0x3e,   0x28,   0x40,   0xf3,   0x22,   0x12,
-    0x12,   0x12,   0x24,   0x45,   0x11,   0x21,   0x7,    0x11,
-    0x9,    0x21,   0x9,    0x12,   0x48,   0x92,   0x22,   0x41,
-    0x4,    0x21,   0x14,   0x2f,   0x0,    0x0,    0x0,    0xa1,
-    0x29,   0x10,   0x10,   0x24,   0x90,   0x40,   0x0,    0x1,
-    0x1,    0x22,   0x40,   0x9,    0xf8,   0x12,   0x22,   0x8,
-    0x82,   0x0,    0x8,    0x7e,   0x10,   0x0,    0x40,   0x44,
-    0x89,   0x2,    0x44,   0x10,   0x44,   0x89,   0x4,    0x91,
-    0x8,    0x91,   0x12,   0x38,   0x2c,   0x44,   0x10,   0x84,
-    0x42,   0x4,    0x42,   0x21,   0x4,    0x10,   0x8,    0x20,
-    0x0,    0x0,    0x8,    0x91,   0x20,   0x44,   0xc0,   0x82,
-    0x12,   0x44,   0x91,   0x24,   0x92,   0x42,   0x44,   0x89,
-    0x0,    0x88,   0x88,   0xa1,   0x10,   0xa1,   0x42,   0x8,
-    0x42,   0x0,    0x20,   0x44,   0xc1,   0x12,   0x24,   0x48,
-    0x90,   0x30,   0x60,   0xc0,   0x40,   0x81,   0x22,   0x7c,
-    0x41,   0x42,   0x22,   0x12,   0x12,   0x12,   0x24,   0x45,
-    0x11,   0x21,   0x2,    0x13,   0x91,   0x21,   0x9,    0x12,
-    0x48,   0x8f,   0x1c,   0x41,   0x4,    0x21,   0x14,   0x2f,
-    0x4,    0x0,    0x1,    0xc2,   0x10,   0x80,   0x10,   0x20,
-    0x80,   0x40,   0x0,    0x11,   0x1,    0x22,   0x40,   0x90,
-    0x11,   0x21,   0x42,   0x5,    0x4,    0x20,   0x4,    0x0,
-    0x20,   0x10,   0x44,   0x44,   0x90,   0x92,   0x44,   0x10,
-    0x24,   0x89,   0x8,    0x89,   0x8,    0x91,   0x12,   0x20,
-    0x24,   0x44,   0x90,   0x84,   0x42,   0x4,    0x42,   0x21,
-    0x8,    0x10,   0x8,    0x20,   0x0,    0x0,    0x8,    0x92,
-    0x12,   0x24,   0x88,   0x84,   0x12,   0x44,   0x89,   0x24,
-    0x92,   0x24,   0x48,   0x49,   0x0,    0x88,   0x88,   0x40,
-    0xa1,   0x10,   0x84,   0x8,    0x42,   0x0,    0x12,   0x44,
-    0x89,   0x12,   0x24,   0x48,   0x88,   0x22,   0x44,   0x88,
-    0x40,   0x81,   0x22,   0x44,   0x41,   0x42,   0x21,   0x21,
-    0x21,   0x22,   0x24,   0x42,   0xa,    0x21,   0x7,    0x11,
-    0x11,   0x20,   0x91,   0x12,   0x48,   0x80,   0x0,    0x41,
-    0x2,    0x41,   0x12,   0x4f,   0x4,    0x0,    0x0,    0x82,
-    0x0,    0x70,   0x8,    0x40,   0x0,    0x0,    0x80,   0x12,
-    0x0,    0xc2,   0x7c,   0x60,   0x10,   0xc0,   0x82,   0x2,
-    0x8,    0x22,   0x2,    0x0,    0x40,   0x10,   0x38,   0x44,
-    0xe0,   0x63,   0x87,   0x90,   0x1c,   0x89,   0x30,   0x89,
-    0xc8,   0x91,   0xc,    0x20,   0x1a,   0x44,   0x60,   0x83,
-    0x82,   0x4,    0x42,   0x21,   0xf,    0x90,   0x4,    0x20,
-    0x0,    0x0,    0x7,    0x9c,   0xc,    0x1c,   0x70,   0x84,
-    0x12,   0x44,   0x89,   0x24,   0x92,   0x18,   0x70,   0x39,
-    0x7,    0x8,    0x78,   0x40,   0xa1,   0x10,   0x87,   0x88,
-    0x42,   0x0,    0xc,    0x3c,   0x70,   0xf1,   0xe3,   0xc7,
-    0x86,   0x1c,   0x38,   0x70,   0x40,   0x81,   0x22,   0x44,
-    0xf8,   0xf2,   0x30,   0xc0,   0xc0,   0xc1,   0xe3,   0xc2,
-    0x4,    0x1e,   0x2,    0x11,   0x8f,   0x20,   0x60,   0xf2,
-    0x48,   0x9f,   0x3e,   0x41,   0x1,    0x81,   0xe1,   0x8f,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x8,    0x40,
-    0x0,    0x0,    0x80,   0x2,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x2,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x10,   0x4,    0x20,   0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x2,    0x0,    0x4,    0x0,    0x0,
-    0x0,    0x0,    0x40,   0x8,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x80,   0x4,    0x44,   0x0,    0x4,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x1,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x2,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x1,    0x0,    0xf,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x4,    0x80,   0x0,    0x1,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x4,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x1c,   0x0,    0xe0,
-    0x3,    0xfe,   0x0,    0x0,    0x0,    0x0,    0x0,    0x1,
-    0x0,    0x4,    0x0,    0x0,    0x0,    0x0,    0x40,   0x8,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x80,   0x2,
-    0x48,   0x0,    0x2,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0xe,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x2,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x1,    0x0,    0xf,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x6,    0x0,    0x8,    0x0,    0x0,
-    0x0,    0x0,    0x40,   0x8,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x1,    0x0,    0x0,    0x0,    0x0,    0x1c,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x4,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x2,    0x0,    0xf,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xf,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x4,    0x80,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x1c,   0x0,    0xe0,   0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x2,    0x48,   0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x22,   0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0xf,    0x80,   0x0,    0x0,
+	0x0,    0x0,    0x0,    0xf,    0x4,    0x0,    0xa0,   0x80,
+	0x10,   0x60,   0x8,    0x40,   0x0,    0x0,    0x0,    0x0,
+	0x10,   0xc2,   0x38,   0x70,   0x11,   0xf0,   0x47,   0xc7,
+	0x4,    0x0,    0x2,    0x0,    0x40,   0x10,   0x38,   0x10,
+	0xe0,   0x63,   0x87,   0x9e,   0x1c,   0x89,   0x4,    0x91,
+	0x8,    0x91,   0xc,    0x38,   0x18,   0x78,   0x63,   0xe4,
+	0x48,   0x91,   0x12,   0x24,   0x4f,   0x90,   0x80,   0x20,
+	0x80,   0x0,    0x80,   0x10,   0x0,    0x4,    0x0,    0x60,
+	0x10,   0x44,   0x81,   0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,    0x4,
+	0x44,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x1c,   0x0,
+	0x18,   0x0,    0xf0,   0x0,    0x0,    0x1,    0xc0,   0x0,
+	0x0,    0x21,   0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x71,   0xe0,   0x0,    0x0,    0xef,
+	0x4,    0x48,   0xa1,   0xc2,   0x20,   0x90,   0x88,   0x40,
+	0x0,    0x0,    0x0,    0x0,    0x11,   0x22,   0x44,   0x88,
+	0x31,   0x0,    0x80,   0x48,   0x8a,   0x0,    0x4,    0x0,
+	0x20,   0x28,   0x44,   0x10,   0x90,   0x92,   0x44,   0x10,
+	0x20,   0x89,   0x4,    0xa1,   0xd,    0x99,   0x12,   0x24,
+	0x24,   0x44,   0x90,   0x84,   0x48,   0x91,   0x12,   0x22,
+	0x80,   0x90,   0x80,   0x21,   0x40,   0x0,    0x40,   0x10,
+	0x0,    0x4,    0x0,    0x80,   0x10,   0x44,   0x81,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x8,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x8,    0x42,   0x0,    0x0,    0x44,
+	0x18,   0xe2,   0x26,   0x2,    0x0,    0x1c,   0x44,   0xc0,
+	0x0,    0x0,    0x8,    0x0,    0x0,    0x0,    0xa1,   0xe2,
+	0x13,   0x2,    0x26,   0x8,    0x80,   0x0,    0x8,    0x9c,
+	0x3,    0x0,    0x18,   0x33,   0x88,   0x80,   0x0,    0x49,
+	0x20,   0x0,    0x1,    0xf,    0x4,    0x49,   0xf2,   0x85,
+	0x20,   0x90,   0x90,   0x20,   0x80,   0x0,    0x0,    0x0,
+	0x21,   0x22,   0x4,    0x10,   0x31,   0xc1,   0x0,    0x85,
+	0x11,   0x0,    0x8,    0x0,    0x10,   0x44,   0x44,   0x10,
+	0xe1,   0x2,    0x47,   0x9e,   0x4c,   0xf9,   0x4,    0xc1,
+	0xa,    0x95,   0x12,   0x22,   0x24,   0x78,   0x80,   0x84,
+	0x48,   0x91,   0x11,   0x41,   0x1,    0x10,   0x40,   0x22,
+	0x20,   0x0,    0x0,    0x10,   0x0,    0x4,    0x1,    0xc0,
+	0x90,   0x0,    0x91,   0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x8,    0x0,    0x0,    0x0,    0x0,    0x0,    0x8,
+	0x42,   0x0,    0x0,    0x0,    0x1,    0x10,   0x0,    0x2,
+	0x0,    0x22,   0x0,    0x1,    0x11,   0xc6,   0x8,    0x10,
+	0xf8,   0x0,    0xa2,   0x10,   0x0,    0x0,    0x0,    0x0,
+	0x11,   0x21,   0x8,    0x92,   0x0,    0x18,   0x0,    0x0,
+	0xc,    0x80,   0x0,    0x49,   0x0,    0x0,    0x0,    0x8f,
+	0x4,    0x90,   0xa2,   0x82,   0x40,   0x61,   0x10,   0x24,
+	0x90,   0x40,   0x0,    0x0,    0x22,   0x12,   0x8,    0x20,
+	0x50,   0x21,   0x80,   0x82,   0x11,   0x0,    0x10,   0x0,
+	0x8,    0x44,   0x82,   0x38,   0x91,   0x2,    0x24,   0x10,
+	0x44,   0x89,   0x4,    0xa1,   0x8,    0x93,   0x21,   0x22,
+	0x42,   0x50,   0x40,   0x84,   0x48,   0x8a,   0xa1,   0xc1,
+	0x1,    0x10,   0x40,   0x24,   0x10,   0x0,    0x7,    0x1c,
+	0xc,    0x1c,   0x30,   0x83,   0x1c,   0x44,   0xa1,   0x3f,
+	0x1c,   0x18,   0x70,   0x39,   0x63,   0x1c,   0x89,   0x12,
+	0x49,   0x12,   0x27,   0x88,   0x42,   0x19,   0xc,    0x44,
+	0x30,   0xe1,   0xc3,   0x87,   0x6,    0xc,    0x18,   0x30,
+	0x2,    0x20,   0x1c,   0x10,   0x40,   0x1,    0x20,   0xc0,
+	0xc0,   0xc2,   0x24,   0x48,   0x84,   0x21,   0x8,    0x92,
+	0xe,    0x0,    0x61,   0x13,   0x8a,   0x80,   0x0,    0x71,
+	0x1,    0xf9,   0x11,   0x8f,   0x4,    0x0,    0xa1,   0x80,
+	0x40,   0x90,   0x10,   0x22,   0xa0,   0x40,   0x0,    0x0,
+	0x42,   0x12,   0x8,    0x10,   0x50,   0x13,   0x41,   0x5,
+	0x11,   0x0,    0x20,   0x0,    0x4,    0x44,   0x9a,   0x28,
+	0x89,   0x2,    0x24,   0x10,   0x44,   0x89,   0x4,    0xa1,
+	0x8,    0x91,   0x21,   0x22,   0x42,   0x50,   0x40,   0x84,
+	0x45,   0xa,    0xa0,   0x81,   0x2,    0x10,   0x20,   0x20,
+	0x0,    0x0,    0x0,    0x92,   0x12,   0x24,   0x48,   0x85,
+	0x12,   0x44,   0xc1,   0x24,   0x92,   0x24,   0x48,   0x49,
+	0x84,   0x8,    0x89,   0x12,   0x49,   0x12,   0x20,   0x88,
+	0x42,   0x26,   0x12,   0x44,   0x48,   0x10,   0x20,   0x40,
+	0x89,   0x12,   0x24,   0x48,   0x40,   0x81,   0x14,   0x0,
+	0x41,   0xf1,   0x21,   0x21,   0x21,   0x22,   0x24,   0x48,
+	0x8a,   0x21,   0x5,    0x12,   0x1,    0x20,   0x91,   0x12,
+	0x49,   0x8e,   0x3c,   0x49,   0x2,    0x41,   0x12,   0x40,
+	0x4,    0x1,    0xf0,   0xc0,   0x81,   0x8,    0x10,   0x21,
+	0xc0,   0x40,   0x0,    0x0,    0x42,   0x12,   0x10,   0x8,
+	0x90,   0x12,   0x21,   0x8,    0x91,   0x20,   0x40,   0x7e,
+	0x2,    0x8,    0xa6,   0x28,   0x89,   0x2,    0x24,   0x10,
+	0x44,   0x89,   0x4,    0xa1,   0x8,    0x91,   0x21,   0x22,
+	0x42,   0x48,   0x20,   0x84,   0x45,   0xa,    0xa1,   0xc1,
+	0x2,    0x10,   0x20,   0x20,   0x0,    0x0,    0x1,    0x91,
+	0x20,   0x44,   0x88,   0x88,   0x92,   0x44,   0xa1,   0x24,
+	0x92,   0x42,   0x44,   0x89,   0x4,    0x8,    0x89,   0x12,
+	0xa8,   0xa2,   0x21,   0x10,   0x41,   0x0,    0x20,   0x44,
+	0x88,   0x30,   0x60,   0xc1,   0x90,   0x22,   0x44,   0x88,
+	0x40,   0x81,   0x14,   0x38,   0x40,   0x41,   0xf2,   0x12,
+	0x12,   0x12,   0x24,   0x48,   0x91,   0x21,   0x5,    0x1f,
+	0x3,    0x21,   0x9,    0x12,   0x48,   0x92,   0x22,   0x49,
+	0x4,    0x21,   0x14,   0x2f,   0x4,    0x0,    0xa0,   0xa0,
+	0x81,   0x8,    0x10,   0x21,   0xc3,   0xf8,   0x1f,   0x80,
+	0x82,   0x12,   0x20,   0x8,    0x90,   0x12,   0x21,   0x8,
+	0x89,   0x22,   0x20,   0x0,    0x4,    0x10,   0xa6,   0x28,
+	0x89,   0x2,    0x24,   0x10,   0x44,   0x89,   0x4,    0x91,
+	0x8,    0x91,   0x21,   0x22,   0x42,   0x48,   0x20,   0x84,
+	0x45,   0xc,    0x61,   0x41,   0x2,    0x10,   0x10,   0x20,
+	0x0,    0x0,    0x2,    0x91,   0x20,   0x44,   0x90,   0x88,
+	0x92,   0x44,   0xa1,   0x24,   0x92,   0x42,   0x44,   0x89,
+	0x2,    0x8,    0x88,   0xa1,   0x10,   0x41,   0x41,   0x8,
+	0x42,   0x0,    0x20,   0x44,   0x90,   0x50,   0xa1,   0x42,
+	0x90,   0x24,   0x48,   0x90,   0x40,   0x81,   0x14,   0x28,
+	0x70,   0x41,   0x22,   0x12,   0x12,   0x12,   0x24,   0x45,
+	0x11,   0x21,   0x2,    0x11,   0x5,    0x21,   0x9,    0x12,
+	0x48,   0x92,   0x22,   0x71,   0x4,    0x21,   0x14,   0x20,
+	0x4,    0x0,    0xa0,   0xa1,   0x11,   0x8,    0x10,   0x22,
+	0xa0,   0x40,   0x0,    0x0,    0x82,   0x12,   0x20,   0x9,
+	0x10,   0x12,   0x22,   0x8,    0x86,   0x2,    0x10,   0x0,
+	0x8,    0x10,   0x9c,   0x7c,   0x89,   0x2,    0x24,   0x10,
+	0x44,   0x89,   0x4,    0x91,   0x8,    0x91,   0x21,   0x24,
+	0x42,   0x48,   0x10,   0x84,   0x45,   0xc,    0x61,   0x41,
+	0x4,    0x10,   0x10,   0x20,   0x0,    0x0,    0x4,    0x91,
+	0x20,   0x44,   0xa0,   0x85,   0x12,   0x44,   0x91,   0x24,
+	0x92,   0x42,   0x44,   0x89,   0x1,    0x8,    0x88,   0xa1,
+	0x10,   0xa1,   0x42,   0x8,    0x42,   0x0,    0x20,   0x44,
+	0xa0,   0x91,   0x22,   0x44,   0x90,   0x28,   0x50,   0xa0,
+	0x40,   0x81,   0x3e,   0x28,   0x40,   0xf3,   0x22,   0x12,
+	0x12,   0x12,   0x24,   0x45,   0x11,   0x21,   0x7,    0x11,
+	0x9,    0x21,   0x9,    0x12,   0x48,   0x92,   0x22,   0x41,
+	0x4,    0x21,   0x14,   0x2f,   0x0,    0x0,    0x0,    0xa1,
+	0x29,   0x10,   0x10,   0x24,   0x90,   0x40,   0x0,    0x1,
+	0x1,    0x22,   0x40,   0x9,    0xf8,   0x12,   0x22,   0x8,
+	0x82,   0x0,    0x8,    0x7e,   0x10,   0x0,    0x40,   0x44,
+	0x89,   0x2,    0x44,   0x10,   0x44,   0x89,   0x4,    0x91,
+	0x8,    0x91,   0x12,   0x38,   0x2c,   0x44,   0x10,   0x84,
+	0x42,   0x4,    0x42,   0x21,   0x4,    0x10,   0x8,    0x20,
+	0x0,    0x0,    0x8,    0x91,   0x20,   0x44,   0xc0,   0x82,
+	0x12,   0x44,   0x91,   0x24,   0x92,   0x42,   0x44,   0x89,
+	0x0,    0x88,   0x88,   0xa1,   0x10,   0xa1,   0x42,   0x8,
+	0x42,   0x0,    0x20,   0x44,   0xc1,   0x12,   0x24,   0x48,
+	0x90,   0x30,   0x60,   0xc0,   0x40,   0x81,   0x22,   0x7c,
+	0x41,   0x42,   0x22,   0x12,   0x12,   0x12,   0x24,   0x45,
+	0x11,   0x21,   0x2,    0x13,   0x91,   0x21,   0x9,    0x12,
+	0x48,   0x8f,   0x1c,   0x41,   0x4,    0x21,   0x14,   0x2f,
+	0x4,    0x0,    0x1,    0xc2,   0x10,   0x80,   0x10,   0x20,
+	0x80,   0x40,   0x0,    0x11,   0x1,    0x22,   0x40,   0x90,
+	0x11,   0x21,   0x42,   0x5,    0x4,    0x20,   0x4,    0x0,
+	0x20,   0x10,   0x44,   0x44,   0x90,   0x92,   0x44,   0x10,
+	0x24,   0x89,   0x8,    0x89,   0x8,    0x91,   0x12,   0x20,
+	0x24,   0x44,   0x90,   0x84,   0x42,   0x4,    0x42,   0x21,
+	0x8,    0x10,   0x8,    0x20,   0x0,    0x0,    0x8,    0x92,
+	0x12,   0x24,   0x88,   0x84,   0x12,   0x44,   0x89,   0x24,
+	0x92,   0x24,   0x48,   0x49,   0x0,    0x88,   0x88,   0x40,
+	0xa1,   0x10,   0x84,   0x8,    0x42,   0x0,    0x12,   0x44,
+	0x89,   0x12,   0x24,   0x48,   0x88,   0x22,   0x44,   0x88,
+	0x40,   0x81,   0x22,   0x44,   0x41,   0x42,   0x21,   0x21,
+	0x21,   0x22,   0x24,   0x42,   0xa,    0x21,   0x7,    0x11,
+	0x11,   0x20,   0x91,   0x12,   0x48,   0x80,   0x0,    0x41,
+	0x2,    0x41,   0x12,   0x4f,   0x4,    0x0,    0x0,    0x82,
+	0x0,    0x70,   0x8,    0x40,   0x0,    0x0,    0x80,   0x12,
+	0x0,    0xc2,   0x7c,   0x60,   0x10,   0xc0,   0x82,   0x2,
+	0x8,    0x22,   0x2,    0x0,    0x40,   0x10,   0x38,   0x44,
+	0xe0,   0x63,   0x87,   0x90,   0x1c,   0x89,   0x30,   0x89,
+	0xc8,   0x91,   0xc,    0x20,   0x1a,   0x44,   0x60,   0x83,
+	0x82,   0x4,    0x42,   0x21,   0xf,    0x90,   0x4,    0x20,
+	0x0,    0x0,    0x7,    0x9c,   0xc,    0x1c,   0x70,   0x84,
+	0x12,   0x44,   0x89,   0x24,   0x92,   0x18,   0x70,   0x39,
+	0x7,    0x8,    0x78,   0x40,   0xa1,   0x10,   0x87,   0x88,
+	0x42,   0x0,    0xc,    0x3c,   0x70,   0xf1,   0xe3,   0xc7,
+	0x86,   0x1c,   0x38,   0x70,   0x40,   0x81,   0x22,   0x44,
+	0xf8,   0xf2,   0x30,   0xc0,   0xc0,   0xc1,   0xe3,   0xc2,
+	0x4,    0x1e,   0x2,    0x11,   0x8f,   0x20,   0x60,   0xf2,
+	0x48,   0x9f,   0x3e,   0x41,   0x1,    0x81,   0xe1,   0x8f,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x8,    0x40,
+	0x0,    0x0,    0x80,   0x2,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x2,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x10,   0x4,    0x20,   0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x2,    0x0,    0x4,    0x0,    0x0,
+	0x0,    0x0,    0x40,   0x8,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x80,   0x4,    0x44,   0x0,    0x4,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x1,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x2,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x1,    0x0,    0xf,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x4,    0x80,   0x0,    0x1,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x4,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x1c,   0x0,    0xe0,
+	0x3,    0xfe,   0x0,    0x0,    0x0,    0x0,    0x0,    0x1,
+	0x0,    0x4,    0x0,    0x0,    0x0,    0x0,    0x40,   0x8,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x80,   0x2,
+	0x48,   0x0,    0x2,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0xe,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x2,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x1,    0x0,    0xf,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x6,    0x0,    0x8,    0x0,    0x0,
+	0x0,    0x0,    0x40,   0x8,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x1,    0x0,    0x0,    0x0,    0x0,    0x1c,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x4,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x2,    0x0,    0xf,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0xf,
 };
 
 const uint16 CHALETSE_OFFSETS[] = {
-    0x0,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
-    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
-    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
-    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
-    0x5,     0x8,     0xE,     0x15,    0x1B,    0x23,    0x2A,    0x2D,
-    0x30,    0x33,    0x39,    0x3F,    0x42,    0x47,    0x4A,    0x4F,
-    0x56,    0x5B,    0x61,    0x67,    0x6D,    0x73,    0x79,    0x7F,
-    0x85,    0x8B,    0x8E,    0x91,    0x95,    0x9A,    0x9E,    0xA4,
-    0xAC,    0xB2,    0xB8,    0xBE,    0xC4,    0xCA,    0xD0,    0xD7,
-    0xDD,    0xDF,    0xE4,    0xEA,    0xF0,    0xF8,    0xFF,    0x107,
-    0x10D,   0x114,   0x11A,   0x120,   0x126,   0x12D,   0x133,   0x13D,
-    0x145,   0x14D,   0x154,   0x157,   0x15C,   0x15F,   0x164,   0x166,
-    0x169,   0x170,   0x177,   0x17E,   0x185,   0x18C,   0x190,   0x197,
-    0x19E,   0x1A1,   0x1A6,   0x1AC,   0x1AF,   0x1B9,   0x1C0,   0x1C7,
-    0x1CE,   0x1D5,   0x1DA,   0x1DF,   0x1E3,   0x1EA,   0x1F0,   0x1FA,
-    0x201,   0x207,   0x20D,   0x211,   0x213,   0x217,   0x21C,   0x21C,
-    0x223,   0x22A,   0x231,   0x239,   0x240,   0x247,   0x24E,   0x255,
-    0x25D,   0x264,   0x26B,   0x271,   0x277,   0x27B,   0x281,   0x287,
-    0x28D,   0x294,   0x29B,   0x2A2,   0x2A9,   0x2B0,   0x2B7,   0x2BE,
-    0x2C4,   0x2CA,   0x2D1,   0x2D1,   0x2D1,   0x2D1,   0x2D1,   0x2D1,
-    0x2D8,   0x2DC,   0x2E3,   0x2EA,   0x2F0,   0x2F6,   0x2FC,   0x301,
-    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
-    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
-    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
-    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
-    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
-    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
-    0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
-    0x301,   0x306,   0x30B,   0x313,   0x31A,   0x31A,   0x31A,   0x31A,
-    0x31A,   0x31A,   0x31A,   0x321,
+	0x0,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+	0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+	0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+	0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+	0x5,     0x8,     0xE,     0x15,    0x1B,    0x23,    0x2A,    0x2D,
+	0x30,    0x33,    0x39,    0x3F,    0x42,    0x47,    0x4A,    0x4F,
+	0x56,    0x5B,    0x61,    0x67,    0x6D,    0x73,    0x79,    0x7F,
+	0x85,    0x8B,    0x8E,    0x91,    0x95,    0x9A,    0x9E,    0xA4,
+	0xAC,    0xB2,    0xB8,    0xBE,    0xC4,    0xCA,    0xD0,    0xD7,
+	0xDD,    0xDF,    0xE4,    0xEA,    0xF0,    0xF8,    0xFF,    0x107,
+	0x10D,   0x114,   0x11A,   0x120,   0x126,   0x12D,   0x133,   0x13D,
+	0x145,   0x14D,   0x154,   0x157,   0x15C,   0x15F,   0x164,   0x166,
+	0x169,   0x170,   0x177,   0x17E,   0x185,   0x18C,   0x190,   0x197,
+	0x19E,   0x1A1,   0x1A6,   0x1AC,   0x1AF,   0x1B9,   0x1C0,   0x1C7,
+	0x1CE,   0x1D5,   0x1DA,   0x1DF,   0x1E3,   0x1EA,   0x1F0,   0x1FA,
+	0x201,   0x207,   0x20D,   0x211,   0x213,   0x217,   0x21C,   0x21C,
+	0x223,   0x22A,   0x231,   0x239,   0x240,   0x247,   0x24E,   0x255,
+	0x25D,   0x264,   0x26B,   0x271,   0x277,   0x27B,   0x281,   0x287,
+	0x28D,   0x294,   0x29B,   0x2A2,   0x2A9,   0x2B0,   0x2B7,   0x2BE,
+	0x2C4,   0x2CA,   0x2D1,   0x2D1,   0x2D1,   0x2D1,   0x2D1,   0x2D1,
+	0x2D8,   0x2DC,   0x2E3,   0x2EA,   0x2F0,   0x2F6,   0x2FC,   0x301,
+	0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+	0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+	0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+	0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+	0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+	0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+	0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,   0x301,
+	0x301,   0x306,   0x30B,   0x313,   0x31A,   0x31A,   0x31A,   0x31A,
+	0x31A,   0x31A,   0x31A,   0x321,
 };
 const byte   CHALETSE_DATA[] = {
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x4,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0xc2,   0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x3,    0x18,   0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0xa0,   0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x3,    0x7f,   0xff,   0x6,    0xd9,
-    0x21,   0xc,    0xe,    0x32,   0x95,   0x0,    0x0,    0x4,
-    0x60,   0x8e,   0x7c,   0x17,   0xc2,   0x7c,   0xe3,   0x80,
-    0x0,    0x1,    0xc3,   0x82,   0x3c,   0x33,   0x8f,   0xbe,
-    0x39,   0x14,   0x28,   0xa0,   0x82,   0x84,   0x71,   0xe1,
-    0x8f,   0x1c,   0xfa,   0x14,   0x50,   0x14,   0x14,   0x17,
-    0xed,   0xd,    0x21,   0x0,    0x80,   0x0,    0x10,   0x3,
-    0x1,    0x3,    0x1a,   0xc,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x1,
-    0x51,   0x47,   0xc0,   0x3,    0x3e,   0x66,   0xc0,   0x20,
-    0x3,    0xe6,   0x6c,   0x1b,   0x39,   0x9b,   0x10,   0x30,
-    0x0,    0xf,    0x0,    0x0,    0x78,   0x2,    0x28,   0xa1,
-    0x6,    0x60,   0x0,    0x0,    0xf9,   0xce,   0x73,   0xc0,
-    0x8,    0x84,   0x7f,   0xff,   0x2,    0xd9,   0x23,   0x92,
-    0x51,   0x34,   0x4a,   0x0,    0x0,    0x4,    0x91,   0x91,
-    0x4,    0x24,   0x4,    0x5,    0x14,   0x40,   0x0,    0x2,
-    0x25,   0x42,   0x22,   0x4a,   0x48,   0x20,   0x45,   0x14,
-    0x29,   0x20,   0xc6,   0xc4,   0x89,   0x12,   0x48,   0xa2,
-    0x22,   0x14,   0x50,   0x12,   0x22,   0x20,   0x29,   0x4,
-    0x0,    0x80,   0x80,   0x0,    0x10,   0x4,    0x1,    0x0,
-    0x2,    0x4,    0x0,    0x0,    0x0,    0x0,    0x0,    0x1,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x2,    0x48,   0x8,
-    0x10,   0x80,   0x41,   0x0,    0x0,    0x21,   0xe4,   0x10,
-    0x0,    0x0,    0x44,   0x4,    0x10,   0x0,    0x3,    0xd0,
-    0xb3,   0x60,   0x85,   0x80,   0x2,    0x0,    0x0,    0x0,
-    0xc1,   0xbe,   0x2,    0x49,   0x4a,   0x40,   0x8,    0x82,
-    0x7f,   0xff,   0x2,    0x4b,   0xf5,   0x52,   0x91,   0x14,
-    0x4a,   0x10,   0x0,    0x9,    0xa,    0x91,   0x8,    0x44,
-    0x8,    0x5,    0x14,   0x5b,   0x10,   0x22,   0x2a,   0xa5,
-    0x22,   0x82,   0x28,   0x20,   0x81,   0x14,   0x2a,   0x20,
-    0xaa,   0xa5,   0x5,    0x14,   0x28,   0xa0,   0x22,   0x14,
-    0x4a,   0x21,   0x41,   0x40,   0x48,   0x84,   0x0,    0x3e,
-    0xf8,   0xf1,   0xf3,   0xce,   0x7d,   0xf3,   0xa,    0x45,
-    0xee,   0x7c,   0x79,   0xf1,   0xf5,   0x99,   0x90,   0xa2,
-    0x88,   0xa1,   0x45,   0xf2,   0x48,   0x8,    0x0,    0x1e,
-    0x3e,   0x3e,   0x7c,   0xfa,   0x3,    0xc3,   0xc7,   0x8c,
-    0x30,   0xca,   0x1,    0xf3,   0xe5,   0x0,    0x0,    0x0,
-    0x0,    0x2,    0x25,   0x21,   0x3e,   0xc0,   0x0,    0x0,
-    0x8a,   0x49,   0x72,   0xf,    0xc8,   0x9e,   0x7f,   0xff,
-    0x2,    0x91,   0x23,   0xd,    0xa,    0x24,   0x55,   0x10,
-    0x3c,   0x9,    0x8,    0x82,   0x10,   0xa7,   0x96,   0x8,
-    0xe3,   0x5b,   0x20,   0x10,   0x4a,   0xa5,   0x3c,   0x82,
-    0x2f,   0xbc,   0x81,   0xf4,   0x2c,   0x20,   0x92,   0x95,
-    0x5,    0x14,   0x28,   0x9c,   0x22,   0x12,   0x8a,   0x20,
-    0x80,   0x80,   0x88,   0x84,   0x0,    0x42,   0x85,   0xa,
-    0x14,   0x24,   0x85,   0x9,    0xa,    0x85,   0x11,   0x42,
-    0x85,   0xa,    0x16,   0x25,   0x10,   0xa2,   0x88,   0x92,
-    0x44,   0x24,   0x4,    0x7,    0xd0,   0xa1,   0x42,   0x42,
-    0x85,   0xa,    0x4,    0x24,   0x28,   0x44,   0x10,   0x4a,
-    0x38,   0x80,   0x85,   0xf,    0x1e,   0x3c,   0x85,   0x9,
-    0x48,   0xa1,   0x42,   0x47,   0x90,   0xbc,   0xc9,   0xe6,
-    0x4a,   0x11,   0x8,    0xa1,   0x7f,   0xff,   0x2,    0x3,
-    0xf1,   0x83,   0x94,   0x84,   0x44,   0x7c,   0x0,    0x11,
-    0x8,    0x84,   0x9,    0xf0,   0x51,   0x9,    0x10,   0x80,
-    0x47,   0x88,   0x89,   0xcf,   0xa2,   0x82,   0x28,   0x20,
-    0x9d,   0x14,   0x2a,   0x20,   0x82,   0x8d,   0x5,    0xe4,
-    0xaf,   0x2,    0x22,   0x12,   0x85,   0x41,   0x40,   0x81,
-    0x8,    0x44,   0x0,    0x42,   0x85,   0x2,    0x17,   0xe4,
-    0x85,   0x9,    0xb,    0x5,    0x11,   0x42,   0x85,   0xa,
-    0x14,   0x19,   0x10,   0x94,   0x55,   0xc,    0x28,   0x42,
-    0x48,   0x0,    0x90,   0xbf,   0x42,   0x42,   0x85,   0x9,
-    0xe7,   0xe7,   0xef,   0xc4,   0x10,   0x5f,   0x44,   0xe3,
-    0xcf,   0x90,   0xa1,   0x42,   0x85,   0x9,    0x48,   0xa1,
-    0x42,   0x48,   0x50,   0xa2,   0xa8,   0x0,    0x72,   0x11,
-    0xf,    0x21,   0x7f,   0xff,   0x0,    0x1,    0x25,   0x46,
-    0x53,   0x4,    0x40,   0x10,   0x80,   0x20,   0x90,   0x88,
-    0x44,   0x24,   0x51,   0x11,   0x10,   0x80,   0x20,   0x10,
-    0x4,    0x8,    0xa2,   0x4a,   0x48,   0x20,   0x45,   0x15,
-    0x29,   0x20,   0x82,   0x84,   0x89,   0x2,    0x49,   0x22,
-    0x22,   0x11,   0x5,    0x42,   0x20,   0x82,   0x8,    0x24,
-    0x0,    0x42,   0x85,   0xa,    0x14,   0x4,    0x85,   0x9,
-    0xa,    0x85,   0x11,   0x42,   0x85,   0xa,    0x14,   0x5,
-    0x10,   0x94,   0x55,   0x12,   0x28,   0x82,   0x48,   0x0,
-    0x50,   0xa0,   0x42,   0x42,   0x85,   0x8,    0x14,   0x4,
-    0x8,    0x4,    0x10,   0x51,   0x7c,   0x84,   0x89,   0x10,
-    0xa1,   0x42,   0x85,   0x8,    0x85,   0x21,   0x42,   0x48,
-    0x50,   0xa2,   0x9b,   0xef,   0x42,   0x11,   0x8,    0x21,
-    0x14,   0x28,   0x6,    0x1,    0x23,   0x89,   0x8d,   0x2,
-    0x80,   0x11,   0x1,    0xa0,   0x63,   0xdf,   0x38,   0x23,
-    0x8e,   0x10,   0xe1,   0x1b,   0x17,   0xa1,   0x83,   0xc8,
-    0xbc,   0x33,   0x8f,   0xa0,   0x39,   0x14,   0xc8,   0xbe,
-    0x82,   0x84,   0x71,   0x1,    0xa8,   0x9c,   0x21,   0xe1,
-    0x2,    0x84,   0x10,   0x87,   0xec,   0x2c,   0x0,    0x3e,
-    0x78,   0xf1,   0xe3,   0xe4,   0x7d,   0x9,    0x4a,   0x45,
-    0x11,   0x42,   0x79,   0xf1,   0xf4,   0x39,   0xf,    0x8,
-    0x22,   0x21,   0x11,   0xf1,   0x50,   0x3,    0x8f,   0x1f,
-    0x3e,   0x3e,   0x7c,   0xf8,   0xe3,   0xe3,   0xe7,   0xc4,
-    0x10,   0x51,   0x45,   0xf3,   0xe9,   0xcf,   0x1e,   0x3c,
-    0x78,   0xf1,   0x2,    0x1e,   0x3e,   0x47,   0x8f,   0x22,
-    0x88,   0x0,    0x42,   0xe,    0x10,   0x1e,   0x7f,   0xff,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x4,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0xc2,   0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x3,    0x18,   0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0xa0,   0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x3,    0x7f,   0xff,   0x6,    0xd9,
+	0x21,   0xc,    0xe,    0x32,   0x95,   0x0,    0x0,    0x4,
+	0x60,   0x8e,   0x7c,   0x17,   0xc2,   0x7c,   0xe3,   0x80,
+	0x0,    0x1,    0xc3,   0x82,   0x3c,   0x33,   0x8f,   0xbe,
+	0x39,   0x14,   0x28,   0xa0,   0x82,   0x84,   0x71,   0xe1,
+	0x8f,   0x1c,   0xfa,   0x14,   0x50,   0x14,   0x14,   0x17,
+	0xed,   0xd,    0x21,   0x0,    0x80,   0x0,    0x10,   0x3,
+	0x1,    0x3,    0x1a,   0xc,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x1,
+	0x51,   0x47,   0xc0,   0x3,    0x3e,   0x66,   0xc0,   0x20,
+	0x3,    0xe6,   0x6c,   0x1b,   0x39,   0x9b,   0x10,   0x30,
+	0x0,    0xf,    0x0,    0x0,    0x78,   0x2,    0x28,   0xa1,
+	0x6,    0x60,   0x0,    0x0,    0xf9,   0xce,   0x73,   0xc0,
+	0x8,    0x84,   0x7f,   0xff,   0x2,    0xd9,   0x23,   0x92,
+	0x51,   0x34,   0x4a,   0x0,    0x0,    0x4,    0x91,   0x91,
+	0x4,    0x24,   0x4,    0x5,    0x14,   0x40,   0x0,    0x2,
+	0x25,   0x42,   0x22,   0x4a,   0x48,   0x20,   0x45,   0x14,
+	0x29,   0x20,   0xc6,   0xc4,   0x89,   0x12,   0x48,   0xa2,
+	0x22,   0x14,   0x50,   0x12,   0x22,   0x20,   0x29,   0x4,
+	0x0,    0x80,   0x80,   0x0,    0x10,   0x4,    0x1,    0x0,
+	0x2,    0x4,    0x0,    0x0,    0x0,    0x0,    0x0,    0x1,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x2,    0x48,   0x8,
+	0x10,   0x80,   0x41,   0x0,    0x0,    0x21,   0xe4,   0x10,
+	0x0,    0x0,    0x44,   0x4,    0x10,   0x0,    0x3,    0xd0,
+	0xb3,   0x60,   0x85,   0x80,   0x2,    0x0,    0x0,    0x0,
+	0xc1,   0xbe,   0x2,    0x49,   0x4a,   0x40,   0x8,    0x82,
+	0x7f,   0xff,   0x2,    0x4b,   0xf5,   0x52,   0x91,   0x14,
+	0x4a,   0x10,   0x0,    0x9,    0xa,    0x91,   0x8,    0x44,
+	0x8,    0x5,    0x14,   0x5b,   0x10,   0x22,   0x2a,   0xa5,
+	0x22,   0x82,   0x28,   0x20,   0x81,   0x14,   0x2a,   0x20,
+	0xaa,   0xa5,   0x5,    0x14,   0x28,   0xa0,   0x22,   0x14,
+	0x4a,   0x21,   0x41,   0x40,   0x48,   0x84,   0x0,    0x3e,
+	0xf8,   0xf1,   0xf3,   0xce,   0x7d,   0xf3,   0xa,    0x45,
+	0xee,   0x7c,   0x79,   0xf1,   0xf5,   0x99,   0x90,   0xa2,
+	0x88,   0xa1,   0x45,   0xf2,   0x48,   0x8,    0x0,    0x1e,
+	0x3e,   0x3e,   0x7c,   0xfa,   0x3,    0xc3,   0xc7,   0x8c,
+	0x30,   0xca,   0x1,    0xf3,   0xe5,   0x0,    0x0,    0x0,
+	0x0,    0x2,    0x25,   0x21,   0x3e,   0xc0,   0x0,    0x0,
+	0x8a,   0x49,   0x72,   0xf,    0xc8,   0x9e,   0x7f,   0xff,
+	0x2,    0x91,   0x23,   0xd,    0xa,    0x24,   0x55,   0x10,
+	0x3c,   0x9,    0x8,    0x82,   0x10,   0xa7,   0x96,   0x8,
+	0xe3,   0x5b,   0x20,   0x10,   0x4a,   0xa5,   0x3c,   0x82,
+	0x2f,   0xbc,   0x81,   0xf4,   0x2c,   0x20,   0x92,   0x95,
+	0x5,    0x14,   0x28,   0x9c,   0x22,   0x12,   0x8a,   0x20,
+	0x80,   0x80,   0x88,   0x84,   0x0,    0x42,   0x85,   0xa,
+	0x14,   0x24,   0x85,   0x9,    0xa,    0x85,   0x11,   0x42,
+	0x85,   0xa,    0x16,   0x25,   0x10,   0xa2,   0x88,   0x92,
+	0x44,   0x24,   0x4,    0x7,    0xd0,   0xa1,   0x42,   0x42,
+	0x85,   0xa,    0x4,    0x24,   0x28,   0x44,   0x10,   0x4a,
+	0x38,   0x80,   0x85,   0xf,    0x1e,   0x3c,   0x85,   0x9,
+	0x48,   0xa1,   0x42,   0x47,   0x90,   0xbc,   0xc9,   0xe6,
+	0x4a,   0x11,   0x8,    0xa1,   0x7f,   0xff,   0x2,    0x3,
+	0xf1,   0x83,   0x94,   0x84,   0x44,   0x7c,   0x0,    0x11,
+	0x8,    0x84,   0x9,    0xf0,   0x51,   0x9,    0x10,   0x80,
+	0x47,   0x88,   0x89,   0xcf,   0xa2,   0x82,   0x28,   0x20,
+	0x9d,   0x14,   0x2a,   0x20,   0x82,   0x8d,   0x5,    0xe4,
+	0xaf,   0x2,    0x22,   0x12,   0x85,   0x41,   0x40,   0x81,
+	0x8,    0x44,   0x0,    0x42,   0x85,   0x2,    0x17,   0xe4,
+	0x85,   0x9,    0xb,    0x5,    0x11,   0x42,   0x85,   0xa,
+	0x14,   0x19,   0x10,   0x94,   0x55,   0xc,    0x28,   0x42,
+	0x48,   0x0,    0x90,   0xbf,   0x42,   0x42,   0x85,   0x9,
+	0xe7,   0xe7,   0xef,   0xc4,   0x10,   0x5f,   0x44,   0xe3,
+	0xcf,   0x90,   0xa1,   0x42,   0x85,   0x9,    0x48,   0xa1,
+	0x42,   0x48,   0x50,   0xa2,   0xa8,   0x0,    0x72,   0x11,
+	0xf,    0x21,   0x7f,   0xff,   0x0,    0x1,    0x25,   0x46,
+	0x53,   0x4,    0x40,   0x10,   0x80,   0x20,   0x90,   0x88,
+	0x44,   0x24,   0x51,   0x11,   0x10,   0x80,   0x20,   0x10,
+	0x4,    0x8,    0xa2,   0x4a,   0x48,   0x20,   0x45,   0x15,
+	0x29,   0x20,   0x82,   0x84,   0x89,   0x2,    0x49,   0x22,
+	0x22,   0x11,   0x5,    0x42,   0x20,   0x82,   0x8,    0x24,
+	0x0,    0x42,   0x85,   0xa,    0x14,   0x4,    0x85,   0x9,
+	0xa,    0x85,   0x11,   0x42,   0x85,   0xa,    0x14,   0x5,
+	0x10,   0x94,   0x55,   0x12,   0x28,   0x82,   0x48,   0x0,
+	0x50,   0xa0,   0x42,   0x42,   0x85,   0x8,    0x14,   0x4,
+	0x8,    0x4,    0x10,   0x51,   0x7c,   0x84,   0x89,   0x10,
+	0xa1,   0x42,   0x85,   0x8,    0x85,   0x21,   0x42,   0x48,
+	0x50,   0xa2,   0x9b,   0xef,   0x42,   0x11,   0x8,    0x21,
+	0x14,   0x28,   0x6,    0x1,    0x23,   0x89,   0x8d,   0x2,
+	0x80,   0x11,   0x1,    0xa0,   0x63,   0xdf,   0x38,   0x23,
+	0x8e,   0x10,   0xe1,   0x1b,   0x17,   0xa1,   0x83,   0xc8,
+	0xbc,   0x33,   0x8f,   0xa0,   0x39,   0x14,   0xc8,   0xbe,
+	0x82,   0x84,   0x71,   0x1,    0xa8,   0x9c,   0x21,   0xe1,
+	0x2,    0x84,   0x10,   0x87,   0xec,   0x2c,   0x0,    0x3e,
+	0x78,   0xf1,   0xe3,   0xe4,   0x7d,   0x9,    0x4a,   0x45,
+	0x11,   0x42,   0x79,   0xf1,   0xf4,   0x39,   0xf,    0x8,
+	0x22,   0x21,   0x11,   0xf1,   0x50,   0x3,    0x8f,   0x1f,
+	0x3e,   0x3e,   0x7c,   0xf8,   0xe3,   0xe3,   0xe7,   0xc4,
+	0x10,   0x51,   0x45,   0xf3,   0xe9,   0xcf,   0x1e,   0x3c,
+	0x78,   0xf1,   0x2,    0x1e,   0x3e,   0x47,   0x8f,   0x22,
+	0x88,   0x0,    0x42,   0xe,    0x10,   0x1e,   0x7f,   0xff,
 };
 
 const uint16 COMICSEU_OFFSETS[] = {
-    0x0,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
-    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
-    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
-    0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
-    0x5,     0x8,     0xE,     0x15,    0x1B,    0x22,    0x28,    0x2B,
-    0x2E,    0x31,    0x37,    0x3B,    0x3E,    0x43,    0x46,    0x4B,
-    0x52,    0x56,    0x5B,    0x60,    0x66,    0x6B,    0x70,    0x75,
-    0x7B,    0x80,    0x83,    0x86,    0x8A,    0x8F,    0x93,    0x99,
-    0xA1,    0xA6,    0xAB,    0xB0,    0xB5,    0xBA,    0xBF,    0xC5,
-    0xCA,    0xCC,    0xD1,    0xD6,    0xDB,    0xE1,    0xE6,    0xED,
-    0xF2,    0xF8,    0xFD,    0x102,   0x106,   0x10B,   0x110,   0x116,
-    0x11C,   0x122,   0x128,   0x12B,   0x12F,   0x132,   0x137,   0x139,
-    0x13C,   0x143,   0x148,   0x14D,   0x152,   0x157,   0x15C,   0x163,
-    0x168,   0x16B,   0x170,   0x175,   0x178,   0x181,   0x187,   0x18D,
-    0x194,   0x19B,   0x1A0,   0x1A5,   0x1A9,   0x1B0,   0x1B6,   0x1C0,
-    0x1C7,   0x1CD,   0x1D3,   0x1D7,   0x1D9,   0x1DD,   0x1E2,   0x1E2,
-    0x1E7,   0x1EC,   0x1F1,   0x1F6,   0x1FB,   0x200,   0x205,   0x20A,
-    0x20F,   0x214,   0x219,   0x21E,   0x223,   0x227,   0x22C,   0x231,
-    0x236,   0x23C,   0x243,   0x248,   0x24D,   0x252,   0x257,   0x25C,
-    0x261,   0x267,   0x26D,   0x26D,   0x26D,   0x26D,   0x26D,   0x26D,
-    0x272,   0x276,   0x27B,   0x280,   0x285,   0x28A,   0x290,   0x295,
-    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
-    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
-    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
-    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
-    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
-    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
-    0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
-    0x295,   0x29A,   0x29F,   0x29F,   0x29F,   0x2A6,   0x2AC,   0x2AC,
-    0x2AC,   0x2AC,   0x2AC,   0x2B2,
+	0x0,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+	0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+	0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+	0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,     0x1,
+	0x5,     0x8,     0xE,     0x15,    0x1B,    0x22,    0x28,    0x2B,
+	0x2E,    0x31,    0x37,    0x3B,    0x3E,    0x43,    0x46,    0x4B,
+	0x52,    0x56,    0x5B,    0x60,    0x66,    0x6B,    0x70,    0x75,
+	0x7B,    0x80,    0x83,    0x86,    0x8A,    0x8F,    0x93,    0x99,
+	0xA1,    0xA6,    0xAB,    0xB0,    0xB5,    0xBA,    0xBF,    0xC5,
+	0xCA,    0xCC,    0xD1,    0xD6,    0xDB,    0xE1,    0xE6,    0xED,
+	0xF2,    0xF8,    0xFD,    0x102,   0x106,   0x10B,   0x110,   0x116,
+	0x11C,   0x122,   0x128,   0x12B,   0x12F,   0x132,   0x137,   0x139,
+	0x13C,   0x143,   0x148,   0x14D,   0x152,   0x157,   0x15C,   0x163,
+	0x168,   0x16B,   0x170,   0x175,   0x178,   0x181,   0x187,   0x18D,
+	0x194,   0x19B,   0x1A0,   0x1A5,   0x1A9,   0x1B0,   0x1B6,   0x1C0,
+	0x1C7,   0x1CD,   0x1D3,   0x1D7,   0x1D9,   0x1DD,   0x1E2,   0x1E2,
+	0x1E7,   0x1EC,   0x1F1,   0x1F6,   0x1FB,   0x200,   0x205,   0x20A,
+	0x20F,   0x214,   0x219,   0x21E,   0x223,   0x227,   0x22C,   0x231,
+	0x236,   0x23C,   0x243,   0x248,   0x24D,   0x252,   0x257,   0x25C,
+	0x261,   0x267,   0x26D,   0x26D,   0x26D,   0x26D,   0x26D,   0x26D,
+	0x272,   0x276,   0x27B,   0x280,   0x285,   0x28A,   0x290,   0x295,
+	0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+	0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+	0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+	0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+	0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+	0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+	0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,   0x295,
+	0x295,   0x29A,   0x29F,   0x29F,   0x29F,   0x2A6,   0x2AC,   0x2AC,
+	0x2AC,   0x2AC,   0x2AC,   0x2B2,
 };
 const byte   COMICSEU_DATA[] = {
-    0x0,    0x0,    0x1,    0x0,    0x0,    0x0,    0x10,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x18,   0x40,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0xc6,   0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x2,    0x80,   0x0,    0x30,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x18,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x3f,   0xff,
-    0x6,    0xd9,   0x23,   0x88,   0x98,   0xca,   0x54,   0x0,
-    0x0,    0x46,   0x11,   0x9e,   0x13,   0xc2,   0xf3,   0x8c,
-    0xc0,   0x0,    0xe,    0x1c,   0x13,   0x84,   0xc7,   0xbc,
-    0x64,   0xa1,   0x4a,   0x11,   0x48,   0xc7,   0x8,    0xe3,
-    0x3a,   0x52,   0x8a,   0x28,   0xbe,   0xd1,   0xa4,   0x20,
-    0x10,   0x0,    0x80,   0x60,   0x10,   0xc6,   0x86,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x5,    0x45,   0x8,    0x3,    0x4a,   0x58,
-    0x40,   0x19,   0x2c,   0x49,   0x99,   0x22,   0x0,    0x3,
-    0xcc,   0x96,   0x18,   0x0,    0x45,   0x11,   0x98,   0xc0,
-    0x7,    0x80,   0xe7,   0x3c,   0x0,    0x1,    0xbf,   0x0,
-    0x2,    0x4b,   0xf5,   0x15,   0x24,   0x51,   0x28,   0x0,
-    0x0,    0x49,   0x32,   0x42,   0x22,   0x4,    0x14,   0x52,
-    0x0,    0xbd,   0x11,   0x2a,   0x2a,   0x4a,   0xa4,   0x20,
-    0x94,   0xa1,   0x52,   0x1b,   0x69,   0x24,   0x94,   0x94,
-    0x12,   0x52,   0x8a,   0x28,   0x82,   0x90,   0x80,   0x10,
-    0x10,   0x0,    0x80,   0x80,   0x10,   0x0,    0x82,   0x0,
-    0x0,    0x0,    0x0,    0x0,    0x4,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x9,    0x20,   0x15,   0x20,   0x0,    0x0,
-    0x43,   0x24,   0x0,    0x2,    0x40,   0x40,   0x79,   0xe5,
-    0x12,   0x0,    0x25,   0x89,   0x10,   0x0,    0x0,    0x6,
-    0xe0,   0x1c,   0x94,   0xa4,   0xf9,   0x22,   0x3f,   0xff,
-    0x2,    0x91,   0x23,   0x8a,   0x18,   0x91,   0x54,   0x80,
-    0x0,    0x92,   0x90,   0x8c,   0x53,   0xc8,   0x23,   0x92,
-    0x19,   0x0,    0x82,   0x55,   0x2b,   0x90,   0x94,   0x21,
-    0x4,    0xa1,   0x62,   0x15,   0x5a,   0x14,   0xa2,   0x93,
-    0x12,   0x52,   0x89,   0x45,   0x4,    0x88,   0x80,   0x7,
-    0x9c,   0x73,   0x99,   0xc7,   0x1c,   0xc2,   0x92,   0xee,
-    0x78,   0xe7,   0x87,   0xd6,   0x66,   0x42,   0x8a,   0x22,
-    0x85,   0x17,   0xc9,   0x20,   0x20,   0x6,    0x73,   0x9c,
-    0xe4,   0x18,   0xc6,   0x31,   0x8c,   0xa6,   0x20,   0x89,
-    0xc,    0x63,   0x0,    0x0,    0x29,   0x17,   0x31,   0x80,
-    0x4,    0xa4,   0x97,   0x21,   0x11,   0x21,   0x3f,   0xff,
-    0x2,    0x3,    0xf1,   0x45,   0x26,   0x11,   0x11,   0xc0,
-    0x1,    0x14,   0x91,   0x2,    0xf8,   0x54,   0x24,   0x4e,
-    0xc2,   0x3c,   0x44,   0x4e,   0x4a,   0x50,   0x97,   0x39,
-    0x37,   0xa1,   0x52,   0x11,   0x4a,   0x14,   0xaa,   0xe0,
-    0x92,   0x52,   0xa8,   0x82,   0x8,    0x88,   0x80,   0x8,
-    0x92,   0x84,   0xa4,   0x88,   0x92,   0x42,   0xa2,   0x91,
-    0x45,   0x14,   0x48,   0x58,   0x94,   0x42,   0x8a,   0x22,
-    0x49,   0x10,   0x90,   0x10,   0x15,   0x2f,   0x8,    0x42,
-    0x14,   0x3d,   0xef,   0x10,   0x85,   0x29,   0x31,   0xcf,
-    0x92,   0x94,   0xa5,   0x29,   0x45,   0x10,   0x92,   0x52,
-    0xe6,   0x9e,   0x64,   0xa1,   0x11,   0x27,   0x30,   0xff,
-    0x0,    0x1,    0x23,   0x8a,   0xa4,   0x11,   0x0,    0x87,
-    0xc2,   0x9,    0x12,   0x12,   0x12,   0x52,   0x44,   0x42,
-    0x9,    0x0,    0x80,   0x20,   0x7a,   0x4a,   0xa4,   0x20,
-    0x94,   0xa9,   0x4a,   0x11,   0x49,   0x27,   0x14,   0x94,
-    0x92,   0x54,   0xd9,   0x42,   0x10,   0x84,   0x80,   0x8,
-    0x92,   0x84,   0xb8,   0x88,   0x92,   0x42,   0xc2,   0x91,
-    0x45,   0x14,   0x48,   0x50,   0x64,   0x42,   0x51,   0x54,
-    0x30,   0xa1,   0x9,    0x20,   0x9,    0x28,   0x7b,   0xde,
-    0xf3,   0x21,   0x8,    0x10,   0x85,   0xef,   0x22,   0x89,
-    0x12,   0x94,   0xa5,   0x26,   0x29,   0x17,   0x92,   0x52,
-    0x95,   0x80,   0x7,    0x21,   0x11,   0xc8,   0xbf,   0xff,
-    0x2,    0x0,    0x1,    0x11,   0x1a,   0xa,    0x0,    0x8,
-    0xa,    0x6,    0x3b,   0xcc,   0x11,   0x8c,   0x43,   0x82,
-    0x10,   0x81,   0x4,    0x1e,   0x4b,   0x84,   0xc7,   0xa0,
-    0x64,   0xa6,   0x4b,   0xd1,   0x48,   0xc4,   0xe,    0x93,
-    0x11,   0x88,   0x8a,   0x22,   0x3e,   0xc5,   0x80,   0x7,
-    0x9c,   0x73,   0x9c,   0x87,   0x92,   0x52,   0xa2,   0x91,
-    0x44,   0xe7,   0x88,   0x50,   0x14,   0x42,   0x51,   0x54,
-    0x48,   0xa2,   0x9,    0x20,   0x5,    0xe7,   0x7b,   0xde,
-    0xf0,   0x9c,   0xe7,   0x10,   0x85,   0x29,   0x79,   0xe9,
-    0xcc,   0x63,   0x3d,   0xe2,   0x10,   0xe7,   0x91,   0x9e,
-    0x94,   0xbe,   0xf4,   0x20,   0xe1,   0x7,    0x3f,   0xff,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x4,    0x0,    0xc0,   0x0,    0x0,    0x0,    0x0,
-    0x1,    0xf0,   0x0,    0x0,    0x18,   0x0,    0x0,    0x0,
-    0x3,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0xc,    0x0,    0x0,    0x0,    0x0,
-    0x0,    0x0,    0x0,    0x0,    0x2,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x1,    0x0,    0x0,    0x0,    0x10,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x18,   0x40,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0xc6,   0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x2,    0x80,   0x0,    0x30,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x18,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x3f,   0xff,
+	0x6,    0xd9,   0x23,   0x88,   0x98,   0xca,   0x54,   0x0,
+	0x0,    0x46,   0x11,   0x9e,   0x13,   0xc2,   0xf3,   0x8c,
+	0xc0,   0x0,    0xe,    0x1c,   0x13,   0x84,   0xc7,   0xbc,
+	0x64,   0xa1,   0x4a,   0x11,   0x48,   0xc7,   0x8,    0xe3,
+	0x3a,   0x52,   0x8a,   0x28,   0xbe,   0xd1,   0xa4,   0x20,
+	0x10,   0x0,    0x80,   0x60,   0x10,   0xc6,   0x86,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x5,    0x45,   0x8,    0x3,    0x4a,   0x58,
+	0x40,   0x19,   0x2c,   0x49,   0x99,   0x22,   0x0,    0x3,
+	0xcc,   0x96,   0x18,   0x0,    0x45,   0x11,   0x98,   0xc0,
+	0x7,    0x80,   0xe7,   0x3c,   0x0,    0x1,    0xbf,   0x0,
+	0x2,    0x4b,   0xf5,   0x15,   0x24,   0x51,   0x28,   0x0,
+	0x0,    0x49,   0x32,   0x42,   0x22,   0x4,    0x14,   0x52,
+	0x0,    0xbd,   0x11,   0x2a,   0x2a,   0x4a,   0xa4,   0x20,
+	0x94,   0xa1,   0x52,   0x1b,   0x69,   0x24,   0x94,   0x94,
+	0x12,   0x52,   0x8a,   0x28,   0x82,   0x90,   0x80,   0x10,
+	0x10,   0x0,    0x80,   0x80,   0x10,   0x0,    0x82,   0x0,
+	0x0,    0x0,    0x0,    0x0,    0x4,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x9,    0x20,   0x15,   0x20,   0x0,    0x0,
+	0x43,   0x24,   0x0,    0x2,    0x40,   0x40,   0x79,   0xe5,
+	0x12,   0x0,    0x25,   0x89,   0x10,   0x0,    0x0,    0x6,
+	0xe0,   0x1c,   0x94,   0xa4,   0xf9,   0x22,   0x3f,   0xff,
+	0x2,    0x91,   0x23,   0x8a,   0x18,   0x91,   0x54,   0x80,
+	0x0,    0x92,   0x90,   0x8c,   0x53,   0xc8,   0x23,   0x92,
+	0x19,   0x0,    0x82,   0x55,   0x2b,   0x90,   0x94,   0x21,
+	0x4,    0xa1,   0x62,   0x15,   0x5a,   0x14,   0xa2,   0x93,
+	0x12,   0x52,   0x89,   0x45,   0x4,    0x88,   0x80,   0x7,
+	0x9c,   0x73,   0x99,   0xc7,   0x1c,   0xc2,   0x92,   0xee,
+	0x78,   0xe7,   0x87,   0xd6,   0x66,   0x42,   0x8a,   0x22,
+	0x85,   0x17,   0xc9,   0x20,   0x20,   0x6,    0x73,   0x9c,
+	0xe4,   0x18,   0xc6,   0x31,   0x8c,   0xa6,   0x20,   0x89,
+	0xc,    0x63,   0x0,    0x0,    0x29,   0x17,   0x31,   0x80,
+	0x4,    0xa4,   0x97,   0x21,   0x11,   0x21,   0x3f,   0xff,
+	0x2,    0x3,    0xf1,   0x45,   0x26,   0x11,   0x11,   0xc0,
+	0x1,    0x14,   0x91,   0x2,    0xf8,   0x54,   0x24,   0x4e,
+	0xc2,   0x3c,   0x44,   0x4e,   0x4a,   0x50,   0x97,   0x39,
+	0x37,   0xa1,   0x52,   0x11,   0x4a,   0x14,   0xaa,   0xe0,
+	0x92,   0x52,   0xa8,   0x82,   0x8,    0x88,   0x80,   0x8,
+	0x92,   0x84,   0xa4,   0x88,   0x92,   0x42,   0xa2,   0x91,
+	0x45,   0x14,   0x48,   0x58,   0x94,   0x42,   0x8a,   0x22,
+	0x49,   0x10,   0x90,   0x10,   0x15,   0x2f,   0x8,    0x42,
+	0x14,   0x3d,   0xef,   0x10,   0x85,   0x29,   0x31,   0xcf,
+	0x92,   0x94,   0xa5,   0x29,   0x45,   0x10,   0x92,   0x52,
+	0xe6,   0x9e,   0x64,   0xa1,   0x11,   0x27,   0x30,   0xff,
+	0x0,    0x1,    0x23,   0x8a,   0xa4,   0x11,   0x0,    0x87,
+	0xc2,   0x9,    0x12,   0x12,   0x12,   0x52,   0x44,   0x42,
+	0x9,    0x0,    0x80,   0x20,   0x7a,   0x4a,   0xa4,   0x20,
+	0x94,   0xa9,   0x4a,   0x11,   0x49,   0x27,   0x14,   0x94,
+	0x92,   0x54,   0xd9,   0x42,   0x10,   0x84,   0x80,   0x8,
+	0x92,   0x84,   0xb8,   0x88,   0x92,   0x42,   0xc2,   0x91,
+	0x45,   0x14,   0x48,   0x50,   0x64,   0x42,   0x51,   0x54,
+	0x30,   0xa1,   0x9,    0x20,   0x9,    0x28,   0x7b,   0xde,
+	0xf3,   0x21,   0x8,    0x10,   0x85,   0xef,   0x22,   0x89,
+	0x12,   0x94,   0xa5,   0x26,   0x29,   0x17,   0x92,   0x52,
+	0x95,   0x80,   0x7,    0x21,   0x11,   0xc8,   0xbf,   0xff,
+	0x2,    0x0,    0x1,    0x11,   0x1a,   0xa,    0x0,    0x8,
+	0xa,    0x6,    0x3b,   0xcc,   0x11,   0x8c,   0x43,   0x82,
+	0x10,   0x81,   0x4,    0x1e,   0x4b,   0x84,   0xc7,   0xa0,
+	0x64,   0xa6,   0x4b,   0xd1,   0x48,   0xc4,   0xe,    0x93,
+	0x11,   0x88,   0x8a,   0x22,   0x3e,   0xc5,   0x80,   0x7,
+	0x9c,   0x73,   0x9c,   0x87,   0x92,   0x52,   0xa2,   0x91,
+	0x44,   0xe7,   0x88,   0x50,   0x14,   0x42,   0x51,   0x54,
+	0x48,   0xa2,   0x9,    0x20,   0x5,    0xe7,   0x7b,   0xde,
+	0xf0,   0x9c,   0xe7,   0x10,   0x85,   0x29,   0x79,   0xe9,
+	0xcc,   0x63,   0x3d,   0xe2,   0x10,   0xe7,   0x91,   0x9e,
+	0x94,   0xbe,   0xf4,   0x20,   0xe1,   0x7,    0x3f,   0xff,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x4,    0x0,    0xc0,   0x0,    0x0,    0x0,    0x0,
+	0x1,    0xf0,   0x0,    0x0,    0x18,   0x0,    0x0,    0x0,
+	0x3,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0xc,    0x0,    0x0,    0x0,    0x0,
+	0x0,    0x0,    0x0,    0x0,    0x2,    0x0,    0x0,    0x0,
 };
 
 } // end namespace Noctrpolis
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 14775b92cd1..cae186e8ca6 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -819,7 +819,7 @@ Common::Error NoctropolisEngine::synchronize(Common::Serializer &s) {
 		s.syncAsByte(_establishTable[i]);
 
 	_stil->synchronize(s);
-	
+
 	if (s.isLoading()) // clear minigame state on load
 		initMinigame();
 
diff --git a/engines/access/noctropolis/noctropolis_intro.cpp b/engines/access/noctropolis/noctropolis_intro.cpp
deleted file mode 100644
index def5ca38e46..00000000000
--- a/engines/access/noctropolis/noctropolis_intro.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-#include "access/access.h"
-#include "access/access_noctropolis.h"
-#include "access/timer.h"
-
-namespace Access {
-
-void AccessEngine_Noctropolis::runIntro() {
-
-	static const int lettersX[] = {106, 153, 197, 229, 271, 309, 357, 394, 443, 476, 504};
-	static const int titlesSpriteX[] = {238, 237, 237, 200, 200, 216, 231, 207, 198, 201, 234, 200, 220, 235, 214};
-	static const int titlesSpriteY[] = {108, 112, 125, 128, 128, 124, 128, 115, 131, 130, 102, 112, 112, 102, 112};
-
-	int16 skylineSpriteOfsX1 = 740;
-	int16 skylineSpriteOfsX2 = 1050;
-	int16 skylineSpriteOfsX3 = 1250;
-	int16 skylineSpriteOfsX4 = 1300;
-	int16 skylineSpriteOfsX5 = 1500;
-	int16 titlesSpriteIndex = 0;
-	int lettersMax = 0;
-
-	SpriteResource *sprites = new SpriteResource();
-
-	_timer->set(26, 45);
-	_timer->set(27, 7);
-	_timer->set(28, 240);
-
-	// TODO: Music 98, 1
-	_res->load(_scene, "scene01.ap", 0);
-	_res->load(sprites, "scene01.ap", 1);
-	// TODO: Fade to black and fade to scene palette
-	setPalette(_scene->getPalette());
-	copySceneBackgroundToWorkScreen();
-	copyWorkScreenToVgaScreen();
-
-	_timer->reset(26);
-	_timer->reset(27);
-
-	while (1) {
-
-		if (!_timer->isActive(27)) {
-			_timer->reset(27);
-			if (_cameraX == _scene->getWidth() - _scene->getDisplayWidth() || _leftMouseButton || _rightMouseButton)
-				break;
-
-			scrollCameraRight(2);
-			
-			copySceneBackgroundToWorkScreen();
-			
-			for (int i = 0; i < lettersMax; i++) {
-				_workScreen->drawSprite(sprites, i + 8, lettersX[i], 40);
-			}
-
-			if (!_timer->isActive(26)) {
-				if (lettersMax <= 10) {
-					if (lettersMax == 9)
-						_timer->reset(28);
-					_timer->reset(26);
-					lettersMax++;
-				} else if (titlesSpriteIndex < 25) {
-					_workScreen->drawSprite(sprites, titlesSpriteIndex + 19, titlesSpriteX[titlesSpriteIndex], titlesSpriteY[titlesSpriteIndex]);
-					if (!_timer->isActive(28)) {
-						titlesSpriteIndex++;
-						_timer->reset(26);
-						_timer->reset(28);
-					}
-				}
-
-			}
-			
-			if (skylineSpriteOfsX1 > -100) {
-				_workScreen->drawSprite(sprites, 0, skylineSpriteOfsX1, 60);
-				skylineSpriteOfsX1 -= 5;
-			}
-			if (skylineSpriteOfsX2 > -100) {
-				_workScreen->drawSprite(sprites, 3, skylineSpriteOfsX2, 16);
-				skylineSpriteOfsX2 -= 8;
-			}
-			if (skylineSpriteOfsX4 > -100) {
-				_workScreen->drawSprite(sprites, 1, skylineSpriteOfsX4, 145);
-				skylineSpriteOfsX4 -= 7;
-			}
-			if (skylineSpriteOfsX3 > -100) {
-				_workScreen->drawSprite(sprites, 4, skylineSpriteOfsX3, 115);
-				skylineSpriteOfsX3 -= 5;
-			}
-			if (skylineSpriteOfsX5 > -100) {
-				_workScreen->drawSprite(sprites, 2, skylineSpriteOfsX5, 126);
-				skylineSpriteOfsX5 -= 7;
-			}
-
-			copyWorkScreenToVgaScreen();
-
-		}
-
-		_timer->update();
-		updateEvents();
-		_system->updateScreen();
-	}
-
-	// TODO: Fade to black
-
-	delete sprites;
-
-}
-
-}
diff --git a/engines/access/noctropolis/noctropolis_last_comic.cpp b/engines/access/noctropolis/noctropolis_last_comic.cpp
index 2a709131c41..77109c12ab1 100644
--- a/engines/access/noctropolis/noctropolis_last_comic.cpp
+++ b/engines/access/noctropolis/noctropolis_last_comic.cpp
@@ -1,3 +1,23 @@
+/* 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/>.
+ *
+ */
 
 /* Comic Data from Noctropolis Macos, offset 0x999a0 */
 
@@ -10,2084 +30,2084 @@ namespace Access {
 namespace Noctropolis {
 
 static const struct Polygon poly_p1_b0 = { {
-    { 105, 247 },
-    { 580, 247 },
-    { 580, 321 },
-    { 105, 321 },
+	{ 105, 247 },
+	{ 580, 247 },
+	{ 580, 321 },
+	{ 105, 321 },
 } };
 
 static const struct ComicBox block_p1_b0_boxes[] = {
-    { 0, 246, 105, 318, "IN THE OUTSKIRTS OF NOCTROPOLIS CITY, THREE SILHOUETTES\nDETACH THEMSELVES FROM THE NIGHTSCAPE AND STRUGGLE TO FIND\nFORM BENEATH THE WAN LIGHTING OF THE CITY AMUSEMENT PARK.\nSTARTLED TO ENCOUNTER EACH OTHER, THE PREDATORS PAUSE JUST\nLONG ENOUGH TO DEMAND ANSWERS....", "DANS LA BANLIEUE DE NOCTROPOLIS CITY, TROIS SILHOUETTES\nSE DETACHENT DANS LA NUIT ET LUTTENT POUR PRENDRE FORME\nDANS LA LUMIERE BLAFARDE DU PARC D'ATTRACTIONS DE LA VILLE.\nFASCINES PAR CETTE RENCONTRE, LES PREDATEURS S'ARRETENT A\nPEINE LE TEMPS DE DEMANDER QUELQUES REPONSES...", "EN LA OSCURIDAD DE NOCTROPOLIS, TRES SILUETAS\nINTENTAN ORIENTARSE EN MEDIO DEL PARQUE DE ATRACCIONES.\nABSORTOS EN BUSCARSE ENTRE SI, LOS MERODEADORES NO\nATIENDEN A NADA MAS...", "IN EINEM RANDBEZIRK VON NOCTROPOLIS L\x99""SEN SICH DREI\nSILHOUETTEN AUS DER NACHT UND GEWINNEN M\x9a""HSAM KLARE UMRISSE IN\nDER SCHWACHEN BELEUCHTUNG DES ST\x8e""DTISCHEN VERGN\x9a""GUNGSPARKS. IN\nIHRER \x9a""BERRASCHUNG, SICH HIER ZU TREFFEN, UNTERBRECHEN DIESE\nRAUBTIERE IHREN BEUTEZUG GERADE LANGE GENUG,\nUM EIN PAAR ANTWORTEN ZU VERLANGEN..." },
+	{ 0, 246, 105, 318, "IN THE OUTSKIRTS OF NOCTROPOLIS CITY, THREE SILHOUETTES\nDETACH THEMSELVES FROM THE NIGHTSCAPE AND STRUGGLE TO FIND\nFORM BENEATH THE WAN LIGHTING OF THE CITY AMUSEMENT PARK.\nSTARTLED TO ENCOUNTER EACH OTHER, THE PREDATORS PAUSE JUST\nLONG ENOUGH TO DEMAND ANSWERS....", "DANS LA BANLIEUE DE NOCTROPOLIS CITY, TROIS SILHOUETTES\nSE DETACHENT DANS LA NUIT ET LUTTENT POUR PRENDRE FORME\nDANS LA LUMIERE BLAFARDE DU PARC D'ATTRACTIONS DE LA VILLE.\nFASCINES PAR CETTE RENCONTRE, LES PREDATEURS S'ARRETENT A\nPEINE LE TEMPS DE DEMANDER QUELQUES REPONSES...", "EN LA OSCURIDAD DE NOCTROPOLIS, TRES SILUETAS\nINTENTAN ORIENTARSE EN MEDIO DEL PARQUE DE ATRACCIONES.\nABSORTOS EN BUSCARSE ENTRE SI, LOS MERODEADORES NO\nATIENDEN A NADA MAS...", "IN EINEM RANDBEZIRK VON NOCTROPOLIS L\x99""SEN SICH DREI\nSILHOUETTEN AUS DER NACHT UND GEWINNEN M\x9a""HSAM KLARE UMRISSE IN\nDER SCHWACHEN BELEUCHTUNG DES ST\x8e""DTISCHEN VERGN\x9a""GUNGSPARKS. IN\nIHRER \x9a""BERRASCHUNG, SICH HIER ZU TREFFEN, UNTERBRECHEN DIESE\nRAUBTIERE IHREN BEUTEZUG GERADE LANGE GENUG,\nUM EIN PAAR ANTWORTEN ZU VERLANGEN..." },
 };
 
 static const struct ComicBlock block_p1_0 = { &poly_p1_b0, -1, -1, block_p1_b0_boxes, 1 };
 
 static const struct Polygon poly_p1_b1 = { {
-    { 58, 0 },
-    { 580, 0 },
-    { 580, 399 },
-    { 58, 399 },
+	{ 58, 0 },
+	{ 580, 0 },
+	{ 580, 399 },
+	{ 58, 399 },
 } };
 
 static const struct ComicBox block_p1_b1_boxes[] = {
-    { 0, 246, 10, 50, "A SADISTIC MAGICIAN...\n\nA RUTHLESS GUNSLINGER...\n\nA WANTON CANNIBAL...\n\nEACH SUMMONED FROM DARKNESS BY THE STROKE OF MIDNIGHT.", "UNE MAGICIENNE SADIQUE...\n\nUN MALFRAT CRUEL...\n\nUN CANNIBALE PERVERS...\n\nTOUS ONT  ETE  INVOQUES PAR LES TENEBRES \nLORSQUE MINUIT A SONNE", "UNA MAGA SADICA...\n\nUN ASESINO DESPIADADO...\n\nUNA CANIBAL OBSESA...\n\nLOS TRES PARECEN INVOCADOS POR LAS TINIEBLAS.", "EINE SADISTISCHE MAGIERIN...\n\nEIN GNADENLOSER REVOLVERHELD...\n\nEINE B\x99""SARTIGE KANNIBALIN...\n\nSCHLAG MITTERNACHT WERDEN SIE ALLE AUS DEM DUNKEL GERUFEN..." },
+	{ 0, 246, 10, 50, "A SADISTIC MAGICIAN...\n\nA RUTHLESS GUNSLINGER...\n\nA WANTON CANNIBAL...\n\nEACH SUMMONED FROM DARKNESS BY THE STROKE OF MIDNIGHT.", "UNE MAGICIENNE SADIQUE...\n\nUN MALFRAT CRUEL...\n\nUN CANNIBALE PERVERS...\n\nTOUS ONT  ETE  INVOQUES PAR LES TENEBRES \nLORSQUE MINUIT A SONNE", "UNA MAGA SADICA...\n\nUN ASESINO DESPIADADO...\n\nUNA CANIBAL OBSESA...\n\nLOS TRES PARECEN INVOCADOS POR LAS TINIEBLAS.", "EINE SADISTISCHE MAGIERIN...\n\nEIN GNADENLOSER REVOLVERHELD...\n\nEINE B\x99""SARTIGE KANNIBALIN...\n\nSCHLAG MITTERNACHT WERDEN SIE ALLE AUS DEM DUNKEL GERUFEN..." },
 };
 
 static const struct ComicBlock block_p1_1 = { &poly_p1_b1, 99, 123, block_p1_b1_boxes, 1 };
 
 static const struct ComicBlock page_1_blocks[] = {
-    block_p1_0,
-    block_p1_1,
+	block_p1_0,
+	block_p1_1,
 };
 
 static struct ComicPage page_1 = { "DARK/COMDATA/LEPG1_2.SCN", 98, 41, 1, 0, page_1_blocks, 2 };
 
 static const struct Polygon poly_p2_b0 = { {
-    { 106, 0 },
-    { 146, 0 },
-    { 146, 186 },
-    { 106, 186 },
+	{ 106, 0 },
+	{ 146, 0 },
+	{ 146, 186 },
+	{ 106, 186 },
 } };
 
 static const struct ComicBox block_p2_b0_boxes[] = {
-    { 0, 246, 114, 178, "TOPHAT... A DANGEROUS MIX OF MISCHIEF AND MAGIC.", "TOPHAT... UN DANGEREUX MELANGE DE MECHANCETE ET DE MAGIE.", "LA DIVA... PELIGROSA MEZCLA DE MAGIA Y CRUELDAD.", "MISS ZYLINDERCHEN...EINE GEF\x8e""HRLICHE MISCHUNG AUS\nBOSHEIT UND ZAUBEREI." },
+	{ 0, 246, 114, 178, "TOPHAT... A DANGEROUS MIX OF MISCHIEF AND MAGIC.", "TOPHAT... UN DANGEREUX MELANGE DE MECHANCETE ET DE MAGIE.", "LA DIVA... PELIGROSA MEZCLA DE MAGIA Y CRUELDAD.", "MISS ZYLINDERCHEN...EINE GEF\x8e""HRLICHE MISCHUNG AUS\nBOSHEIT UND ZAUBEREI." },
 };
 
 static const struct ComicBlock block_p2_0 = { &poly_p2_b0, -1, -1, block_p2_b0_boxes, 1 };
 
 static const struct Polygon poly_p2_b1 = { {
-    { 165, 0 },
-    { 207, 0 },
-    { 207, 186 },
-    { 165, 186 },
+	{ 165, 0 },
+	{ 207, 0 },
+	{ 207, 186 },
+	{ 165, 186 },
 } };
 
 static const struct ComicBox block_p2_b1_boxes[] = {
-    { 0, 246, 176, 178, "DESPERADO... A HARDENED GUNMAN WITH A QUICK TEMPER\nAND LIGHTNING DRAW.", "DESPERADO... UN TIREUR ENTRAINE, QUI SE FACHE VITE ET\nDEGAINE ENCORE PLUS VITE.", "DESESPERADO... ASESINO SIEMPRE DISPUESTO A SACAR\nSU ARMA.", "SHOWDOWN... EIN ERFAHRENER PISTOLENSCH\x9a""TZE, DER\nBLITZSCHNELL ZIEHT." },
+	{ 0, 246, 176, 178, "DESPERADO... A HARDENED GUNMAN WITH A QUICK TEMPER\nAND LIGHTNING DRAW.", "DESPERADO... UN TIREUR ENTRAINE, QUI SE FACHE VITE ET\nDEGAINE ENCORE PLUS VITE.", "DESESPERADO... ASESINO SIEMPRE DISPUESTO A SACAR\nSU ARMA.", "SHOWDOWN... EIN ERFAHRENER PISTOLENSCH\x9a""TZE, DER\nBLITZSCHNELL ZIEHT." },
 };
 
 static const struct ComicBlock block_p2_1 = { &poly_p2_b1, -1, -1, block_p2_b1_boxes, 1 };
 
 static const struct Polygon poly_p2_b2 = { {
-    { 224, 0 },
-    { 265, 0 },
-    { 256, 186 },
-    { 224, 186 },
+	{ 224, 0 },
+	{ 265, 0 },
+	{ 256, 186 },
+	{ 224, 186 },
 } };
 
 static const struct ComicBox block_p2_b2_boxes[] = {
-    { 0, 246, 235, 178, "WIDOWMARK... A NYMPHOMANIAC THAT DEVOURS HER MATES.", "WIDOWMARK... UNE NYMPHOMANE QUI DEVORE SES AMANTS.", "VIUDA NEGRA... NINFOMANIACA Y CANIBAL.", "DIE SCHWARZE WITWE...EINE NYMPHOMANIN, DIE IHRE\nGELIEBTEN AUFREISST." },
+	{ 0, 246, 235, 178, "WIDOWMARK... A NYMPHOMANIAC THAT DEVOURS HER MATES.", "WIDOWMARK... UNE NYMPHOMANE QUI DEVORE SES AMANTS.", "VIUDA NEGRA... NINFOMANIACA Y CANIBAL.", "DIE SCHWARZE WITWE...EINE NYMPHOMANIN, DIE IHRE\nGELIEBTEN AUFREISST." },
 };
 
 static const struct ComicBlock block_p2_2 = { &poly_p2_b2, -1, -1, block_p2_b2_boxes, 1 };
 
 static const struct Polygon poly_p2_b3 = { {
-    { 126, 356 },
-    { 253, 356 },
-    { 227, 399 },
-    { 152, 399 },
+	{ 126, 356 },
+	{ 253, 356 },
+	{ 227, 399 },
+	{ 152, 399 },
 } };
 
 static const struct ComicBox block_p2_b3_boxes[] = {
-    { 0, 246, 150, 350, "DARKSHEER... VIGILANTE. SENTINEL. EYES OF THE NIGHT.", "DARKSHEER... LE VIGILE. LA SENTINELLE. LES YEUX DE LA NUIT.", "TENEBROSO... VIGILANTE, CENTINELA.", "DARKSHEER...DER W\x8e""CHTER. DER BESCH\x9a""TZER. DIE AUGEN\nDER NACHT." },
+	{ 0, 246, 150, 350, "DARKSHEER... VIGILANTE. SENTINEL. EYES OF THE NIGHT.", "DARKSHEER... LE VIGILE. LA SENTINELLE. LES YEUX DE LA NUIT.", "TENEBROSO... VIGILANTE, CENTINELA.", "DARKSHEER...DER W\x8e""CHTER. DER BESCH\x9a""TZER. DIE AUGEN\nDER NACHT." },
 };
 
 static const struct ComicBlock block_p2_3 = { &poly_p2_b3, -1, -1, block_p2_b3_boxes, 1 };
 
 static const struct Polygon poly_p2_b4 = { {
-    { 60, 0 },
-    { 317, 0 },
-    { 317, 399 },
-    { 60, 399 },
+	{ 60, 0 },
+	{ 317, 0 },
+	{ 317, 399 },
+	{ 60, 399 },
 } };
 
 static const struct ComicBox block_p2_b4_boxes[] = {
-    { 3, 244, 250, 218, "     TOPHAT? WIDOWMARK! WHAT\nTHE HELL ARE YOU TWO DOIN'\n             HERE?", "      TOPHAT? WIDOWMARK!\n QU'EST-CE QUE VOUS FAITES ICI\n        TOUTES LES DEUX?", "     DIVA? VIUDA NEGRA! QUE\nDEMONIOS HACEIS \n             AQUI?", "           ZYLINDERCHEN?\n SCHWARZE WITWE? WAS ZUR H\x99""LLE\n       MACHT IHR BEIDE HIER?" },
+	{ 3, 244, 250, 218, "     TOPHAT? WIDOWMARK! WHAT\nTHE HELL ARE YOU TWO DOIN'\n             HERE?", "      TOPHAT? WIDOWMARK!\n QU'EST-CE QUE VOUS FAITES ICI\n        TOUTES LES DEUX?", "     DIVA? VIUDA NEGRA! QUE\nDEMONIOS HACEIS \n             AQUI?", "           ZYLINDERCHEN?\n SCHWARZE WITWE? WAS ZUR H\x99""LLE\n       MACHT IHR BEIDE HIER?" },
 };
 
 static const struct ComicBlock block_p2_4 = { &poly_p2_b4, -1, -1, block_p2_b4_boxes, 1 };
 
 static const struct Polygon poly_p2_b5 = { {
-    { 319, 0 },
-    { 377, 0 },
-    { 409, 105 },
-    { 318, 147 },
+	{ 319, 0 },
+	{ 377, 0 },
+	{ 409, 105 },
+	{ 318, 147 },
 } };
 
 static const struct ComicBox block_p2_b5_boxes[] = {
-    { 4, 244, 129, 18, "      YOU LADIES BETTER TALK\n  FAST, 'CAUSE I GOT OTHER\nBUSINESS HERE, AND MY FINGER'S\n  JUST ITCHIN' FOR THE TRIGGER!", "      VOUS FERIEZ MIEUX DE\n  VOUS EXPLIQUER , ET VITE, J'AI\nAUTRE CHOSE A FAIRE, ET MON DOIGT\n   ME DEMANGE SUR LA GACHETTE!", "     MEJOR HABLAD RAPIDO\n  PORQUE TENGO UN ASUNTO\nQUE LIQUIDAR Y MIS DEDOS ESTAN\n ANSIOSOS POR DISPARAR!", "          ALSO, LADIES, IHR\n     REDET BESSER SCHNELL, DENN\nICH HABE HEIR ETWAS ZU ERLEDIGEN,\n       UND MEIN ABZUGSFINGER\n       JUCKT SCHON GEWALTIG!" },
+	{ 4, 244, 129, 18, "      YOU LADIES BETTER TALK\n  FAST, 'CAUSE I GOT OTHER\nBUSINESS HERE, AND MY FINGER'S\n  JUST ITCHIN' FOR THE TRIGGER!", "      VOUS FERIEZ MIEUX DE\n  VOUS EXPLIQUER , ET VITE, J'AI\nAUTRE CHOSE A FAIRE, ET MON DOIGT\n   ME DEMANGE SUR LA GACHETTE!", "     MEJOR HABLAD RAPIDO\n  PORQUE TENGO UN ASUNTO\nQUE LIQUIDAR Y MIS DEDOS ESTAN\n ANSIOSOS POR DISPARAR!", "          ALSO, LADIES, IHR\n     REDET BESSER SCHNELL, DENN\nICH HABE HEIR ETWAS ZU ERLEDIGEN,\n       UND MEIN ABZUGSFINGER\n       JUCKT SCHON GEWALTIG!" },
 };
 
 static const struct ComicBlock block_p2_5 = { &poly_p2_b5, -1, -1, block_p2_b5_boxes, 1 };
 
 static const struct Polygon poly_p2_b6 = { {
-    { 377, 0 },
-    { 530, 0 },
-    { 453, 244 },
+	{ 377, 0 },
+	{ 530, 0 },
+	{ 453, 244 },
 } };
 
 static const struct ComicBox block_p2_b6_boxes[] = {
-    { 2, 244, 240, 132, "     STAY OUT OF MY WAY\nGUNSLINGER! I WAS INVITED!", "     HORS DE MON CHEMIN!\n      JE SUIS INVITEE!", "   APARTATE DE MI\nCAMINO! ESTOY INVITADA!", "       HALT DICH BLO\xe1"" AUS\n  MEINEN ANGELEGENHEITEN RAUS!\n      ICH WURDE EINGELADEN!" },
+	{ 2, 244, 240, 132, "     STAY OUT OF MY WAY\nGUNSLINGER! I WAS INVITED!", "     HORS DE MON CHEMIN!\n      JE SUIS INVITEE!", "   APARTATE DE MI\nCAMINO! ESTOY INVITADA!", "       HALT DICH BLO\xe1"" AUS\n  MEINEN ANGELEGENHEITEN RAUS!\n      ICH WURDE EINGELADEN!" },
 };
 
 static const struct ComicBlock block_p2_6 = { &poly_p2_b6, -1, -1, block_p2_b6_boxes, 1 };
 
 static const struct Polygon poly_p2_b7 = { {
-    { 530, 0 },
-    { 580, 0 },
-    { 580, 145 },
-    { 496, 105 },
+	{ 530, 0 },
+	{ 580, 0 },
+	{ 580, 145 },
+	{ 496, 105 },
 } };
 
 static const struct ComicBox block_p2_b7_boxes[] = {
-    { 2, 244, 320, 108, "     INDEED, MY DEAR. IT WOULD\nSEEM THAT OUR MEETING IS NOT SO\n     CIRCUMSTANTIAL, AFTER ALL.", "      VRAIMENT, TRES CHERE...\n   IL ME SEMBLE QUE NOTRE\n  RENCONTRE N'EST PAS TOUT A FAIT\n       FORTUITE, FINALEMENT...", "  CARAMBA, QUERIDA. PARECE\nQUE NUESTRO ENCUENTRO NO HA\n   SIDO TAN CASUAL.", "           WIRKLICH, MEINE\n     LIEBE? ES SCHEINT, ALS SEI\n    UNSER ZUSAMMENTREFFEN HIER\n         NICHT GANZ ZUF\x8e""LLIG." },
+	{ 2, 244, 320, 108, "     INDEED, MY DEAR. IT WOULD\nSEEM THAT OUR MEETING IS NOT SO\n     CIRCUMSTANTIAL, AFTER ALL.", "      VRAIMENT, TRES CHERE...\n   IL ME SEMBLE QUE NOTRE\n  RENCONTRE N'EST PAS TOUT A FAIT\n       FORTUITE, FINALEMENT...", "  CARAMBA, QUERIDA. PARECE\nQUE NUESTRO ENCUENTRO NO HA\n   SIDO TAN CASUAL.", "           WIRKLICH, MEINE\n     LIEBE? ES SCHEINT, ALS SEI\n    UNSER ZUSAMMENTREFFEN HIER\n         NICHT GANZ ZUF\x8e""LLIG." },
 };
 
 static const struct ComicBlock block_p2_7 = { &poly_p2_b7, -1, -1, block_p2_b7_boxes, 1 };
 
 static const struct Polygon poly_p2_b8 = { {
-    { 349, 232 },
-    { 445, 233 },
-    { 445, 334 },
-    { 339, 334 },
+	{ 349, 232 },
+	{ 445, 233 },
+	{ 445, 334 },
+	{ 339, 334 },
 } };
 
 static const struct ComicBox block_p2_b8_boxes[] = {
-    { 3, 244, 459, 168, "        THAT'S VERY POSSIBLE,\n   DESPERADO. LATELY, DARKSHEER'S\n BEEN QUITE INTENT UPON ELIMINATING\nHIS ENEMIES, AND I DARE SAY WE THREE\nARE THE LAST LEFT. BUT CONSIDER THE\n GORGEOUS POSSIBILITIES IF THE\n    THREE OF US ELECTED TO JOIN\n           AGAINST HIM!", "         C'EST TRES POSSIBLE,\n   DESPERADO. DERNIEREMENT,\n  DARKSHEER A MIS TOUTE SON\n ENERGIE DANS LA DESTRUCTION DE SES\n   ENNEMIS, ET J'OSE DIRE QUE NOUS\n         SOMMES LES DERNIERS.", "             ES MUY PROBABLE,\n  DESESPERADO. TENEBROSO QUIERE\n INTENTAR ELIMINAR A SUS ENEMIGOS\nY ME PARECE QUE SOLO QUEDAMOS \nNOSOTROS TRES. PERO TE IMAGINAS QUE\n PASARIA SI UNIERAMOS NUESTRAS\n    FUERZAS PARA ACABAR CON\n           EL?", "               DAS IST GUT\n        M\x99""GLICH, SHOWDOWN. IN\n     LETZTER ZEIT LEGT DARKSHEER\n   ES DARAUF AN, ALLE SEINE FEINDE\n  AUSZUSCHALTEN. UND ICH WAGE MAL\n    ZU BEHAUPTEN, WIR DREI SIND DIE\n         LETZTEN \x9a""BERLEBENDEN." },
-    { 3, 244, 459, 168, nullptr, "          MAIS PENSEZ AUX\n   POSSIBILITES FASCINANTES QUI\n   S'OFFRENT A NOUS SI NOUS NOUS\n        UNISSONS CONTRE LUI!", nullptr, "       ABER MALT EUCH BLO\xe1""\n   MAL DIE M\x99""GLICHKEITEN AUS,\n    WENN WIR DREI UNS GEGEN IHN\n          VERB\x9a""NDETEN!" },
-    { 4, 244, 137, 260, "     THREE AGAINST ONE... LADY,\nI LIKE THEM ODDS.", "      TROIS CONTRE UN...\n  JE PREFERE L'EQUILIBRE.", "     TRES CONTRA UNO... ME\n GUSTA COMO SUENA.", "       DREI GEGEN EINEN...\nLADY, DAS VERH\x8e""LTNIS GEF\x8e""LLT MIR." },
+	{ 3, 244, 459, 168, "        THAT'S VERY POSSIBLE,\n   DESPERADO. LATELY, DARKSHEER'S\n BEEN QUITE INTENT UPON ELIMINATING\nHIS ENEMIES, AND I DARE SAY WE THREE\nARE THE LAST LEFT. BUT CONSIDER THE\n GORGEOUS POSSIBILITIES IF THE\n    THREE OF US ELECTED TO JOIN\n           AGAINST HIM!", "         C'EST TRES POSSIBLE,\n   DESPERADO. DERNIEREMENT,\n  DARKSHEER A MIS TOUTE SON\n ENERGIE DANS LA DESTRUCTION DE SES\n   ENNEMIS, ET J'OSE DIRE QUE NOUS\n         SOMMES LES DERNIERS.", "             ES MUY PROBABLE,\n  DESESPERADO. TENEBROSO QUIERE\n INTENTAR ELIMINAR A SUS ENEMIGOS\nY ME PARECE QUE SOLO QUEDAMOS \nNOSOTROS TRES. PERO TE IMAGINAS QUE\n PASARIA SI UNIERAMOS NUESTRAS\n    FUERZAS PARA ACABAR CON\n           EL?", "               DAS IST GUT\n        M\x99""GLICH, SHOWDOWN. IN\n     LETZTER ZEIT LEGT DARKSHEER\n   ES DARAUF AN, ALLE SEINE FEINDE\n  AUSZUSCHALTEN. UND ICH WAGE MAL\n    ZU BEHAUPTEN, WIR DREI SIND DIE\n         LETZTEN \x9a""BERLEBENDEN." },
+	{ 3, 244, 459, 168, nullptr, "          MAIS PENSEZ AUX\n   POSSIBILITES FASCINANTES QUI\n   S'OFFRENT A NOUS SI NOUS NOUS\n        UNISSONS CONTRE LUI!", nullptr, "       ABER MALT EUCH BLO\xe1""\n   MAL DIE M\x99""GLICHKEITEN AUS,\n    WENN WIR DREI UNS GEGEN IHN\n          VERB\x9a""NDETEN!" },
+	{ 4, 244, 137, 260, "     THREE AGAINST ONE... LADY,\nI LIKE THEM ODDS.", "      TROIS CONTRE UN...\n  JE PREFERE L'EQUILIBRE.", "     TRES CONTRA UNO... ME\n GUSTA COMO SUENA.", "       DREI GEGEN EINEN...\nLADY, DAS VERH\x8e""LTNIS GEF\x8e""LLT MIR." },
 };
 
 static const struct ComicBlock block_p2_8 = { &poly_p2_b8, -1, -1, block_p2_b8_boxes, 3 };
 
 static const struct Polygon poly_p2_b9 = { {
-    { 318, 147 },
-    { 409, 105 },
-    { 439, 203 },
-    { 349, 232 },
-    { 317, 238 },
+	{ 318, 147 },
+	{ 409, 105 },
+	{ 439, 203 },
+	{ 349, 232 },
+	{ 317, 238 },
 } };
 
 static const struct ComicBox block_p2_b9_boxes[] = {
-    { 1, 244, 451, 160, "     I RECEIVED ONE OF\nDARKSHEER'S PRETTY INVITATIONS\n          AS WELL.", "     J'AI MOI AUSSI RE\x80""U\nUNE DES INVITATIONS DE DARKSHEER.", "   RECIBI UNA DE LAS\nPRECIOSAS INVITACIONES DE\n       TENEBROSO.", "         ICH HABE AUCH EINE\n    VON DARKSHEERS H\x9a""BSCHEN\n      EINLADUNGEN BEKOMMEN." },
+	{ 1, 244, 451, 160, "     I RECEIVED ONE OF\nDARKSHEER'S PRETTY INVITATIONS\n          AS WELL.", "     J'AI MOI AUSSI RE\x80""U\nUNE DES INVITATIONS DE DARKSHEER.", "   RECIBI UNA DE LAS\nPRECIOSAS INVITACIONES DE\n       TENEBROSO.", "         ICH HABE AUCH EINE\n    VON DARKSHEERS H\x9a""BSCHEN\n      EINLADUNGEN BEKOMMEN." },
 };
 
 static const struct ComicBlock block_p2_9 = { &poly_p2_b9, -1, -1, block_p2_b9_boxes, 1 };
 
 static const struct Polygon poly_p2_b10 = { {
-    { 472, 221 },
-    { 566, 222 },
-    { 566, 292 },
-    { 472, 292 },
+	{ 472, 221 },
+	{ 566, 222 },
+	{ 566, 292 },
+	{ 472, 292 },
 } };
 
 static const struct ComicBox block_p2_b10_boxes[] = {
-    { 4, 244, 319, 196, "     ALL RIGHT, WE FIGHT\n  TOGETHER. BUT NO MATTER WHO\n  BRINGS HIM DOWN, I GET\n      DARKSHEER'S BODY.", "      D'ACCORD, NOUS NOUS\n  BATTRONS ENSEMBLE. MAIS JE\n  VEUX LE CORPS DE DARKSHEER,\n    MEME SI CE N'EST PAS\n       MOI QUI LE TUE.", "   ESTA BIEN, PELEAREMOS\n  JUNTOS. PERO NO IMPORTA QUIEN\n  LO MATE. YO QUIERO SU\n    CADAVER PARA MI.", "             IN ORDNUNG,\n    TUN WIR UNS ZUSAMMEN. ABER\n   EGAL, WER IHN FERTIGMACHT, ICH\n         BEKOMME DARKSHEERS\n                K\x99""RPER!" },
+	{ 4, 244, 319, 196, "     ALL RIGHT, WE FIGHT\n  TOGETHER. BUT NO MATTER WHO\n  BRINGS HIM DOWN, I GET\n      DARKSHEER'S BODY.", "      D'ACCORD, NOUS NOUS\n  BATTRONS ENSEMBLE. MAIS JE\n  VEUX LE CORPS DE DARKSHEER,\n    MEME SI CE N'EST PAS\n       MOI QUI LE TUE.", "   ESTA BIEN, PELEAREMOS\n  JUNTOS. PERO NO IMPORTA QUIEN\n  LO MATE. YO QUIERO SU\n    CADAVER PARA MI.", "             IN ORDNUNG,\n    TUN WIR UNS ZUSAMMEN. ABER\n   EGAL, WER IHN FERTIGMACHT, ICH\n         BEKOMME DARKSHEERS\n                K\x99""RPER!" },
 };
 
 static const struct ComicBlock block_p2_10 = { &poly_p2_b10, -1, -1, block_p2_b10_boxes, 1 };
 
 static const struct Polygon poly_p2_b11 = { {
-    { 496, 105 },
-    { 580, 145 },
-    { 580, 233 },
-    { 466, 200 },
+	{ 496, 105 },
+	{ 580, 145 },
+	{ 580, 233 },
+	{ 466, 200 },
 } };
 
 static const struct ComicBox block_p2_b11_boxes[] = {
-    { 2, 244, 312, 188, "     THAT STINKIN' WEASEL SENT\nME ONE TOO... THIS WHOLE DAMN\n    THING STINKS LIKE A SET-UP!", "     CE RAT PUANT M'EN A AUSSI\nENVOYE UNE...TOUTE CETTE HISTOIRE\n        SENT LE COUP MONTE!", "   ESE CERDO ME ENVIO UNA\nTAMBIEN...  ESTE ASUNTO\n   HUELE A ENCERRONA!", "         DIESES STINKENDE\n     WIESEL HAT MIR AUCH EINE\n   GESCHICKT...DAS GANZE RIECHT\n         NACH EINER FALLE." },
+	{ 2, 244, 312, 188, "     THAT STINKIN' WEASEL SENT\nME ONE TOO... THIS WHOLE DAMN\n    THING STINKS LIKE A SET-UP!", "     CE RAT PUANT M'EN A AUSSI\nENVOYE UNE...TOUTE CETTE HISTOIRE\n        SENT LE COUP MONTE!", "   ESE CERDO ME ENVIO UNA\nTAMBIEN...  ESTE ASUNTO\n   HUELE A ENCERRONA!", "         DIESES STINKENDE\n     WIESEL HAT MIR AUCH EINE\n   GESCHICKT...DAS GANZE RIECHT\n         NACH EINER FALLE." },
 };
 
 static const struct ComicBlock block_p2_11 = { &poly_p2_b11, -1, -1, block_p2_b11_boxes, 1 };
 
 static const struct Polygon poly_p2_b12 = { {
-    { 459, 320 },
-    { 583, 320 },
-    { 581, 375 },
-    { 458, 375 },
+	{ 459, 320 },
+	{ 583, 320 },
+	{ 581, 375 },
+	{ 458, 375 },
 } };
 
 static const struct ComicBox block_p2_b12_boxes[] = {
-    { 4, 244, 302, 262, "        OH, WIDOWMARK, HOW\n   DELICIOUSLY MORBID! OF COURSE\n YOU MAY CLAIM YOUR TROPHY. TELL\nME, DON'T YOU BOTH JUST ADORE THE\n   INVITATIONS? I SIMPLY LOVE\n    DARKSHEER'S FLAIR FOR THE\n            DRAMATIC!", "        OH, WIDOWMARK, QUELLE\n   CHARMANTE ATTENTION MORBIDE!\n BIEN SUR, VOUS POURREZ RECLAMER\n  VOTRE TROPHEE. DITES-MOI, VOUS\n   N'ADOREZ PAS LES INVITATIONS?\n    J'ADORE LE FLAIR DE DARKSHEER\n       POUR LES HISTOIRES\n              DRAMATIQUES!", "        QUE DELICIOSAMENTE\n  MORBOSA ERES, VIUDA NEGRA! POR\n SUPUESTO QUE TE DAREMOS EL TROFEO.\n NO OS ENCANTA LA AFICION QUE\n SIENTE TENEBROSO POR LO\n            DRAMATICO?", "         OH, SCHWARZE WITWE,\n    WIE HERRLICH MORBID! NAT\x9a""RLICH\n   SOLLST DU DEINE TROPH\x8e""E HABEN!\nSAGT MAL, GEFALLEN EUCH DARKSHEERS\n    EINLADUNGEN AUCH SO GUT? ICH\n        BEWUNDERE SEIN FLAIR\n          F\x9a""R DAS DRAMATISCHE." },
-    { 2, 244, 270, 342, "     YEAH, WHATEVER, TOPHAT.\nDARK BOY MUST BE WAITIN' INSIDE\n             FOR US....", "     OUI, PEUT-ETRE, TOPHAT.\n     IL DOIT NOUS ATTENDRE A\n         L'INTERIEUR...", "     LO QUE TU DIGAS, DIVA.\nADELANTE. EL CHICO OSCURO DEBE\n    ESTAR ESPERANDO...", "       JAJA, WAS AUCH IMMER,\n    ZYLINDERCHEN. DER FINSTERE\n  BUBE MU\xe1"" WOHL DRINNEN AUF UNS\n              WARTEN..." },
-    { 4, 244, 340, 275, "     THEN LET'S GET GOING...\n       I WANT TO FEED!", "     ALLONS-Y... JE DOIS\n       ME NOURRIR!", "   ENTONCES VANOS...\n       TENGO HAMBRE!", "      DANN LA\xe1""T UNS GEHEN...\n   ICH WILL HEUTE ZEITIG ESSEN!" },
+	{ 4, 244, 302, 262, "        OH, WIDOWMARK, HOW\n   DELICIOUSLY MORBID! OF COURSE\n YOU MAY CLAIM YOUR TROPHY. TELL\nME, DON'T YOU BOTH JUST ADORE THE\n   INVITATIONS? I SIMPLY LOVE\n    DARKSHEER'S FLAIR FOR THE\n            DRAMATIC!", "        OH, WIDOWMARK, QUELLE\n   CHARMANTE ATTENTION MORBIDE!\n BIEN SUR, VOUS POURREZ RECLAMER\n  VOTRE TROPHEE. DITES-MOI, VOUS\n   N'ADOREZ PAS LES INVITATIONS?\n    J'ADORE LE FLAIR DE DARKSHEER\n       POUR LES HISTOIRES\n              DRAMATIQUES!", "        QUE DELICIOSAMENTE\n  MORBOSA ERES, VIUDA NEGRA! POR\n SUPUESTO QUE TE DAREMOS EL TROFEO.\n NO OS ENCANTA LA AFICION QUE\n SIENTE TENEBROSO POR LO\n            DRAMATICO?", "         OH, SCHWARZE WITWE,\n    WIE HERRLICH MORBID! NAT\x9a""RLICH\n   SOLLST DU DEINE TROPH\x8e""E HABEN!\nSAGT MAL, GEFALLEN EUCH DARKSHEERS\n    EINLADUNGEN AUCH SO GUT? ICH\n        BEWUNDERE SEIN FLAIR\n          F\x9a""R DAS DRAMATISCHE." },
+	{ 2, 244, 270, 342, "     YEAH, WHATEVER, TOPHAT.\nDARK BOY MUST BE WAITIN' INSIDE\n             FOR US....", "     OUI, PEUT-ETRE, TOPHAT.\n     IL DOIT NOUS ATTENDRE A\n         L'INTERIEUR...", "     LO QUE TU DIGAS, DIVA.\nADELANTE. EL CHICO OSCURO DEBE\n    ESTAR ESPERANDO...", "       JAJA, WAS AUCH IMMER,\n    ZYLINDERCHEN. DER FINSTERE\n  BUBE MU\xe1"" WOHL DRINNEN AUF UNS\n              WARTEN..." },
+	{ 4, 244, 340, 275, "     THEN LET'S GET GOING...\n       I WANT TO FEED!", "     ALLONS-Y... JE DOIS\n       ME NOURRIR!", "   ENTONCES VANOS...\n       TENGO HAMBRE!", "      DANN LA\xe1""T UNS GEHEN...\n   ICH WILL HEUTE ZEITIG ESSEN!" },
 };
 
 static const struct ComicBlock block_p2_12 = { &poly_p2_b12, -1, -1, block_p2_b12_boxes, 3 };
 
 static const struct ComicBlock page_2_blocks[] = {
-    block_p2_0,
-    block_p2_1,
-    block_p2_2,
-    block_p2_3,
-    block_p2_4,
-    block_p2_5,
-    block_p2_6,
-    block_p2_7,
-    block_p2_8,
-    block_p2_9,
-    block_p2_10,
-    block_p2_11,
-    block_p2_12,
+	block_p2_0,
+	block_p2_1,
+	block_p2_2,
+	block_p2_3,
+	block_p2_4,
+	block_p2_5,
+	block_p2_6,
+	block_p2_7,
+	block_p2_8,
+	block_p2_9,
+	block_p2_10,
+	block_p2_11,
+	block_p2_12,
 };
 
 static struct ComicPage page_2 = { "DARK/COMDATA/LEPG3_4.SCN", 98, 42, 1, 0, page_2_blocks, 13 };
 
 static const struct Polygon poly_p3_b0 = { {
-    { 59, 265 },
-    { 110, 265 },
-    { 79, 232 },
-    { 191, 211 },
-    { 302, 234 },
-    { 273, 266 },
-    { 324, 266 },
-    { 324, 399 },
-    { 59, 399 },
+	{ 59, 265 },
+	{ 110, 265 },
+	{ 79, 232 },
+	{ 191, 211 },
+	{ 302, 234 },
+	{ 273, 266 },
+	{ 324, 266 },
+	{ 324, 399 },
+	{ 59, 399 },
 } };
 
 static const struct ComicBox block_p3_b0_boxes[] = {
-    { 7, 246, 265, 225, "      ONE LITTLE, TWO LITTLE,\nTHREE LITTLE INDIANS...WELCOME TO\n          THRILLSVILLE.", "       UN PETIT INDIEN, DEUX\n   PETITS INDIENS, TROIS PETITS\n    INDIENS... BIENVENUE DANS LA\n         VILLE DES FRISSONS!", "   UN INDIECITO, DOS\nINDIECITOS, TRES INDIECITOS EN\n      EL PARQUECITO.", "          EINS, ZWEI, DREI\n  KLEINE NEGERLEIN...WILLKOMMEN\n          IN RISIKOHAUSEN." },
-    { 3, 244, 234, 318, "       WHERE IS HE?", "\n           OU EST-IL?", "       DONDE ESTA?", "\n             WO IST ER?" },
-    { 3, 244, 254, 319, "      HE'S WATCHING US FROM\nTHE SHADOWS, OF COURSE... HONEY,\n           WE'RE HOME!", "      IL NOUS REGARDE DANS\nL'OMBRE, EVIDEMMENT. CHERIE, NOUS\n         SOMMES CHEZ NOUS!", "    MIRANDONOS DESDE LAS\nSOMBRAS, POR SUPUESTO. AQUI\n    ESTAMOS, QUERIDO!", "        ER BEOBACHTET UNS\n    NAT\x9a""RLICH AUS DEM SCHATTEN.\n     SCHATZ, WIR SIND ZU HAUSE!" },
-    { 3, 244, 272, 325, "      THAT BASTARD'S MORE\n     YELLA THAN I THOUGHT!", "     CE BATARD CRIE PLUS\n   FORT QUE JE NE CROYAIS!", "   ESE BASTARDO ES PEOR\n QUE UNA PATADA EN EL TRASERO!", "        DER BASTARD IST NOCH\n      FEIGER, ALS ICH DACHTE!" },
+	{ 7, 246, 265, 225, "      ONE LITTLE, TWO LITTLE,\nTHREE LITTLE INDIANS...WELCOME TO\n          THRILLSVILLE.", "       UN PETIT INDIEN, DEUX\n   PETITS INDIENS, TROIS PETITS\n    INDIENS... BIENVENUE DANS LA\n         VILLE DES FRISSONS!", "   UN INDIECITO, DOS\nINDIECITOS, TRES INDIECITOS EN\n      EL PARQUECITO.", "          EINS, ZWEI, DREI\n  KLEINE NEGERLEIN...WILLKOMMEN\n          IN RISIKOHAUSEN." },
+	{ 3, 244, 234, 318, "       WHERE IS HE?", "\n           OU EST-IL?", "       DONDE ESTA?", "\n             WO IST ER?" },
+	{ 3, 244, 254, 319, "      HE'S WATCHING US FROM\nTHE SHADOWS, OF COURSE... HONEY,\n           WE'RE HOME!", "      IL NOUS REGARDE DANS\nL'OMBRE, EVIDEMMENT. CHERIE, NOUS\n         SOMMES CHEZ NOUS!", "    MIRANDONOS DESDE LAS\nSOMBRAS, POR SUPUESTO. AQUI\n    ESTAMOS, QUERIDO!", "        ER BEOBACHTET UNS\n    NAT\x9a""RLICH AUS DEM SCHATTEN.\n     SCHATZ, WIR SIND ZU HAUSE!" },
+	{ 3, 244, 272, 325, "      THAT BASTARD'S MORE\n     YELLA THAN I THOUGHT!", "     CE BATARD CRIE PLUS\n   FORT QUE JE NE CROYAIS!", "   ESE BASTARDO ES PEOR\n QUE UNA PATADA EN EL TRASERO!", "        DER BASTARD IST NOCH\n      FEIGER, ALS ICH DACHTE!" },
 };
 
 static const struct ComicBlock block_p3_0 = { &poly_p3_b0, -1, -1, block_p3_b0_boxes, 4 };
 
 static const struct Polygon poly_p3_b1 = { {
-    { 325, 0 },
-    { 479, 0 },
-    { 479, 133 },
-    { 325, 133 },
+	{ 325, 0 },
+	{ 479, 0 },
+	{ 479, 133 },
+	{ 325, 133 },
 } };
 
 static const struct ComicBox block_p3_b1_boxes[] = {
-    { 1, 244, 475, 70, "      YOU-HOO, DARKSHEER!\nCOME OUT, COME OUT WHEREVER\n           YOU ARE!", "      YOU-HOU, DARKSHEER!\n     VENEZ! ALLEZ, SORTEZ\n           DE LA...!", "      HOLA, TENEBROSO!\nDONDEQUIERA QUE ESTES, DEJATE\n           VER!", "       JUHUUH, DARKSHEER!\n   KOMM RAUS, KOMM RAUS, WO\n          IMMER DU BIST!" },
-    { 2, 244, 130, 84, "    SHUDDUP TOPHAT! NO REASON\nTHE WHOLE DAMN WORLD'S GOTTA\n          KNOW WE'RE COMIN'!", "    LA FERME,TOPHAT! LE MONDE\nENTIER N'A PAS BESOIN DE SAVOIR\n        QUE NOUS ARRIVONS!", "    CALLATE, DIVA! NO HAY\nRAZON PARA REVELARLE NUESTRA\n          POSICION!", "             SCHNAUZE, \n     ZYLINDERCHEN! ES MU\xe1"" JA\n NICHT GLEICH DIE GANZE VERDAMMTE\n        WELT H\x99""REN, DA\xe1"" WIR\n              KOMMEN!" },
+	{ 1, 244, 475, 70, "      YOU-HOO, DARKSHEER!\nCOME OUT, COME OUT WHEREVER\n           YOU ARE!", "      YOU-HOU, DARKSHEER!\n     VENEZ! ALLEZ, SORTEZ\n           DE LA...!", "      HOLA, TENEBROSO!\nDONDEQUIERA QUE ESTES, DEJATE\n           VER!", "       JUHUUH, DARKSHEER!\n   KOMM RAUS, KOMM RAUS, WO\n          IMMER DU BIST!" },
+	{ 2, 244, 130, 84, "    SHUDDUP TOPHAT! NO REASON\nTHE WHOLE DAMN WORLD'S GOTTA\n          KNOW WE'RE COMIN'!", "    LA FERME,TOPHAT! LE MONDE\nENTIER N'A PAS BESOIN DE SAVOIR\n        QUE NOUS ARRIVONS!", "    CALLATE, DIVA! NO HAY\nRAZON PARA REVELARLE NUESTRA\n          POSICION!", "             SCHNAUZE, \n     ZYLINDERCHEN! ES MU\xe1"" JA\n NICHT GLEICH DIE GANZE VERDAMMTE\n        WELT H\x99""REN, DA\xe1"" WIR\n              KOMMEN!" },
 };
 
 static const struct ComicBlock block_p3_1 = { &poly_p3_b1, -1, -1, block_p3_b1_boxes, 2 };
 
 static const struct Polygon poly_p3_b2 = { {
-    { 325, 133 },
-    { 479, 133 },
-    { 479, 196 },
-    { 325, 196 },
+	{ 325, 133 },
+	{ 479, 133 },
+	{ 479, 196 },
+	{ 325, 196 },
 } };
 
 static const struct ComicBox block_p3_b2_boxes[] = {
-    { 2, 244, 208, 198, "      THIS IS BULL-DIP! HIDE 'N\n  SEEK IS A SISSY-BOY KID-GAME!\nA MAN OUGHTA DO HIS FIGHTIN' OUT IN\n        THE OPEN, I TELL YA.", "      C'EST NUL! LES JEUX DE\n  CACHE-CACHE, C'EST BON POUR LA\nMATERNELLE! UN HOMME DOIT SAVOIR\n     SE BATTRE A DECOUVERT, MOI\n         JE VOUS LE DIS.", "      ESTO APESTA! SOLO LOS\n  COBARDES SE ESCONDEN ASI!\nUN HOMBRE VERDADERO DA LA CARA Y\n        PELEA.", "\n         DAS IST DOCH ALLES\n        BULLENSCHEI\xe1""E HIER!\n  VERSTECKSPIELEN IST WAS F\x9a""R FEIGE\n   JUNGS! EIN MANN SOLLTE SEINE\n        K\x8e""MPFE GANZ OFFEN\n           AUSTRAGEN!" },
+	{ 2, 244, 208, 198, "      THIS IS BULL-DIP! HIDE 'N\n  SEEK IS A SISSY-BOY KID-GAME!\nA MAN OUGHTA DO HIS FIGHTIN' OUT IN\n        THE OPEN, I TELL YA.", "      C'EST NUL! LES JEUX DE\n  CACHE-CACHE, C'EST BON POUR LA\nMATERNELLE! UN HOMME DOIT SAVOIR\n     SE BATTRE A DECOUVERT, MOI\n         JE VOUS LE DIS.", "      ESTO APESTA! SOLO LOS\n  COBARDES SE ESCONDEN ASI!\nUN HOMBRE VERDADERO DA LA CARA Y\n        PELEA.", "\n         DAS IST DOCH ALLES\n        BULLENSCHEI\xe1""E HIER!\n  VERSTECKSPIELEN IST WAS F\x9a""R FEIGE\n   JUNGS! EIN MANN SOLLTE SEINE\n        K\x8e""MPFE GANZ OFFEN\n           AUSTRAGEN!" },
 };
 
 static const struct ComicBlock block_p3_2 = { &poly_p3_b2, -1, -1, block_p3_b2_boxes, 1 };
 
 static const struct Polygon poly_p3_b3 = { {
-    { 325, 196 },
-    { 478, 196 },
-    { 478, 212 },
-    { 588, 212 },
-    { 588, 290 },
-    { 511, 290 },
-    { 458, 312 },
-    { 325, 229 },
+	{ 325, 196 },
+	{ 478, 196 },
+	{ 478, 212 },
+	{ 588, 212 },
+	{ 588, 290 },
+	{ 511, 290 },
+	{ 458, 312 },
+	{ 325, 229 },
 } };
 
 static const struct ComicBox block_p3_b3_boxes[] = {
-    { 3, 244, 460, 182, "      I KNOW HE'S HERE...\n      I CAN SMELL HIM!", "      JE SAIS QU'IL EST LA... \n      JE LE SENS!", "  SE QUE ESTA AQUI...\n      PUEDO OLERLO!", "       ICH WEI\xe1"", DA\xe1"" ER HIER\n    IST....ICH KANN IHN WITTERN!" },
-    { 4, 244, 247, 139, "      OH, HE'S HERE, LUSCIOUS,\n AND HE'S CLOSER THAN YOU KNOW.\n I DO BELIEVE I'VE FOUND OUR\n          SLIPPERY PREY...", "      OH, IL EST LA, MA BELLE,\n  ET PLUS PRES QUE VOUS NE\n CROYEZ. JE CROIS QUE J'AI TROUVE\n     NOTRE PROIE INSSAISISSABLE.", "      SI, ESTA AQUI,\n Y MAS CERCA DE LO QUE CREES.\n CREO QUE DE UN MOMENTO A\n OTRO SE DEJARA VER...", "        OH, ER IST SOGAR\n   GANZ BESTIMMT HIER, S\x9a""\xe1""E, UND\n N\x8e""HER, ALS DU AHNST. ICH GLAUBE,\n    ICH HABE UNSERE BEUTE\n           ENTDECKT." },
+	{ 3, 244, 460, 182, "      I KNOW HE'S HERE...\n      I CAN SMELL HIM!", "      JE SAIS QU'IL EST LA... \n      JE LE SENS!", "  SE QUE ESTA AQUI...\n      PUEDO OLERLO!", "       ICH WEI\xe1"", DA\xe1"" ER HIER\n    IST....ICH KANN IHN WITTERN!" },
+	{ 4, 244, 247, 139, "      OH, HE'S HERE, LUSCIOUS,\n AND HE'S CLOSER THAN YOU KNOW.\n I DO BELIEVE I'VE FOUND OUR\n          SLIPPERY PREY...", "      OH, IL EST LA, MA BELLE,\n  ET PLUS PRES QUE VOUS NE\n CROYEZ. JE CROIS QUE J'AI TROUVE\n     NOTRE PROIE INSSAISISSABLE.", "      SI, ESTA AQUI,\n Y MAS CERCA DE LO QUE CREES.\n CREO QUE DE UN MOMENTO A\n OTRO SE DEJARA VER...", "        OH, ER IST SOGAR\n   GANZ BESTIMMT HIER, S\x9a""\xe1""E, UND\n N\x8e""HER, ALS DU AHNST. ICH GLAUBE,\n    ICH HABE UNSERE BEUTE\n           ENTDECKT." },
 };
 
 static const struct ComicBlock block_p3_3 = { &poly_p3_b3, -1, -1, block_p3_b3_boxes, 2 };
 
 static const struct Polygon poly_p3_b4 = { {
-    { 325, 229 },
-    { 458, 312 },
-    { 439, 340 },
-    { 446, 373 },
-    { 472, 394 },
-    { 325, 394 },
+	{ 325, 229 },
+	{ 458, 312 },
+	{ 439, 340 },
+	{ 446, 373 },
+	{ 472, 394 },
+	{ 325, 394 },
 } };
 
 static const struct ComicBox block_p3_b4_boxes[] = {
-    { 3, 244, 471, 265, "    SHOW ME A TARGET, TOPHAT!\n I'M GONNA DOUBLE THAT SCUM'S\n       WEIGHT WITH HOT LEAD!", "      MONTREZ-MOI LA CIBLE,\n TOPHAT! QUAND JE L'AURAI CRIBLE\n  DE BALLES, IL PESERA DEUX FOIS\n            PLUS LOURD!", "   DIME DONDE, DIVA!\n MANDARE A ESA PESTE AL\n       CEMENTERIO!", "      WENN DU IHN GEFUNDEN\n    HAST, DANN ZEIG MIR DAS ZIEL,\n ZYLINDERCHEN! ICH VERDOPPLE DAS\n   GEWICHT DIESES ST\x9a""CKS ABSCHAUM\n               MIT BLEI!" },
+	{ 3, 244, 471, 265, "    SHOW ME A TARGET, TOPHAT!\n I'M GONNA DOUBLE THAT SCUM'S\n       WEIGHT WITH HOT LEAD!", "      MONTREZ-MOI LA CIBLE,\n TOPHAT! QUAND JE L'AURAI CRIBLE\n  DE BALLES, IL PESERA DEUX FOIS\n            PLUS LOURD!", "   DIME DONDE, DIVA!\n MANDARE A ESA PESTE AL\n       CEMENTERIO!", "      WENN DU IHN GEFUNDEN\n    HAST, DANN ZEIG MIR DAS ZIEL,\n ZYLINDERCHEN! ICH VERDOPPLE DAS\n   GEWICHT DIESES ST\x9a""CKS ABSCHAUM\n               MIT BLEI!" },
 };
 
 static const struct ComicBlock block_p3_4 = { &poly_p3_b4, -1, -1, block_p3_b4_boxes, 1 };
 
 static const struct Polygon poly_p3_b5 = { {
-    { 458, 312 },
-    { 511, 290 },
-    { 588, 290 },
-    { 588, 394 },
-    { 412, 394 },
-    { 446, 373 },
-    { 439, 340 },
+	{ 458, 312 },
+	{ 511, 290 },
+	{ 588, 290 },
+	{ 588, 394 },
+	{ 412, 394 },
+	{ 446, 373 },
+	{ 439, 340 },
 } };
 
 static const struct ComicBox block_p3_b5_boxes[] = {
-    { 4, 244, 290, 294, "     CERTAINLY, DESPERADO, BUT\nIT IS PERHAPS MORE ACCURATE TO\n     SAY THAT HE HAS FOUND US!", "\n     BIEN SUR, DESPERADO. MAIS\nIL SERAIT PEUT-ETRE PLUS JUSTE DE\n   DIRE QUE C'EST LUI QUI NOUS\n            A TROUVES!", "     SEGURO, DESESPERADO.\nPERO ME TEMO QUE SERA EL QUIEN\n     NOS DESCUBRA PRIMERO!", "\n        SICHER, SHOWDOWN.\n  ABER ES W\x8e""RE VIELLEICHT PR\x8e""ZISER,\n       ZU SAGEN, DA\xe1"" ER UNS\n            GEFUNDEN HAT." },
+	{ 4, 244, 290, 294, "     CERTAINLY, DESPERADO, BUT\nIT IS PERHAPS MORE ACCURATE TO\n     SAY THAT HE HAS FOUND US!", "\n     BIEN SUR, DESPERADO. MAIS\nIL SERAIT PEUT-ETRE PLUS JUSTE DE\n   DIRE QUE C'EST LUI QUI NOUS\n            A TROUVES!", "     SEGURO, DESESPERADO.\nPERO ME TEMO QUE SERA EL QUIEN\n     NOS DESCUBRA PRIMERO!", "\n        SICHER, SHOWDOWN.\n  ABER ES W\x8e""RE VIELLEICHT PR\x8e""ZISER,\n       ZU SAGEN, DA\xe1"" ER UNS\n            GEFUNDEN HAT." },
 };
 
 static const struct ComicBlock block_p3_5 = { &poly_p3_b5, -1, -1, block_p3_b5_boxes, 1 };
 
 static const struct ComicBlock page_3_blocks[] = {
-    block_p3_0,
-    block_p3_1,
-    block_p3_2,
-    block_p3_3,
-    block_p3_4,
-    block_p3_5,
+	block_p3_0,
+	block_p3_1,
+	block_p3_2,
+	block_p3_3,
+	block_p3_4,
+	block_p3_5,
 };
 
 static struct ComicPage page_3 = { "DARK/COMDATA/LEPG5_6.SCN", 98, 43, 0, 0, page_3_blocks, 6 };
 
 static const struct Polygon poly_p4_b0 = { {
-    { 62, 0 },
-    { 147, 137 },
-    { 62, 137 },
+	{ 62, 0 },
+	{ 147, 137 },
+	{ 62, 137 },
 } };
 
 static const struct ComicBox block_p4_b0_boxes[] = {
-    { 1, 244, 135, 92, "     WHAT THE HELL...?", "\n     MAIS QU'EST-CE QUE...?", "     QUE DEMONIOS...?", "\n        WAS ZUR H\x99""LLE...?" },
+	{ 1, 244, 135, 92, "     WHAT THE HELL...?", "\n     MAIS QU'EST-CE QUE...?", "     QUE DEMONIOS...?", "\n        WAS ZUR H\x99""LLE...?" },
 };
 
 static const struct ComicBlock block_p4_0 = { &poly_p4_b0, -1, -1, block_p4_b0_boxes, 1 };
 
 static const struct Polygon poly_p4_b1 = { {
-    { 62, 0 },
-    { 238, 0 },
-    { 147, 137 },
+	{ 62, 0 },
+	{ 238, 0 },
+	{ 147, 137 },
 } };
 
 static const struct ComicBox block_p4_b1_boxes[] = {
-    { 5, 246, 182, 46, "    SHOWTIME KIDDIES...\n        GERONIMO!", "\n  QUE LE SPECTACLE COMMENCE...\n        GERONIMO!", "    HOLA, CHICOS...\n        SORPRESA!", "\n JETZT IST SHOWTIME, KINDERCHEN...\n            GERONIMO!" },
+	{ 5, 246, 182, 46, "    SHOWTIME KIDDIES...\n        GERONIMO!", "\n  QUE LE SPECTACLE COMMENCE...\n        GERONIMO!", "    HOLA, CHICOS...\n        SORPRESA!", "\n JETZT IST SHOWTIME, KINDERCHEN...\n            GERONIMO!" },
 };
 
 static const struct ComicBlock block_p4_1 = { &poly_p4_b1, -1, -1, block_p4_b1_boxes, 1 };
 
 static const struct Polygon poly_p4_b2 = { {
-    { 238, 0 },
-    { 322, 0 },
-    { 322, 137 },
-    { 147, 137 },
+	{ 238, 0 },
+	{ 322, 0 },
+	{ 322, 137 },
+	{ 147, 137 },
 } };
 
 static const struct ComicBox block_p4_b2_boxes[] = {
-    { 4, 244, 15, 28, "    HOO-HOO! BOGEY AT\n     TWELVE O'CLOCK HIGH!", "      HO HO! ENNEMI A\n   12 HEURES DROIT DESSUS!", "    TAN PUNTUAL COMO\n     SIEMPRE!", "             HO-HO!\n     FEINDFLIEGER OBEN AUF\n           ZW\x99""LF UHR!" },
-    { 2, 244, 65, 55, "    IT'S A FREAKIN' AMBUSH!", "\n     C'EST UNE EMBUSCADE!", "    ESTO ES UNA EMBOSCADA!", " \n      DAS IST EIN VERDAMMTER\n           HINTERHALT!" },
+	{ 4, 244, 15, 28, "    HOO-HOO! BOGEY AT\n     TWELVE O'CLOCK HIGH!", "      HO HO! ENNEMI A\n   12 HEURES DROIT DESSUS!", "    TAN PUNTUAL COMO\n     SIEMPRE!", "             HO-HO!\n     FEINDFLIEGER OBEN AUF\n           ZW\x99""LF UHR!" },
+	{ 2, 244, 65, 55, "    IT'S A FREAKIN' AMBUSH!", "\n     C'EST UNE EMBUSCADE!", "    ESTO ES UNA EMBOSCADA!", " \n      DAS IST EIN VERDAMMTER\n           HINTERHALT!" },
 };
 
 static const struct ComicBlock block_p4_2 = { &poly_p4_b2, -1, -1, block_p4_b2_boxes, 2 };
 
 static const struct Polygon poly_p4_b3 = { {
-    { 62, 137 },
-    { 147, 137 },
-    { 147, 399 },
-    { 62, 399 },
+	{ 62, 137 },
+	{ 147, 137 },
+	{ 147, 399 },
+	{ 62, 399 },
 } };
 
 static const struct ComicBox block_p4_b3_boxes[] = {
-    { 3, 246, 161, 233, "    UNHHH... TOUCHDOWN!", "\n    UNHHH... ATTERRISSAGE!", "    EXACTO!", "\n  UFF...DER ADLER IST GELANDET!" },
+	{ 3, 246, 161, 233, "    UNHHH... TOUCHDOWN!", "\n    UNHHH... ATTERRISSAGE!", "    EXACTO!", "\n  UFF...DER ADLER IST GELANDET!" },
 };
 
 static const struct ComicBlock block_p4_3 = { &poly_p4_b3, -1, -1, block_p4_b3_boxes, 1 };
 
 static const struct Polygon poly_p4_b4 = { {
-    { 147, 137 },
-    { 322, 137 },
-    { 322, 399 },
-    { 147, 399 },
+	{ 147, 137 },
+	{ 322, 137 },
+	{ 322, 399 },
+	{ 147, 399 },
 } };
 
 static const struct ComicBox block_p4_b4_boxes[] = {
-    { 2, 244, 5, 193, "    YOU TWO STAY BACK!\n       HE'S MINE!", "       RESTEZ EN ARRIERE!\n         IL EST A MOI!!", "    RETROCEDED!\n       ES MIO!", "        IHR BEIDEN HALTET\n     EUCH RAUS! ER GEH\x99""RT MIR!" },
+	{ 2, 244, 5, 193, "    YOU TWO STAY BACK!\n       HE'S MINE!", "       RESTEZ EN ARRIERE!\n         IL EST A MOI!!", "    RETROCEDED!\n       ES MIO!", "        IHR BEIDEN HALTET\n     EUCH RAUS! ER GEH\x99""RT MIR!" },
 };
 
 static const struct ComicBlock block_p4_4 = { &poly_p4_b4, -1, -1, block_p4_b4_boxes, 1 };
 
 static const struct Polygon poly_p4_b5 = { {
-    { 474, 176 },
-    { 514, 193 },
-    { 528, 226 },
-    { 519, 256 },
-    { 478, 281 },
-    { 440, 269 },
-    { 421, 232 },
-    { 432, 195 },
+	{ 474, 176 },
+	{ 514, 193 },
+	{ 528, 226 },
+	{ 519, 256 },
+	{ 478, 281 },
+	{ 440, 269 },
+	{ 421, 232 },
+	{ 432, 195 },
 } };
 
 static const struct ComicBox block_p4_b5_boxes[] = {
-    { 4, 244, 250, 187, "   HOLY #@*$!! NOOOOOO!", "\n   SAINT #@*$!! NOOOOOON!", "  #@*$!! NOOOOOO!", "\n VERDAMMTE #@*$!! NEEEEEEIIIIN!" },
+	{ 4, 244, 250, 187, "   HOLY #@*$!! NOOOOOO!", "\n   SAINT #@*$!! NOOOOOON!", "  #@*$!! NOOOOOO!", "\n VERDAMMTE #@*$!! NEEEEEEIIIIN!" },
 };
 
 static const struct ComicBlock block_p4_5 = { &poly_p4_b5, -1, -1, block_p4_b5_boxes, 1 };
 
 static const struct Polygon poly_p4_b6 = { {
-    { 322, 103 },
-    { 583, 103 },
-    { 583, 251 },
-    { 457, 282 },
-    { 321, 251 },
+	{ 322, 103 },
+	{ 583, 103 },
+	{ 583, 251 },
+	{ 457, 282 },
+	{ 321, 251 },
 } };
 
 static const struct ComicBox block_p4_b6_boxes[] = {
-    { 3, 244, 464, 108, "     I'M GOING TO EAT YOU\n        UP LITTLE BOY!", "     JE VAIS TE MANGER TOUT\n       CRU, PETIT HOMME!", "    TE DEVORARE,\n        MUCHACHITO!", "        KOMM, KLEINER, ICH\n   HAB' DICH ZUM FRESSEN GERN!" },
-    { 4, 246, 256, 83, "    BE CAREFUL, WIDOWMARK,\nTHIS TIME YOU MAY BITE OFF MORE\n    THAN YOU CAN CHEW!", "     ATTENTION, WIDOWMARK,\n  CETTE FOIS-CI, VOUS RISQUEZ\n    D'AVOIR LES YEUX PLUS GROS\n       QUE LE VENTRE!", "    CUIDADO, VIUDA,\nESTE BOCADO TE PUEDE RESULTAR\n    INDIGESTO!", "     VORSICHT, WITWE, BEI\xe1""\n   NICHT MEHR AB, ALS DU AUCH\n         KAUEN KANNST!" },
+	{ 3, 244, 464, 108, "     I'M GOING TO EAT YOU\n        UP LITTLE BOY!", "     JE VAIS TE MANGER TOUT\n       CRU, PETIT HOMME!", "    TE DEVORARE,\n        MUCHACHITO!", "        KOMM, KLEINER, ICH\n   HAB' DICH ZUM FRESSEN GERN!" },
+	{ 4, 246, 256, 83, "    BE CAREFUL, WIDOWMARK,\nTHIS TIME YOU MAY BITE OFF MORE\n    THAN YOU CAN CHEW!", "     ATTENTION, WIDOWMARK,\n  CETTE FOIS-CI, VOUS RISQUEZ\n    D'AVOIR LES YEUX PLUS GROS\n       QUE LE VENTRE!", "    CUIDADO, VIUDA,\nESTE BOCADO TE PUEDE RESULTAR\n    INDIGESTO!", "     VORSICHT, WITWE, BEI\xe1""\n   NICHT MEHR AB, ALS DU AUCH\n         KAUEN KANNST!" },
 };
 
 static const struct ComicBlock block_p4_6 = { &poly_p4_b6, -1, -1, block_p4_b6_boxes, 2 };
 
 static const struct Polygon poly_p4_b7 = { {
-    { 321, 251 },
-    { 457, 282 },
-    { 457, 399 },
-    { 321, 399 },
+	{ 321, 251 },
+	{ 457, 282 },
+	{ 457, 399 },
+	{ 321, 399 },
 } };
 
 static const struct ComicBox block_p4_b7_boxes[] = {
-    { 3, 244, 444, 243, "   HELP ME! OH MY G-MMMRPH....", "\n   A L'AIDE! OH MON D-MMMRPH...", "   AYUDADME! MI D-MMMRPH....", "\n   HILFE! OH MEIN G-MMMRPH..." },
+	{ 3, 244, 444, 243, "   HELP ME! OH MY G-MMMRPH....", "\n   A L'AIDE! OH MON D-MMMRPH...", "   AYUDADME! MI D-MMMRPH....", "\n   HILFE! OH MEIN G-MMMRPH..." },
 };
 
 static const struct ComicBlock block_p4_7 = { &poly_p4_b7, 99, 58, block_p4_b7_boxes, 1 };
 
 static const struct Polygon poly_p4_b8 = { {
-    { 457, 282 },
-    { 583, 251 },
-    { 583, 399 },
-    { 457, 399 },
+	{ 457, 282 },
+	{ 583, 251 },
+	{ 583, 399 },
+	{ 457, 399 },
 } };
 
 static const struct ComicBox block_p4_b8_boxes[] = {
-    { 4, 244, 283, 260, "    DAMN... WRAPPED HER UP\nSLICK AS SNOT AND DISAPPEARED\n   FASTER 'N SANTY CLAUS!", "    ZUT... IL L'A EMBALLEE\nCOMME UNE MOMIE ET IL A DISPARU\n  PLUS VITE QUE LE PERE NOEL!", "   ESA HA BAJADO CON\nMAS VELOCIDAD QUE\n   PAPA NOEL!", "       VERDAMMT...WICKELT\n    SIE EIN WIE DER BLITZ UND\n VERSCHWINDET SCHNELLER ALS DER\n          WEIHNACHTSMANN!" },
-    { 4, 244, 326, 284, "       IT WOULD SEEM THAT\n  WIDOWMARK GOT IN OVER HER\nHEAD. I'D NO IDEA HE COULD\n USE HIS CLOAK LIKE THAT....", "        IL ME SEMBLE QUE\n  WIDOWMARK S'EST FAIT AVOIR. JE\nNE SAVAIS PAS QU'IL POUVAIT UTILISER\n        SA CAPE COMME \x80""A....", "      PARECE QUE VIUDA\n  NEGRA HA PERDIDO LAS PATAS.\n NO SABIA QUE EL PODIA USAR\n SU CAPA DE ESA FORMA...", "\n         SCHEINT SO, ALS\n   STECKTE DIE WITWE BIS \x9a""BER BEIDE\nOHREN IN DER SACHE DRIN. ICH HATTE\n   JA KEINE AHNUNG, WAS ER MIT\n        SEINEM CAPE ALLES\n        ANSTELLEN KANN..." },
-    { 4, 244, 326, 284, "      I GUESS WE OUGHTA GO\n   FIND 'EM... WE CAN COVER MORE\n GROUND IF WE SPLIT UP. WATCH\n     YOUR BACK, LADY.", "      JE CROIS QU'IL FAUT LES\n   RETROUVER. NOUS COUVRIRONS\n  PLUS DE TERRAIN SI NOUS NOUS\n    SEPARONS. FAITES ATTENTION A\n           VOUS, MADAME.", "     VAYAMOS A POR\n  EL. CUBRIREMOS MAS TERRENO\n SI NOS SEPARAMOS. CUIDA\n    TU ESPALDA.", "        SCH\x8e""TZE, WIR M\x9a""SSEN\n    IHN SUCHEN GEHEN. WIR HABEN\n  BESSERE CHANCEN, WENN WIR UNS\n     AUFTEILEN. HALT' DIR DEN\n        R\x9a""CKEN FREI, LADY..." },
+	{ 4, 244, 283, 260, "    DAMN... WRAPPED HER UP\nSLICK AS SNOT AND DISAPPEARED\n   FASTER 'N SANTY CLAUS!", "    ZUT... IL L'A EMBALLEE\nCOMME UNE MOMIE ET IL A DISPARU\n  PLUS VITE QUE LE PERE NOEL!", "   ESA HA BAJADO CON\nMAS VELOCIDAD QUE\n   PAPA NOEL!", "       VERDAMMT...WICKELT\n    SIE EIN WIE DER BLITZ UND\n VERSCHWINDET SCHNELLER ALS DER\n          WEIHNACHTSMANN!" },
+	{ 4, 244, 326, 284, "       IT WOULD SEEM THAT\n  WIDOWMARK GOT IN OVER HER\nHEAD. I'D NO IDEA HE COULD\n USE HIS CLOAK LIKE THAT....", "        IL ME SEMBLE QUE\n  WIDOWMARK S'EST FAIT AVOIR. JE\nNE SAVAIS PAS QU'IL POUVAIT UTILISER\n        SA CAPE COMME \x80""A....", "      PARECE QUE VIUDA\n  NEGRA HA PERDIDO LAS PATAS.\n NO SABIA QUE EL PODIA USAR\n SU CAPA DE ESA FORMA...", "\n         SCHEINT SO, ALS\n   STECKTE DIE WITWE BIS \x9a""BER BEIDE\nOHREN IN DER SACHE DRIN. ICH HATTE\n   JA KEINE AHNUNG, WAS ER MIT\n        SEINEM CAPE ALLES\n        ANSTELLEN KANN..." },
+	{ 4, 244, 326, 284, "      I GUESS WE OUGHTA GO\n   FIND 'EM... WE CAN COVER MORE\n GROUND IF WE SPLIT UP. WATCH\n     YOUR BACK, LADY.", "      JE CROIS QU'IL FAUT LES\n   RETROUVER. NOUS COUVRIRONS\n  PLUS DE TERRAIN SI NOUS NOUS\n    SEPARONS. FAITES ATTENTION A\n           VOUS, MADAME.", "     VAYAMOS A POR\n  EL. CUBRIREMOS MAS TERRENO\n SI NOS SEPARAMOS. CUIDA\n    TU ESPALDA.", "        SCH\x8e""TZE, WIR M\x9a""SSEN\n    IHN SUCHEN GEHEN. WIR HABEN\n  BESSERE CHANCEN, WENN WIR UNS\n     AUFTEILEN. HALT' DIR DEN\n        R\x9a""CKEN FREI, LADY..." },
 };
 
 static const struct ComicBlock block_p4_8 = { &poly_p4_b8, -1, -1, block_p4_b8_boxes, 3 };
 
 static const struct ComicBlock page_4_blocks[] = {
-    block_p4_0,
-    block_p4_1,
-    block_p4_2,
-    block_p4_3,
-    block_p4_4,
-    block_p4_5,
-    block_p4_6,
-    block_p4_7,
-    block_p4_8,
+	block_p4_0,
+	block_p4_1,
+	block_p4_2,
+	block_p4_3,
+	block_p4_4,
+	block_p4_5,
+	block_p4_6,
+	block_p4_7,
+	block_p4_8,
 };
 
 static struct ComicPage page_4 = { "DARK/COMDATA/LEPG7_8.SCN", 98, 44, 0, 0, page_4_blocks, 9 };
 
 static const struct Polygon poly_p5_b0 = { {
-    { 168, 83 },
-    { 184, 55 },
-    { 185, 63 },
-    { 269, 13 },
-    { 282, 91 },
-    { 191, 89 },
-    { 192, 100 },
+	{ 168, 83 },
+	{ 184, 55 },
+	{ 185, 63 },
+	{ 269, 13 },
+	{ 282, 91 },
+	{ 191, 89 },
+	{ 192, 100 },
 } };
 
 static const struct ComicBox block_p5_b0_boxes[] = {
-    { 2, 246, 22, 70, "     QUIET WITCH, OR I'LL PULL\n  IT ALL OUT! I'M TAKING YOU DOWN,\nWIDOWMARK. IF YOU COOPERATE, I\n       MAY LET YOU LIVE.", "     DU CALME, SORCIERE, OU\n  JE VAIS M'ENERVER! JE SUIS LE\nPLUS FORT, WIDOWMARK. SI VOUS\n   COOPEREZ, JE VOUS LAISSERAI\n         PEUT-ETRE LA VIE SAUVE.", "    QUIETA, BRUJA, O TE HARE\n  CAER! TE TENGO,\nVIUDA NEGRA. SI COOPERAS,\n     QUIZAS VIVAS.", "        RUHE, ELENDE HEXE,\n  ODER ICH REI\xe1""E DIR JEDES DAVON\n EINZELN AUS! H\x99""R ZU, WITWE, WENN\n     DU MIR HILFST, LASSE ICH DICH\n         VIELLEICHT AM LEBEN!" },
+	{ 2, 246, 22, 70, "     QUIET WITCH, OR I'LL PULL\n  IT ALL OUT! I'M TAKING YOU DOWN,\nWIDOWMARK. IF YOU COOPERATE, I\n       MAY LET YOU LIVE.", "     DU CALME, SORCIERE, OU\n  JE VAIS M'ENERVER! JE SUIS LE\nPLUS FORT, WIDOWMARK. SI VOUS\n   COOPEREZ, JE VOUS LAISSERAI\n         PEUT-ETRE LA VIE SAUVE.", "    QUIETA, BRUJA, O TE HARE\n  CAER! TE TENGO,\nVIUDA NEGRA. SI COOPERAS,\n     QUIZAS VIVAS.", "        RUHE, ELENDE HEXE,\n  ODER ICH REI\xe1""E DIR JEDES DAVON\n EINZELN AUS! H\x99""R ZU, WITWE, WENN\n     DU MIR HILFST, LASSE ICH DICH\n         VIELLEICHT AM LEBEN!" },
 };
 
 static const struct ComicBlock block_p5_0 = { &poly_p5_b0, -1, -1, block_p5_b0_boxes, 1 };
 
 static const struct Polygon poly_p5_b1 = { {
-    { 59, 2 },
-    { 322, 2 },
-    { 322, 116 },
-    { 230, 116 },
-    { 230, 133 },
-    { 186, 133 },
-    { 186, 128 },
-    { 59, 128 },
+	{ 59, 2 },
+	{ 322, 2 },
+	{ 322, 116 },
+	{ 230, 116 },
+	{ 230, 133 },
+	{ 186, 133 },
+	{ 186, 128 },
+	{ 59, 128 },
 } };
 
 static const struct ComicBox block_p5_b1_boxes[] = {
-    { 3, 244, 200, 30, "    OUCH! MY HAIR...!", "\n      AIE! MES CHEVEUX!", "    OH! MI PELO...!", "\n         AUA! MEINE HAARE...!" },
+	{ 3, 244, 200, 30, "    OUCH! MY HAIR...!", "\n      AIE! MES CHEVEUX!", "    OH! MI PELO...!", "\n         AUA! MEINE HAARE...!" },
 };
 
 static const struct ComicBlock block_p5_1 = { &poly_p5_b1, -1, -1, block_p5_b1_boxes, 1 };
 
 static const struct Polygon poly_p5_b2 = { {
-    { 59, 128 },
-    { 186, 128 },
-    { 186, 194 },
-    { 59, 194 },
+	{ 59, 128 },
+	{ 186, 128 },
+	{ 186, 194 },
+	{ 59, 194 },
 } };
 
 static const struct ComicBox block_p5_b2_boxes[] = {
-    { 7, 244, 215, 85, "      HAH, FOUND YA WEASEL!\n MUCH AS I'D LIKE TO SEE WHAT\nHE'D DO TA WIDOWMARK, NOW'S THE\n  PERFECT TIME TA CALL HIM OUT...", "      HAH, JE T'AI TROUVE,\n SALE PUTOIS! J'AIMERAIS BEAUCOUP\nVOIR CE QU'IL VA FAIRE A WIDOWMARK,\n  MAIS C'EST LE MOMENT PARFAIT...", "      ESTA ENTRETENIDO.\n AUNQUE ME GUSTARIA VER LO\nQUE LE HARA A VIUDA NEGRA, ES\n  EL MOMENTO PERFECTO...", "        HA, DA IST DIE RATTE!\n    SO GERNE ICH AUCH SEHEN\n  W\x9a""RDE, WAS ER MIT DER SCHWARZEN\n WITWE ANSTELLT, JETZT IST DIE RICHTIGE\n      ZEIT, DIE SACHE HINTER\n          UNS ZU BRINGEN..." },
+	{ 7, 244, 215, 85, "      HAH, FOUND YA WEASEL!\n MUCH AS I'D LIKE TO SEE WHAT\nHE'D DO TA WIDOWMARK, NOW'S THE\n  PERFECT TIME TA CALL HIM OUT...", "      HAH, JE T'AI TROUVE,\n SALE PUTOIS! J'AIMERAIS BEAUCOUP\nVOIR CE QU'IL VA FAIRE A WIDOWMARK,\n  MAIS C'EST LE MOMENT PARFAIT...", "      ESTA ENTRETENIDO.\n AUNQUE ME GUSTARIA VER LO\nQUE LE HARA A VIUDA NEGRA, ES\n  EL MOMENTO PERFECTO...", "        HA, DA IST DIE RATTE!\n    SO GERNE ICH AUCH SEHEN\n  W\x9a""RDE, WAS ER MIT DER SCHWARZEN\n WITWE ANSTELLT, JETZT IST DIE RICHTIGE\n      ZEIT, DIE SACHE HINTER\n          UNS ZU BRINGEN..." },
 };
 
 static const struct ComicBlock block_p5_2 = { &poly_p5_b2, -1, -1, block_p5_b2_boxes, 1 };
 
 static const struct Polygon poly_p5_b3 = { {
-    { 186, 134 },
-    { 235, 134 },
-    { 235, 194 },
-    { 186, 194 },
+	{ 186, 134 },
+	{ 235, 134 },
+	{ 235, 194 },
+	{ 186, 194 },
 } };
 
 static const struct ComicBox block_p5_b3_boxes[] = {
-    { 3, 244, 275, 80, "    LET THE LADY GO,\nDUNG-LICKER! YOU N' I GOT\n  BUSINESS TA TEND TO!", "    LAISSE PARTIR LA\nFEMME, LECHE-BOUSE! TOI ET MOI,\n  IL FAUT QU'ON DISCUTE!", "   QUE LA DAMA SE\nLAS ARREGLE COMO PUEDA. YO\n  TENGO ALGO QUE HACER.", "      LA\xe1"" DIE LADY GEHEN,\n  DUNGFRESSER! DU UND ICH, WIR\n    HABEN WAS ZU ERLEDIGEN!" },
+	{ 3, 244, 275, 80, "    LET THE LADY GO,\nDUNG-LICKER! YOU N' I GOT\n  BUSINESS TA TEND TO!", "    LAISSE PARTIR LA\nFEMME, LECHE-BOUSE! TOI ET MOI,\n  IL FAUT QU'ON DISCUTE!", "   QUE LA DAMA SE\nLAS ARREGLE COMO PUEDA. YO\n  TENGO ALGO QUE HACER.", "      LA\xe1"" DIE LADY GEHEN,\n  DUNGFRESSER! DU UND ICH, WIR\n    HABEN WAS ZU ERLEDIGEN!" },
 };
 
 static const struct ComicBlock block_p5_3 = { &poly_p5_b3, -1, -1, block_p5_b3_boxes, 1 };
 
 static const struct Polygon poly_p5_b4 = { {
-    { 230, 116 },
-    { 322, 116 },
-    { 322, 249 },
-    { 230, 249 },
+	{ 230, 116 },
+	{ 322, 116 },
+	{ 322, 249 },
+	{ 230, 249 },
 } };
 
 static const struct ComicBox block_p5_b4_boxes[] = {
-    { 4, 246, 71, 96, "    WHA...? OOOOPH!", "\n       QU...? OOOOUPH!", "    QUE...? OOOOH!", "\n           WAS...? UFF!" },
-    { 3, 244, 318, 113, "    I'M GOING TO NAIL YOU\nJUST LIKE THIS FOR EVERY STRAND\n      OF HAIR I LOST!", "    JE VAIS TE DONNER UN\nCOUP POUR CHAQUE CHEVEU QUE\n         J'AI PERDU!", "    TE HARE UNA HERIDA\nCOMO ESTA POR CADA CABELLO QUE\n      PERDI!", "    F\x9a""R JEDE EINZELNE LOCKE,\nDIE ICH VERLOREN HABE, ZAHLE ICH\n           ES DIR HEIM!" },
+	{ 4, 246, 71, 96, "    WHA...? OOOOPH!", "\n       QU...? OOOOUPH!", "    QUE...? OOOOH!", "\n           WAS...? UFF!" },
+	{ 3, 244, 318, 113, "    I'M GOING TO NAIL YOU\nJUST LIKE THIS FOR EVERY STRAND\n      OF HAIR I LOST!", "    JE VAIS TE DONNER UN\nCOUP POUR CHAQUE CHEVEU QUE\n         J'AI PERDU!", "    TE HARE UNA HERIDA\nCOMO ESTA POR CADA CABELLO QUE\n      PERDI!", "    F\x9a""R JEDE EINZELNE LOCKE,\nDIE ICH VERLOREN HABE, ZAHLE ICH\n           ES DIR HEIM!" },
 };
 
 static const struct ComicBlock block_p5_4 = { &poly_p5_b4, 99, 25, block_p5_b4_boxes, 2 };
 
 static const struct Polygon poly_p5_b5 = { {
-    { 59, 194 },
-    { 92, 199 },
-    { 111, 221 },
-    { 108, 258 },
-    { 98, 258 },
-    { 102, 268 },
-    { 59, 268 },
+	{ 59, 194 },
+	{ 92, 199 },
+	{ 111, 221 },
+	{ 108, 258 },
+	{ 98, 258 },
+	{ 102, 268 },
+	{ 59, 268 },
 } };
 
 static const struct ComicBox block_p5_b5_boxes[] = {
-    { 3, 246, 145, 190, "    GETTING AWAY! WIDOWMARK'S\n  GETTING AWAY....", "       ELLE S'ENFUIT!\n     WIDOWMARK S'ENFUIT...", "    ADIOS, VIUDA NEGRA!", "         SIE ENTKOMMT!\n     DIE SCHWARZE WITWE\n         ENTKOMMT MIR!" },
+	{ 3, 246, 145, 190, "    GETTING AWAY! WIDOWMARK'S\n  GETTING AWAY....", "       ELLE S'ENFUIT!\n     WIDOWMARK S'ENFUIT...", "    ADIOS, VIUDA NEGRA!", "         SIE ENTKOMMT!\n     DIE SCHWARZE WITWE\n         ENTKOMMT MIR!" },
 };
 
 static const struct ComicBlock block_p5_5 = { &poly_p5_b5, -1, -1, block_p5_b5_boxes, 1 };
 
 static const struct Polygon poly_p5_b6 = { {
-    { 98, 258 },
-    { 181, 257 },
-    { 138, 398 },
+	{ 98, 258 },
+	{ 181, 257 },
+	{ 138, 398 },
 } };
 
 static const struct ComicBox block_p5_b6_boxes[] = {
-    { 3, 244, 198, 273, "    TIME TO DIE, RATMEAT!\n       MAKE YER MOVE!", "      TON HEURE EST VENUE,\n  RAT PUANT! A TOI DE JOUER!", "  ES HORA DE MORIR, RATA!\n      DEFIENDETE!", "       ZEIT ZUM STERBEN,\nRATTENGESICHT! MACH DEINEN ZUG!" },
+	{ 3, 244, 198, 273, "    TIME TO DIE, RATMEAT!\n       MAKE YER MOVE!", "      TON HEURE EST VENUE,\n  RAT PUANT! A TOI DE JOUER!", "  ES HORA DE MORIR, RATA!\n      DEFIENDETE!", "       ZEIT ZUM STERBEN,\nRATTENGESICHT! MACH DEINEN ZUG!" },
 };
 
 static const struct ComicBlock block_p5_6 = { &poly_p5_b6, -1, -1, block_p5_b6_boxes, 1 };
 
 static const struct Polygon poly_p5_b7 = { {
-    { 59, 194 },
-    { 230, 194 },
-    { 230, 268 },
-    { 59, 268 },
+	{ 59, 194 },
+	{ 230, 194 },
+	{ 230, 268 },
+	{ 59, 268 },
 } };
 
 static const struct ComicBox block_p5_b7_boxes[] = {
-    { 5, 246, 220, 247, "  ...LET HER GO...CONCENTRATE!\nDON'T GIVE DESPERADO THE TIME HE\n           NEEDS.", "    ... LA LAISSER PARTIR...\n  SE CONCENTRER! NE PAS LAISSER\n     A DESPERADO LE TEMPS DONT\n         IL A BESOIN.", "  ...AHORA DEBO\nCONCENTRARME Y NO DARLE TIEMPO\n  A DESESPERADO.", "      ... LA\xe1"" SIE GEHEN... \n  KONZENTRIER' DICH! DU DARFST\n SHOWDOWN NICHT DIE ZEIT GEBEN,\n         DIE ER BRAUCHT." },
+	{ 5, 246, 220, 247, "  ...LET HER GO...CONCENTRATE!\nDON'T GIVE DESPERADO THE TIME HE\n           NEEDS.", "    ... LA LAISSER PARTIR...\n  SE CONCENTRER! NE PAS LAISSER\n     A DESPERADO LE TEMPS DONT\n         IL A BESOIN.", "  ...AHORA DEBO\nCONCENTRARME Y NO DARLE TIEMPO\n  A DESESPERADO.", "      ... LA\xe1"" SIE GEHEN... \n  KONZENTRIER' DICH! DU DARFST\n SHOWDOWN NICHT DIE ZEIT GEBEN,\n         DIE ER BRAUCHT." },
 };
 
 static const struct ComicBlock block_p5_7 = { &poly_p5_b7, -1, -1, block_p5_b7_boxes, 1 };
 
 static const struct Polygon poly_p5_b8 = { {
-    { 323, 0 },
-    { 478, 0 },
-    { 503, 97 },
-    { 323, 97 },
+	{ 323, 0 },
+	{ 478, 0 },
+	{ 503, 97 },
+	{ 323, 97 },
 } };
 
 static const struct ComicBox block_p5_b8_boxes[] = {
-    { 6, 246, 174, 66, "    I'M HIT! NEVER MIND -\nKEEP FOCUSED! THE GRENADE HAS\n    GOT TO HIT CLOSE....", "    JE SUIS TOUCHE! RESTER\nCONCENTRE! LA GRENADE DOIT\n    TOMBER ASSEZ PRES... ", "   ESTOY HERIDO! PERO NO\nIMPORTA. LA GRANADA GOLPEARA\n    Y...", "    ICH BIN GETROFFEN...EGAL,\nKONZENTRATION! DIE GRANATE MU\xe1""\n   DICHT NEBEN IHM TREFFEN..." },
+	{ 6, 246, 174, 66, "    I'M HIT! NEVER MIND -\nKEEP FOCUSED! THE GRENADE HAS\n    GOT TO HIT CLOSE....", "    JE SUIS TOUCHE! RESTER\nCONCENTRE! LA GRENADE DOIT\n    TOMBER ASSEZ PRES... ", "   ESTOY HERIDO! PERO NO\nIMPORTA. LA GRANADA GOLPEARA\n    Y...", "    ICH BIN GETROFFEN...EGAL,\nKONZENTRATION! DIE GRANATE MU\xe1""\n   DICHT NEBEN IHM TREFFEN..." },
 };
 
 static const struct ComicBlock block_p5_8 = { &poly_p5_b8, 99, 13, block_p5_b8_boxes, 1 };
 
 static const struct Polygon poly_p5_b9 = { {
-    { 478, 0 },
-    { 588, 0 },
-    { 588, 97 },
-    { 503, 97 },
+	{ 478, 0 },
+	{ 588, 0 },
+	{ 588, 97 },
+	{ 503, 97 },
 } };
 
 static const struct ComicBox block_p5_b9_boxes[] = {
-    { 6, 246, 356, 52, "    DAMN, HURTS LIKE THE\nMOTHER OF ALL PAIN! LET IT BLEED.", "         AIE, \x80""A FAIT\n      TRES MAL! JE SAIGNE.", "   MALDITA SEA, COMO\nDUELE! NO DEBO PENSAR EN ESO.", "    VERDAMMT, DAS SCHMERZT\n  WIE VERR\x9a""CKT. EGAL, LA\xe1"" ES\n          BLUTEN..." },
+	{ 6, 246, 356, 52, "    DAMN, HURTS LIKE THE\nMOTHER OF ALL PAIN! LET IT BLEED.", "         AIE, \x80""A FAIT\n      TRES MAL! JE SAIGNE.", "   MALDITA SEA, COMO\nDUELE! NO DEBO PENSAR EN ESO.", "    VERDAMMT, DAS SCHMERZT\n  WIE VERR\x9a""CKT. EGAL, LA\xe1"" ES\n          BLUTEN..." },
 };
 
 static const struct ComicBlock block_p5_9 = { &poly_p5_b9, -1, -1, block_p5_b9_boxes, 1 };
 
 static const struct Polygon poly_p5_b10 = { {
-    { 323, 97 },
-    { 453, 97 },
-    { 453, 206 },
-    { 323, 206 },
+	{ 323, 97 },
+	{ 453, 97 },
+	{ 453, 206 },
+	{ 323, 206 },
 } };
 
 static const struct ComicBox block_p5_b10_boxes[] = {
-    { 8, 244, 156, 69, "     OH, $%#@! I'M BLIND AS A\n  FRIGGIN' BAT! WHAT THE HELL'S HE\n      PUT IN THOSE DAMNED\n          GRENADES?!", "     OH, $%#@! JE SUIS AUSSI\n  AVEUGLE QU'UNE TAUPE! MAIS\n  QU'EST-CE QU'IL PEUT BIEN METTRE\n    DANS CES MAUDITES GRENADES?", "    $%#@! ESTOY CIEGO\n  COMO UNA RATA! QUE DEMONIOS\n      PUSO EN ESA\n          GRANADA?!", "       OH, $%#@! ICH BIN\n    BLIND WIE 'NE VERFLUCHTE\n  FLEDERMAUS! WAS ZUR H\x99""LLE HAT\n     ER IN DIESE VERDAMMTEN\n        GRANATEN GEPACKT?" },
+	{ 8, 244, 156, 69, "     OH, $%#@! I'M BLIND AS A\n  FRIGGIN' BAT! WHAT THE HELL'S HE\n      PUT IN THOSE DAMNED\n          GRENADES?!", "     OH, $%#@! JE SUIS AUSSI\n  AVEUGLE QU'UNE TAUPE! MAIS\n  QU'EST-CE QU'IL PEUT BIEN METTRE\n    DANS CES MAUDITES GRENADES?", "    $%#@! ESTOY CIEGO\n  COMO UNA RATA! QUE DEMONIOS\n      PUSO EN ESA\n          GRANADA?!", "       OH, $%#@! ICH BIN\n    BLIND WIE 'NE VERFLUCHTE\n  FLEDERMAUS! WAS ZUR H\x99""LLE HAT\n     ER IN DIESE VERDAMMTEN\n        GRANATEN GEPACKT?" },
 };
 
 static const struct ComicBlock block_p5_10 = { &poly_p5_b10, 99, 10, block_p5_b10_boxes, 1 };
 
 static const struct Polygon poly_p5_b11 = { {
-    { 453, 97 },
-    { 588, 97 },
-    { 588, 143 },
-    { 454, 143 },
+	{ 453, 97 },
+	{ 588, 97 },
+	{ 588, 143 },
+	{ 454, 143 },
 } };
 
 static const struct ComicBox block_p5_b11_boxes[] = {
-    { 6, 244, 303, 150, "    CAN'T LET HIM CIRCLE\n       'ROUND ON ME!", "    JE NE PEUX PAS LE\nLAISSER TOURNER AUTOUR DE MOI!", "   NO DEBO DEJAR QUE ME\n       SORPRENDA!", "      ICH DARF IHN NICHT IN\n     MEINEN R\x9a""CKEN LASSEN!" },
-    { 2, 244, 303, 155, "      YER TRICKS DON'T MAKE\n NO DIFFERENCE! SO COME 'N GET\nME YA FREAKIN' DEVIL, 'CAUSE\n   I'M GONNA BLOW YA TO HELL!", "         VOS RUSES NE\n   M'IMPRESSIONNENT PAS! ALORS\nVENEZ ME CHERCHER, SALE DEMON,\n     JE VAIS VOUS RENVOYER\n           EN ENFER!", "    TUS TRUCOS NO TE SERVIRAN\n DE NADA! VEN A DONDE PUEDA\nVERTE PARA VOLARTE LA CABEZA", "      DEINE TRICKS HELFEN DIR\n AUCH NICHT! LOS, KOMM DOCH HER\nUND HOL' MICH, DU TEUFEL, DAMIT ICH\n   DICH ZUR H\x99""LLE PUSTEN KANN!" },
+	{ 6, 244, 303, 150, "    CAN'T LET HIM CIRCLE\n       'ROUND ON ME!", "    JE NE PEUX PAS LE\nLAISSER TOURNER AUTOUR DE MOI!", "   NO DEBO DEJAR QUE ME\n       SORPRENDA!", "      ICH DARF IHN NICHT IN\n     MEINEN R\x9a""CKEN LASSEN!" },
+	{ 2, 244, 303, 155, "      YER TRICKS DON'T MAKE\n NO DIFFERENCE! SO COME 'N GET\nME YA FREAKIN' DEVIL, 'CAUSE\n   I'M GONNA BLOW YA TO HELL!", "         VOS RUSES NE\n   M'IMPRESSIONNENT PAS! ALORS\nVENEZ ME CHERCHER, SALE DEMON,\n     JE VAIS VOUS RENVOYER\n           EN ENFER!", "    TUS TRUCOS NO TE SERVIRAN\n DE NADA! VEN A DONDE PUEDA\nVERTE PARA VOLARTE LA CABEZA", "      DEINE TRICKS HELFEN DIR\n AUCH NICHT! LOS, KOMM DOCH HER\nUND HOL' MICH, DU TEUFEL, DAMIT ICH\n   DICH ZUR H\x99""LLE PUSTEN KANN!" },
 };
 
 static const struct ComicBlock block_p5_11 = { &poly_p5_b11, -1, -1, block_p5_b11_boxes, 2 };
 
 static const struct Polygon poly_p5_b12 = { {
-    { 401, 206 },
-    { 504, 206 },
-    { 481, 296 },
-    { 427, 296 },
+	{ 401, 206 },
+	{ 504, 206 },
+	{ 481, 296 },
+	{ 427, 296 },
 } };
 
 static const struct ComicBox block_p5_b12_boxes[] = {
-    { 8, 246, 242, 207, "    HE'S COMPLETELY\nDISORIENTED. FIRING BLIND...NOW.\n   TAKE HIM OUT NOW!", "    IL EST COMPLETEMENT\nDESORIENTE. IL TIRE AU HASARD...JE\n VAIS M'EN OCCUPER, MAINTENANT!", "  ESTA DESORIENTADO\nY DISPARA A CIEGAS. ESTA ES MI\n   OPORTUNIDAD!", "       ER HAT V\x99""LLIG DIE\n    ORIENTIERUNG VERLOREN,\n   FEUERT BLINDLINGS DRAUFLOS.\n      JETZT...SCHALTE IHN\n            JETZT AUS!" },
+	{ 8, 246, 242, 207, "    HE'S COMPLETELY\nDISORIENTED. FIRING BLIND...NOW.\n   TAKE HIM OUT NOW!", "    IL EST COMPLETEMENT\nDESORIENTE. IL TIRE AU HASARD...JE\n VAIS M'EN OCCUPER, MAINTENANT!", "  ESTA DESORIENTADO\nY DISPARA A CIEGAS. ESTA ES MI\n   OPORTUNIDAD!", "       ER HAT V\x99""LLIG DIE\n    ORIENTIERUNG VERLOREN,\n   FEUERT BLINDLINGS DRAUFLOS.\n      JETZT...SCHALTE IHN\n            JETZT AUS!" },
 };
 
 static const struct ComicBlock block_p5_12 = { &poly_p5_b12, -1, -1, block_p5_b12_boxes, 1 };
 
 static const struct Polygon poly_p5_b13 = { {
-    { 504, 206 },
-    { 588, 206 },
-    { 588, 320 },
-    { 481, 296 },
+	{ 504, 206 },
+	{ 588, 206 },
+	{ 588, 320 },
+	{ 481, 296 },
 } };
 
 static const struct ComicBox block_p5_b13_boxes[] = {
-    { 4, 244, 325, 179, "    WHERE THE HELL ARE\nYOU NIGHTBREED? WHEN I FIND YOU,\n    I'M GONNA - UNNNGH!!!", "     OU DIABLE ETES-VOUS\n DONC, SUPPOT DE LA NUIT? SI JE\n    VOUS ATTRAPE, JE VAIS--\n           UNNNGH!!!", "    DONDE ESTAS, DEMONIO?\nCUANDO TE ENCUENTRE TE... UNNNGH!!!", "    WO ZUR H\x99""LLE STECKST\nDU NACHTBRUT? WENN ICH DICH FINDE,\n    WERDE ICH DI---UMMMPF!!!" },
+	{ 4, 244, 325, 179, "    WHERE THE HELL ARE\nYOU NIGHTBREED? WHEN I FIND YOU,\n    I'M GONNA - UNNNGH!!!", "     OU DIABLE ETES-VOUS\n DONC, SUPPOT DE LA NUIT? SI JE\n    VOUS ATTRAPE, JE VAIS--\n           UNNNGH!!!", "    DONDE ESTAS, DEMONIO?\nCUANDO TE ENCUENTRE TE... UNNNGH!!!", "    WO ZUR H\x99""LLE STECKST\nDU NACHTBRUT? WENN ICH DICH FINDE,\n    WERDE ICH DI---UMMMPF!!!" },
 };
 
 static const struct ComicBlock block_p5_13 = { &poly_p5_b13, -1, -1, block_p5_b13_boxes, 1 };
 
 static const struct ComicBlock page_5_blocks[] = {
-    block_p5_0,
-    block_p5_1,
-    block_p5_2,
-    block_p5_3,
-    block_p5_4,
-    block_p5_5,
-    block_p5_6,
-    block_p5_7,
-    block_p5_8,
-    block_p5_9,
-    block_p5_10,
-    block_p5_11,
-    block_p5_12,
-    block_p5_13,
+	block_p5_0,
+	block_p5_1,
+	block_p5_2,
+	block_p5_3,
+	block_p5_4,
+	block_p5_5,
+	block_p5_6,
+	block_p5_7,
+	block_p5_8,
+	block_p5_9,
+	block_p5_10,
+	block_p5_11,
+	block_p5_12,
+	block_p5_13,
 };
 
 static struct ComicPage page_5 = { "DARK/COMDATA/LEPG9_10.SCN", 98, 45, 0, 0, page_5_blocks, 14 };
 
 static const struct Polygon poly_p6_b0 = { {
-    { 255, 0 },
-    { 324, 0 },
-    { 324, 83 },
-    { 269, 83 },
+	{ 255, 0 },
+	{ 324, 0 },
+	{ 324, 83 },
+	{ 269, 83 },
 } };
 
 static const struct ComicBox block_p6_b0_boxes[] = {
-    { 5, 246, 335, 59, "    ...AND THEN THERE WERE TWO.", "\n     ... ET ILS FURENT DEUX.", "    ...Y SOLO QUEDARON DOS.", "\n  ... DA WAREN'S NUR NOCH ZWEI..." },
+	{ 5, 246, 335, 59, "    ...AND THEN THERE WERE TWO.", "\n     ... ET ILS FURENT DEUX.", "    ...Y SOLO QUEDARON DOS.", "\n  ... DA WAREN'S NUR NOCH ZWEI..." },
 };
 
 static const struct ComicBlock block_p6_0 = { &poly_p6_b0, -1, -1, block_p6_b0_boxes, 1 };
 
 static const struct Polygon poly_p6_b1 = { {
-    { 192, 83 },
-    { 324, 83 },
-    { 324, 199 },
-    { 192, 199 },
+	{ 192, 83 },
+	{ 324, 83 },
+	{ 324, 199 },
+	{ 192, 199 },
 } };
 
 static const struct ComicBox block_p6_b1_boxes[] = {
-    { 8, 246, 5, 39, "    TOUGH LUCK, GUNSLINGER,\n   CAN'T SAY I'LL MISS YOU.", "    PAS DE CHANCE, MAIS JE NE\n  PENSE PAS QUE TU ME MANQUES\n          A L'AVENIR.", "  MALA SUERTE, PISTOLERO,\n NO TE ECHARE DE MENOS.", "    TJA, PECH, REVOLVERHELD,\n ABER ICH KANN NICHT BEHAUPTEN,\n  DA\xe1"" ICH DICH VERMISSEN WERDE." },
+	{ 8, 246, 5, 39, "    TOUGH LUCK, GUNSLINGER,\n   CAN'T SAY I'LL MISS YOU.", "    PAS DE CHANCE, MAIS JE NE\n  PENSE PAS QUE TU ME MANQUES\n          A L'AVENIR.", "  MALA SUERTE, PISTOLERO,\n NO TE ECHARE DE MENOS.", "    TJA, PECH, REVOLVERHELD,\n ABER ICH KANN NICHT BEHAUPTEN,\n  DA\xe1"" ICH DICH VERMISSEN WERDE." },
 };
 
 static const struct ComicBlock block_p6_1 = { &poly_p6_b1, -1, -1, block_p6_b1_boxes, 1 };
 
 static const struct Polygon poly_p6_b2 = { {
-    { 74, 185 },
-    { 156, 185 },
-    { 156, 243 },
-    { 73, 243 },
+	{ 74, 185 },
+	{ 156, 185 },
+	{ 156, 243 },
+	{ 73, 243 },
 } };
 
 static const struct ComicBox block_p6_b2_boxes[] = {
-    { 1, 246, 160, 250, "    WIDOWMARK!", "\n         WIDOWMARK!", "  VIUDA NEGRA!", "\r         SCHWARZE WITWE!" },
+	{ 1, 246, 160, 250, "    WIDOWMARK!", "\n         WIDOWMARK!", "  VIUDA NEGRA!", "\r         SCHWARZE WITWE!" },
 };
 
 static const struct ComicBlock block_p6_2 = { &poly_p6_b2, -1, -1, block_p6_b2_boxes, 1 };
 
 static const struct Polygon poly_p6_b3 = { {
-    { 199, 278 },
-    { 225, 253 },
-    { 265, 246 },
-    { 325, 259 },
-    { 325, 316 },
-    { 276, 316 },
-    { 283, 300 },
-    { 208, 300 },
+	{ 199, 278 },
+	{ 225, 253 },
+	{ 265, 246 },
+	{ 325, 259 },
+	{ 325, 316 },
+	{ 276, 316 },
+	{ 283, 300 },
+	{ 208, 300 },
 } };
 
 static const struct ComicBox block_p6_b3_boxes[] = {
-    { 8, 244, 52, 216, "    ...PAY! HE'S GOING TO\n  PAY BIG! WITH HIS HEART, AND HIS\n BLOOD, AND HIS FEAR... OH, HIS\n   FEAR! HE'S GOING TO PAY....", "     ...PAYER! IL VA PAYER\n  TRES CHER! AVEC SON COEUR, ET\n SON SANG, ET SA PEUR... OH, SA\n          PEUR! IL VA PAYER....", "    ...LO PAGARAS, CERDO!\n  PAGARAS CON TU CORAZON, TU\n SANGRE Y TU ANGUSTIA... OH, SU\n  ANGUSTIA! EL PAGARA...", "    ...BEZAHLEN! UND WIE ER\n  BEZAHLEN WIRD DAF\x9a""R! MIT SEINEM\nHERZEN, SEINEM BLUT, SEINER ANGST...\n   OH JA, SEINER PANISCHEN ANGST.\n     ER WIRD DAF\x9a""R BEZAHLEN..." },
+	{ 8, 244, 52, 216, "    ...PAY! HE'S GOING TO\n  PAY BIG! WITH HIS HEART, AND HIS\n BLOOD, AND HIS FEAR... OH, HIS\n   FEAR! HE'S GOING TO PAY....", "     ...PAYER! IL VA PAYER\n  TRES CHER! AVEC SON COEUR, ET\n SON SANG, ET SA PEUR... OH, SA\n          PEUR! IL VA PAYER....", "    ...LO PAGARAS, CERDO!\n  PAGARAS CON TU CORAZON, TU\n SANGRE Y TU ANGUSTIA... OH, SU\n  ANGUSTIA! EL PAGARA...", "    ...BEZAHLEN! UND WIE ER\n  BEZAHLEN WIRD DAF\x9a""R! MIT SEINEM\nHERZEN, SEINEM BLUT, SEINER ANGST...\n   OH JA, SEINER PANISCHEN ANGST.\n     ER WIRD DAF\x9a""R BEZAHLEN..." },
 };
 
 static const struct ComicBlock block_p6_3 = { &poly_p6_b3, -1, -1, block_p6_b3_boxes, 1 };
 
 static const struct Polygon poly_p6_b4 = { {
-    { 60, 300 },
-    { 283, 300 },
-    { 276, 316 },
-    { 216, 316 },
-    { 251, 399 },
-    { 60, 399 },
+	{ 60, 300 },
+	{ 283, 300 },
+	{ 276, 316 },
+	{ 216, 316 },
+	{ 251, 399 },
+	{ 60, 399 },
 } };
 
 static const struct ComicBox block_p6_b4_boxes[] = {
-    { 3, 244, 175, 290, "    DESPERADO...?!", "\n        DESPERADO...?!", "    DESESPERADO...?!", "\n         SHOWDOWN...?!" },
+	{ 3, 244, 175, 290, "    DESPERADO...?!", "\n        DESPERADO...?!", "    DESESPERADO...?!", "\n         SHOWDOWN...?!" },
 };
 
 static const struct ComicBlock block_p6_4 = { &poly_p6_b4, -1, -1, block_p6_b4_boxes, 1 };
 
 static const struct Polygon poly_p6_b5 = { {
-    { 216, 316 },
-    { 324, 316 },
-    { 324, 399 },
-    { 251, 399 },
+	{ 216, 316 },
+	{ 324, 316 },
+	{ 324, 399 },
+	{ 251, 399 },
 } };
 
 static const struct ComicBox block_p6_b5_boxes[] = {
-    { 3, 246, 250, 338, "    HE GOT WHAT HE DESERVED.", "\n   IL A EU CE QU'IL MERITAIT...", "   TUVO LO QUE MERECIA.", "         ER HAT BEKOMMEN,\n       WAS ER VERDIENT HAT." },
-    { 4, 244, 52, 295, "    YOU...!", "\n          VOUS...!", "    TU...!", "\n                 DU...!" },
+	{ 3, 246, 250, 338, "    HE GOT WHAT HE DESERVED.", "\n   IL A EU CE QU'IL MERITAIT...", "   TUVO LO QUE MERECIA.", "         ER HAT BEKOMMEN,\n       WAS ER VERDIENT HAT." },
+	{ 4, 244, 52, 295, "    YOU...!", "\n          VOUS...!", "    TU...!", "\n                 DU...!" },
 };
 
 static const struct ComicBlock block_p6_5 = { &poly_p6_b5, -1, -1, block_p6_b5_boxes, 2 };
 
 static const struct Polygon poly_p6_b6 = { {
-    { 324, 0 },
-    { 586, 0 },
-    { 586, 99 },
-    { 433, 99 },
-    { 389, 86 },
-    { 382, 50 },
-    { 362, 34 },
-    { 347, 52 },
+	{ 324, 0 },
+	{ 586, 0 },
+	{ 586, 99 },
+	{ 433, 99 },
+	{ 389, 86 },
+	{ 382, 50 },
+	{ 362, 34 },
+	{ 347, 52 },
 } };
 
 static const struct ComicBox block_p6_b6_boxes[] = {
-    { 2, 244, 242, 69, "    I DON'T KNOW HOW YOU\nREACHED THE TOP BEFORE ME, BUT\n  I'M NOT IMPRESSED.", "    JE NE SAIS PAS COMMENT\n VOUS AVEZ PU ARRIVER ICI AVANT\n    MOI, MAIS JE NE SUIS\n     PAS IMPRESSIONNEE.", "   NO SE COMO LLEGASTE\nAQUI ANTES QUE YO, PERO NO ME\n  IMPRESIONAS.", "       ICH WEI\xe1"" ZWAR NICHT,\n  WIE DU VOR MIR RAUFGEKOMMEN\n     BIST, ABER ES BEEINDRUCKT\n           MICH NICHT." },
+	{ 2, 244, 242, 69, "    I DON'T KNOW HOW YOU\nREACHED THE TOP BEFORE ME, BUT\n  I'M NOT IMPRESSED.", "    JE NE SAIS PAS COMMENT\n VOUS AVEZ PU ARRIVER ICI AVANT\n    MOI, MAIS JE NE SUIS\n     PAS IMPRESSIONNEE.", "   NO SE COMO LLEGASTE\nAQUI ANTES QUE YO, PERO NO ME\n  IMPRESIONAS.", "       ICH WEI\xe1"" ZWAR NICHT,\n  WIE DU VOR MIR RAUFGEKOMMEN\n     BIST, ABER ES BEEINDRUCKT\n           MICH NICHT." },
 };
 
 static const struct ComicBlock block_p6_6 = { &poly_p6_b6, -1, -1, block_p6_b6_boxes, 1 };
 
 static const struct Polygon poly_p6_b7 = { {
-    { 324, 0 },
-    { 347, 52 },
-    { 362, 34 },
-    { 382, 50 },
-    { 389, 86 },
-    { 405, 124 },
-    { 402, 150 },
-    { 418, 197 },
-    { 454, 245 },
-    { 324, 245 },
+	{ 324, 0 },
+	{ 347, 52 },
+	{ 362, 34 },
+	{ 382, 50 },
+	{ 389, 86 },
+	{ 405, 124 },
+	{ 402, 150 },
+	{ 418, 197 },
+	{ 454, 245 },
+	{ 324, 245 },
 } };
 
 static const struct ComicBox block_p6_b7_boxes[] = {
-    { 2, 246, 132, 71, "        I'M SURPRISED YOU\n    HAVEN'T LEARNED THAT THE\n TAPESTRY OF NIGHT IS WOVEN WITH\nSURPRISES, WIDOWMARK. BUT, IF YOU\n  UNDERESTIMATE IT, THE DARKNESS\n    WILL SWALLOW YOU WHOLE.", "       JE SUIS SURPRIS DE\n    VOIR QUE VOUS NE SAVEZ PAS\n QUE LA TAPISSERIE DE LA NUIT EST\nTISSEE DE SURPRISES, WIDOWMARK. SI\n VOUS LA SOUS-ESTIMEZ, LA NUIT VOUS\n     ENGLOUTIRA TOUTE ENTIERE.", "    ES CURIOSO QUE AUN\n  NO SEPAS QUE LA NOCHE ESTA\n LLENA DE SORPRESAS, VIUDA NEGRA.\n  SI SUBESTIMAS A LAS TINIEBLAS,\n    PEOR PARA TI.", "          ICH BIN ERSTAUNT,\n     DA\xe1"" DU IMMER NOCH NICHT\n GELERNT HAST, DA\xe1"" DER STOFF DER\nNACHT AUS \x9a""BERRASCHUNGEN GEWOBEN\n  WIRD, SCHWARZE WITWE. ABER WENN\n    DU DIE FINSTERNIS UNTERSCH\x8e""TZT,\n      WIRD SIE DICH VERSCHLINGEN." },
+	{ 2, 246, 132, 71, "        I'M SURPRISED YOU\n    HAVEN'T LEARNED THAT THE\n TAPESTRY OF NIGHT IS WOVEN WITH\nSURPRISES, WIDOWMARK. BUT, IF YOU\n  UNDERESTIMATE IT, THE DARKNESS\n    WILL SWALLOW YOU WHOLE.", "       JE SUIS SURPRIS DE\n    VOIR QUE VOUS NE SAVEZ PAS\n QUE LA TAPISSERIE DE LA NUIT EST\nTISSEE DE SURPRISES, WIDOWMARK. SI\n VOUS LA SOUS-ESTIMEZ, LA NUIT VOUS\n     ENGLOUTIRA TOUTE ENTIERE.", "    ES CURIOSO QUE AUN\n  NO SEPAS QUE LA NOCHE ESTA\n LLENA DE SORPRESAS, VIUDA NEGRA.\n  SI SUBESTIMAS A LAS TINIEBLAS,\n    PEOR PARA TI.", "          ICH BIN ERSTAUNT,\n     DA\xe1"" DU IMMER NOCH NICHT\n GELERNT HAST, DA\xe1"" DER STOFF DER\nNACHT AUS \x9a""BERRASCHUNGEN GEWOBEN\n  WIRD, SCHWARZE WITWE. ABER WENN\n    DU DIE FINSTERNIS UNTERSCH\x8e""TZT,\n      WIRD SIE DICH VERSCHLINGEN." },
 };
 
 static const struct ComicBlock block_p6_7 = { &poly_p6_b7, -1, -1, block_p6_b7_boxes, 1 };
 
 static const struct Polygon poly_p6_b8 = { {
-    { 389, 86 },
-    { 433, 99 },
-    { 586, 99 },
-    { 586, 150 },
-    { 402, 150 },
-    { 405, 124 },
+	{ 389, 86 },
+	{ 433, 99 },
+	{ 586, 99 },
+	{ 586, 150 },
+	{ 402, 150 },
+	{ 405, 124 },
 } };
 
 static const struct ComicBox block_p6_b8_boxes[] = {
-    { 2, 244, 242, 138, "    VERY POETIC!", "\n       TRES POETIQUE!", "    MUY POETICO!", "\n   WIE AUSGESPROCHEN POETISCH!" },
-    { 4, 246, 337, 55, "    I'M GLAD YOU LIKE IT,\n  BUT IT'S NOT POETRY, IT'S A\n   FUNDAMENTAL MAXIM THAT-", "      SI VOUS AIMEZ, TANT\n   MIEUX, MAIS CE N'EST PAS DE\n  LA POESIE, C'EST UNE MAXIME\n       FONDAMENTALE QUI --", "   ME ALEGRA QUE TE GUSTE,\n  PERO NO ES POESIA. ES UNA\n  REGLA BASICA QUE-", "       SCH\x99""N, DA\xe1"" ES DIR\n   GEF\x8e""LLT, ABER ES IST KEINE\n POESIE. ES IST EINE FUNDAMENTALE\n          MAXIME, DIE..." },
+	{ 2, 244, 242, 138, "    VERY POETIC!", "\n       TRES POETIQUE!", "    MUY POETICO!", "\n   WIE AUSGESPROCHEN POETISCH!" },
+	{ 4, 246, 337, 55, "    I'M GLAD YOU LIKE IT,\n  BUT IT'S NOT POETRY, IT'S A\n   FUNDAMENTAL MAXIM THAT-", "      SI VOUS AIMEZ, TANT\n   MIEUX, MAIS CE N'EST PAS DE\n  LA POESIE, C'EST UNE MAXIME\n       FONDAMENTALE QUI --", "   ME ALEGRA QUE TE GUSTE,\n  PERO NO ES POESIA. ES UNA\n  REGLA BASICA QUE-", "       SCH\x99""N, DA\xe1"" ES DIR\n   GEF\x8e""LLT, ABER ES IST KEINE\n POESIE. ES IST EINE FUNDAMENTALE\n          MAXIME, DIE..." },
 };
 
 static const struct ComicBlock block_p6_8 = { &poly_p6_b8, -1, -1, block_p6_b8_boxes, 2 };
 
 static const struct Polygon poly_p6_b9 = { {
-    { 402, 150 },
-    { 586, 150 },
-    { 586, 245 },
-    { 454, 245 },
-    { 418, 197 },
+	{ 402, 150 },
+	{ 586, 150 },
+	{ 586, 245 },
+	{ 454, 245 },
+	{ 418, 197 },
 } };
 
 static const struct ComicBox block_p6_b9_boxes[] = {
-    { 6, 244, 261, 201, "       I DON'T GIVE A RAT'S ASS\n   ABOUT YOUR MAXIMS! I LIVE BY MY\n OWN RULES AND I'VE WAITED A LONG\nTIME FOR YOUR HEAD. I NEVER EAT\n   THE HEAD, YOU KNOW? I KEEP IT\n        IN A SAFE PLACE....", "             JE ME FOUS\n   COMPLETEMENT DE VOS MAXIMES!\n JE VIS SELON MES PROPRES REGLES,\n  ET J'ATTENDS VOTRE TETE DEPUIS\n LONGTEMPS. JE NE MANGE JAMAIS LES\n  TETES, VOUS SAVEZ... JE LES GARDE\n         DANS UN ENDROIT SUR...", "    ME IMPORTAN POCO TUS\n  REGLAS! YO TENGO LAS MIAS Y HE\n ESPERADO MUCHO POR TU CABEZA.\n  NUNCA LAS COMO, SABES? LAS\n   GUARDO EN LUGAR SEGURO...", "           ICH GEBE KEINEN\n   RATTENFURZ AUF DEINE MAXIMEN!\n ICH LEBE NACH MEINEN EIGENEN REGELN,\nUND ICH HABE SCHON VIEL ZU LANGE AUF\n  DEINEN KOPF GEWARTET. ICH ESSE DEN\n   KOPF NIEMALS AUF, WEI\xe1""T DU. DEN \n    BEWAHRE ICH AN EINEM\n         EHRENPLATZ AUF..." },
+	{ 6, 244, 261, 201, "       I DON'T GIVE A RAT'S ASS\n   ABOUT YOUR MAXIMS! I LIVE BY MY\n OWN RULES AND I'VE WAITED A LONG\nTIME FOR YOUR HEAD. I NEVER EAT\n   THE HEAD, YOU KNOW? I KEEP IT\n        IN A SAFE PLACE....", "             JE ME FOUS\n   COMPLETEMENT DE VOS MAXIMES!\n JE VIS SELON MES PROPRES REGLES,\n  ET J'ATTENDS VOTRE TETE DEPUIS\n LONGTEMPS. JE NE MANGE JAMAIS LES\n  TETES, VOUS SAVEZ... JE LES GARDE\n         DANS UN ENDROIT SUR...", "    ME IMPORTAN POCO TUS\n  REGLAS! YO TENGO LAS MIAS Y HE\n ESPERADO MUCHO POR TU CABEZA.\n  NUNCA LAS COMO, SABES? LAS\n   GUARDO EN LUGAR SEGURO...", "           ICH GEBE KEINEN\n   RATTENFURZ AUF DEINE MAXIMEN!\n ICH LEBE NACH MEINEN EIGENEN REGELN,\nUND ICH HABE SCHON VIEL ZU LANGE AUF\n  DEINEN KOPF GEWARTET. ICH ESSE DEN\n   KOPF NIEMALS AUF, WEI\xe1""T DU. DEN \n    BEWAHRE ICH AN EINEM\n         EHRENPLATZ AUF..." },
 };
 
 static const struct ComicBlock block_p6_9 = { &poly_p6_b9, -1, -1, block_p6_b9_boxes, 1 };
 
 static const struct Polygon poly_p6_b10 = { {
-    { 324, 245 },
-    { 586, 245 },
-    { 586, 290 },
-    { 388, 399 },
-    { 324, 399 },
+	{ 324, 245 },
+	{ 586, 245 },
+	{ 586, 290 },
+	{ 388, 399 },
+	{ 324, 399 },
 } };
 
 static const struct ComicBox block_p6_b10_boxes[] = {
-    { 2, 244, 176, 303, "    IT'S PAYBACK TIME!", "\n    IL EST TEMPS DE PAYER!", "  LA HORA HA LLEGADO!", "\n             ZAHLTAG!" },
+	{ 2, 244, 176, 303, "    IT'S PAYBACK TIME!", "\n    IL EST TEMPS DE PAYER!", "  LA HORA HA LLEGADO!", "\n             ZAHLTAG!" },
 };
 
 static const struct ComicBlock block_p6_10 = { &poly_p6_b10, -1, -1, block_p6_b10_boxes, 1 };
 
 static const struct ComicBlock page_6_blocks[] = {
-    block_p6_0,
-    block_p6_1,
-    block_p6_2,
-    block_p6_3,
-    block_p6_4,
-    block_p6_5,
-    block_p6_6,
-    block_p6_7,
-    block_p6_8,
-    block_p6_9,
-    block_p6_10,
+	block_p6_0,
+	block_p6_1,
+	block_p6_2,
+	block_p6_3,
+	block_p6_4,
+	block_p6_5,
+	block_p6_6,
+	block_p6_7,
+	block_p6_8,
+	block_p6_9,
+	block_p6_10,
 };
 
 static struct ComicPage page_6 = { "DARK/COMDATA/LEPG1112.SCN", 98, 46, 0, 0, page_6_blocks, 11 };
 
 static const struct Polygon poly_p7_b0 = { {
-    { 112, 50 },
-    { 206, 50 },
-    { 164, 91 },
-    { 216, 136 },
-    { 116, 136 },
-    { 158, 92 },
+	{ 112, 50 },
+	{ 206, 50 },
+	{ 164, 91 },
+	{ 216, 136 },
+	{ 116, 136 },
+	{ 158, 92 },
 } };
 
 static const struct ComicBox block_p7_b0_boxes[] = {
-    { 7, 244, 220, 49, "     SUCKER!", "\n             SALAUD !", "  CHUPA ESTA!", "\n           PENNER!" },
+	{ 7, 244, 220, 49, "     SUCKER!", "\n             SALAUD !", "  CHUPA ESTA!", "\n           PENNER!" },
 };
 
 static const struct ComicBlock block_p7_0 = { &poly_p7_b0, 99, 104, block_p7_b0_boxes, 1 };
 
 static const struct Polygon poly_p7_b1 = { {
-    { 175, 102 },
-    { 254, 102 },
-    { 186, 208 },
-    { 140, 136 },
-    { 216, 136 },
+	{ 175, 102 },
+	{ 254, 102 },
+	{ 186, 208 },
+	{ 140, 136 },
+	{ 216, 136 },
 } };
 
 static const struct ComicBox block_p7_b1_boxes[] = {
-    { 7, 246, 254, 107, "     DAMN HER....", "\n          MAUDITE SOIT...!", "     MALDITA...", "\n        DIESE VERDAMMTE...!" },
+	{ 7, 246, 254, 107, "     DAMN HER....", "\n          MAUDITE SOIT...!", "     MALDITA...", "\n        DIESE VERDAMMTE...!" },
 };
 
 static const struct ComicBlock block_p7_1 = { &poly_p7_b1, -1, -1, block_p7_b1_boxes, 1 };
 
 static const struct Polygon poly_p7_b2 = { {
-    { 59, 119 },
-    { 129, 119 },
-    { 161, 168 },
-    { 161, 268 },
-    { 59, 268 },
+	{ 59, 119 },
+	{ 129, 119 },
+	{ 161, 168 },
+	{ 161, 268 },
+	{ 59, 268 },
 } };
 
 static const struct ComicBox block_p7_b2_boxes[] = {
-    { 5, 246, 171, 205, "     VENOM!!!", "\n           DU VENIN!!!", "    VENENO!!!", "\n             GIFT!!!" },
+	{ 5, 246, 171, 205, "     VENOM!!!", "\n           DU VENIN!!!", "    VENENO!!!", "\n             GIFT!!!" },
 };
 
 static const struct ComicBlock block_p7_2 = { &poly_p7_b2, 99, 126, block_p7_b2_boxes, 1 };
 
 static const struct Polygon poly_p7_b3 = { {
-    { 161, 190 },
-    { 322, 190 },
-    { 322, 282 },
-    { 161, 281 },
+	{ 161, 190 },
+	{ 322, 190 },
+	{ 322, 282 },
+	{ 161, 281 },
 } };
 
 static const struct ComicBox block_p7_b3_boxes[] = {
-    { 7, 244, 323, 172, "   ...GAINING! THE BASTARD'S\n   GAINING ON ME!", "     ...IL ME RATTRAPE! CE\n      CHIEN ME RATTRAPE!", "   ...ME PILLO! EL BASTARDO\n  ME HA PILLADO!", "    ...FERTIG! DIESER BASTARD\n  MACHT MICH WIRKLICH FERTIG!" },
+	{ 7, 244, 323, 172, "   ...GAINING! THE BASTARD'S\n   GAINING ON ME!", "     ...IL ME RATTRAPE! CE\n      CHIEN ME RATTRAPE!", "   ...ME PILLO! EL BASTARDO\n  ME HA PILLADO!", "    ...FERTIG! DIESER BASTARD\n  MACHT MICH WIRKLICH FERTIG!" },
 };
 
 static const struct ComicBlock block_p7_3 = { &poly_p7_b3, -1, -1, block_p7_b3_boxes, 1 };
 
 static const struct Polygon poly_p7_b4 = { {
-    { 323, 0 },
-    { 487, 0 },
-    { 464, 168 },
-    { 322, 157 },
+	{ 323, 0 },
+	{ 487, 0 },
+	{ 464, 168 },
+	{ 322, 157 },
 } };
 
 static const struct ComicBox block_p7_b4_boxes[] = {
-    { 2, 246, 176, 48, "      I TOLD YOU TO BEHAVE!\n  EITHER SETTLE DOWN NOW, OR\n YOU CAN JOIN DESPERADO ON THE\n       BODY BAG EXPRESS!", "\n      JE VOUS AI DIT DE VOUS\n  TENIR TRANQUILLE! SOIT VOUS\n VOUS CALMEZ TOUT DE SUITE, SOIT\n VOUS ALLEZ REJOINDRE DESPERADO\n       AU RAYON DES CHERS\n            DISPARUS!", "    TE LO DIJE!\n  RINDETE O IRAS A UNIRTE A\n DESESPERADO EN EL EXPRESO AL\n       INFIERNO!", "      ICH HABE DIR GESAGT,\n  DU SOLLST DICH BENEHMEN! H\x99""R\n    JETZT AUF, ODER DU KANNST\n    SHOWDOWN IM LEICHENSACK\n         GESELLSCHAFT LEISTEN!" },
+	{ 2, 246, 176, 48, "      I TOLD YOU TO BEHAVE!\n  EITHER SETTLE DOWN NOW, OR\n YOU CAN JOIN DESPERADO ON THE\n       BODY BAG EXPRESS!", "\n      JE VOUS AI DIT DE VOUS\n  TENIR TRANQUILLE! SOIT VOUS\n VOUS CALMEZ TOUT DE SUITE, SOIT\n VOUS ALLEZ REJOINDRE DESPERADO\n       AU RAYON DES CHERS\n            DISPARUS!", "    TE LO DIJE!\n  RINDETE O IRAS A UNIRTE A\n DESESPERADO EN EL EXPRESO AL\n       INFIERNO!", "      ICH HABE DIR GESAGT,\n  DU SOLLST DICH BENEHMEN! H\x99""R\n    JETZT AUF, ODER DU KANNST\n    SHOWDOWN IM LEICHENSACK\n         GESELLSCHAFT LEISTEN!" },
 };
 
 static const struct ComicBlock block_p7_4 = { &poly_p7_b4, -1, -1, block_p7_b4_boxes, 1 };
 
 static const struct Polygon poly_p7_b5 = { {
-    { 428, 193 },
-    { 464, 168 },
-    { 522, 157 },
-    { 586, 178 },
-    { 586, 240 },
-    { 487, 257 },
-    { 431, 230 },
+	{ 428, 193 },
+	{ 464, 168 },
+	{ 522, 157 },
+	{ 586, 178 },
+	{ 586, 240 },
+	{ 487, 257 },
+	{ 431, 230 },
 } };
 
 static const struct ComicBox block_p7_b5_boxes[] = {
-    { 4, 244, 319, 99, "    WAIT...!", "\n         ATTENDEZ...!", "  ESPERA...!", "\n            WARTE...!" },
+	{ 4, 244, 319, 99, "    WAIT...!", "\n         ATTENDEZ...!", "  ESPERA...!", "\n            WARTE...!" },
 };
 
 static const struct ComicBlock block_p7_5 = { &poly_p7_b5, -1, -1, block_p7_b5_boxes, 1 };
 
 static const struct Polygon poly_p7_b6 = { {
-    { 322, 157 },
-    { 464, 168 },
-    { 428, 193 },
-    { 431, 230 },
-    { 456, 246 },
-    { 322, 249 },
+	{ 322, 157 },
+	{ 464, 168 },
+	{ 428, 193 },
+	{ 431, 230 },
+	{ 456, 246 },
+	{ 322, 249 },
 } };
 
 static const struct ComicBox block_p7_b6_boxes[] = {
-    { 1, 246, 433, 251, "    AHHHH! THAT'S IT WITCH,\nTIME TO PUNCH YOUR TICKET...\n  ALL ABOARD!", "       AHHHH! C'EST \x80""A,\n    SORCIERE, IL EST TEMPS...\n           ALLONS-Y!", "  BIEN! TOMA TU BOLETO \nAL INFIERNO. TODOS A\n  BORDO!", "     NA GUT, ALTE HEXE, DAS\n   WAR'S! ZEIT ZUM EINT\x9a""TEN!" },
+	{ 1, 246, 433, 251, "    AHHHH! THAT'S IT WITCH,\nTIME TO PUNCH YOUR TICKET...\n  ALL ABOARD!", "       AHHHH! C'EST \x80""A,\n    SORCIERE, IL EST TEMPS...\n           ALLONS-Y!", "  BIEN! TOMA TU BOLETO \nAL INFIERNO. TODOS A\n  BORDO!", "     NA GUT, ALTE HEXE, DAS\n   WAR'S! ZEIT ZUM EINT\x9a""TEN!" },
 };
 
 static const struct ComicBlock block_p7_6 = { &poly_p7_b6, -1, -1, block_p7_b6_boxes, 1 };
 
 static const struct Polygon poly_p7_b7 = { {
-    { 530, 258 },
-    { 586, 240 },
-    { 586, 399 },
-    { 530, 399 },
+	{ 530, 258 },
+	{ 586, 240 },
+	{ 586, 399 },
+	{ 530, 399 },
 } };
 
 static const struct ComicBox block_p7_b7_boxes[] = {
-    { 8, 246, 330, 290, "   AND THEN THERE WAS ONE...", "\n  ET IL N'EN RESTA PLUS QU'UNE...", "   Y SOLO UNO QUEDO...", "\n   ...DA WAR ES NUR NOCH EINER...." },
+	{ 8, 246, 330, 290, "   AND THEN THERE WAS ONE...", "\n  ET IL N'EN RESTA PLUS QU'UNE...", "   Y SOLO UNO QUEDO...", "\n   ...DA WAR ES NUR NOCH EINER...." },
 };
 
 static const struct ComicBlock block_p7_7 = { &poly_p7_b7, -1, -1, block_p7_b7_boxes, 1 };
 
 static const struct ComicBlock page_7_blocks[] = {
-    block_p7_0,
-    block_p7_1,
-    block_p7_2,
-    block_p7_3,
-    block_p7_4,
-    block_p7_5,
-    block_p7_6,
-    block_p7_7,
+	block_p7_0,
+	block_p7_1,
+	block_p7_2,
+	block_p7_3,
+	block_p7_4,
+	block_p7_5,
+	block_p7_6,
+	block_p7_7,
 };
 
 static struct ComicPage page_7 = { "DARK/COMDATA/LEPG1314.SCN", 98, 47, 0, 0, page_7_blocks, 8 };
 
 static const struct Polygon poly_p8_b0 = { {
-    { 59, 0 },
-    { 324, 0 },
-    { 324, 45 },
-    { 278, 49 },
-    { 214, 80 },
-    { 188, 136 },
-    { 59, 124 },
+	{ 59, 0 },
+	{ 324, 0 },
+	{ 324, 45 },
+	{ 278, 49 },
+	{ 214, 80 },
+	{ 188, 136 },
+	{ 59, 124 },
 } };
 
 static const struct ComicBox block_p8_b0_boxes[] = {
-    { 5, 246, 218, 54, "   ...SO WEAK. IT'S THE VENOM...\n NOT SURE I CAN MAKE IT. STOP IT!\nSTAY ALERT!  I'M TWO DOWN WITH\n    ONE TO GO... WONDER WHERE\n           SHE IS...", "\n   ...SI FAIBLE. C'EST LE VENIN...\n JE NE SAIS PAS SI JE TIENDRAI LE\nCOUP. STOP! RESTER EVEILLE! JE\nSUIS AU BOUT DU ROULEAU... JE ME\n    DEMANDE OU ELLE PEUT\n          BIEN ETRE....", "   ...ESTOY DEBIL. ES EL VENENO...\n NO SE SI PODRE. BASTA!\nESTATE ALERTA! AUN TE QUEDA\n    UNA... DONDE\n           ESTARA?", "\n   ...SO SCHWACH. DAS IST DAS\n GIFT...WEI\xe1"" NICHT, OB ICH ES SCHAFFE.\nH\x99""R AUF! BLEIB WACH! ZWEI SIND SCHON\n  ABGEFR\x9a""HST\x9a""CKT, EINE IST NOCH AUF\n   DER WARTELISTE! ICH FRAGE\n      MICH, WO SIE STECKT..." },
+	{ 5, 246, 218, 54, "   ...SO WEAK. IT'S THE VENOM...\n NOT SURE I CAN MAKE IT. STOP IT!\nSTAY ALERT!  I'M TWO DOWN WITH\n    ONE TO GO... WONDER WHERE\n           SHE IS...", "\n   ...SI FAIBLE. C'EST LE VENIN...\n JE NE SAIS PAS SI JE TIENDRAI LE\nCOUP. STOP! RESTER EVEILLE! JE\nSUIS AU BOUT DU ROULEAU... JE ME\n    DEMANDE OU ELLE PEUT\n          BIEN ETRE....", "   ...ESTOY DEBIL. ES EL VENENO...\n NO SE SI PODRE. BASTA!\nESTATE ALERTA! AUN TE QUEDA\n    UNA... DONDE\n           ESTARA?", "\n   ...SO SCHWACH. DAS IST DAS\n GIFT...WEI\xe1"" NICHT, OB ICH ES SCHAFFE.\nH\x99""R AUF! BLEIB WACH! ZWEI SIND SCHON\n  ABGEFR\x9a""HST\x9a""CKT, EINE IST NOCH AUF\n   DER WARTELISTE! ICH FRAGE\n      MICH, WO SIE STECKT..." },
 };
 
 static const struct ComicBlock block_p8_0 = { &poly_p8_b0, -1, -1, block_p8_b0_boxes, 1 };
 
 static const struct Polygon poly_p8_b1 = { {
-    { 324, 45 },
-    { 278, 49 },
-    { 214, 80 },
-    { 188, 136 },
-    { 324, 149 },
+	{ 324, 45 },
+	{ 278, 49 },
+	{ 214, 80 },
+	{ 188, 136 },
+	{ 324, 149 },
 } };
 
 static const struct ComicBox block_p8_b1_boxes[] = {
-    { 3, 244, 252, 74, "    HELLO HANDSOME, BUY A\n       GIRL A DRINK?", "     SALUT, BEAU GOSSE, TU\n      M'OFFRES UN VERRE?", "    HOLA, HERMOSO. ME\n     PAGAS UNA COPA?", "    HALLO, H\x9a""BSCHER. L\x8e""DST\n  DU MICH ZU 'NEM DRINK EIN?" },
-    { 1, 246, 354, 151, "    TOPHAT...!", "\n          TOPHAT...!", "    DIVA...", "\n          ZYLINDERCHEN..!" },
+	{ 3, 244, 252, 74, "    HELLO HANDSOME, BUY A\n       GIRL A DRINK?", "     SALUT, BEAU GOSSE, TU\n      M'OFFRES UN VERRE?", "    HOLA, HERMOSO. ME\n     PAGAS UNA COPA?", "    HALLO, H\x9a""BSCHER. L\x8e""DST\n  DU MICH ZU 'NEM DRINK EIN?" },
+	{ 1, 246, 354, 151, "    TOPHAT...!", "\n          TOPHAT...!", "    DIVA...", "\n          ZYLINDERCHEN..!" },
 };
 
 static const struct ComicBlock block_p8_1 = { &poly_p8_b1, -1, -1, block_p8_b1_boxes, 2 };
 
 static const struct Polygon poly_p8_b2 = { {
-    { 129, 215 },
-    { 245, 216 },
-    { 245, 315 },
-    { 129, 315 },
+	{ 129, 215 },
+	{ 245, 216 },
+	{ 245, 315 },
+	{ 129, 315 },
 } };
 
 static const struct ComicBox block_p8_b2_boxes[] = {
-    { 3, 244, 255, 199, "      YOU MAY BE DARKNESS\n INCARNATE, DEARY, BUT YOU BLEED\n   JUST LIKE ANY MISERABLE\n            STOOGE.", "      VOUS ETES PEUT-ETRE\n L'INCARNATION DES TENEBRES, TRES\n CHER, MAIS VOUS SAIGNEZ COMME\n     LE PREMIER CRETIN VENU!", "     SERAS LA ENCARNACION\n DE LA NOCHE, PERO TU SANGRE ES\n  ROJA COMO LA DE CUALQUIER\n            IDIOTA.", "        DU MAGST JA DIE\n   VERK\x99""RPERTE DUNKELHEIT SEIN,\n  SCHATZI, ABER DU BLUTEST GENAU\n    WIE JEDES ARME SCHWEIN." },
+	{ 3, 244, 255, 199, "      YOU MAY BE DARKNESS\n INCARNATE, DEARY, BUT YOU BLEED\n   JUST LIKE ANY MISERABLE\n            STOOGE.", "      VOUS ETES PEUT-ETRE\n L'INCARNATION DES TENEBRES, TRES\n CHER, MAIS VOUS SAIGNEZ COMME\n     LE PREMIER CRETIN VENU!", "     SERAS LA ENCARNACION\n DE LA NOCHE, PERO TU SANGRE ES\n  ROJA COMO LA DE CUALQUIER\n            IDIOTA.", "        DU MAGST JA DIE\n   VERK\x99""RPERTE DUNKELHEIT SEIN,\n  SCHATZI, ABER DU BLUTEST GENAU\n    WIE JEDES ARME SCHWEIN." },
 };
 
 static const struct ComicBlock block_p8_2 = { &poly_p8_b2, -1, -1, block_p8_b2_boxes, 1 };
 
 static const struct Polygon poly_p8_b3 = { {
-    { 59, 124 },
-    { 324, 149 },
-    { 324, 209 },
-    { 59, 232 },
+	{ 59, 124 },
+	{ 324, 149 },
+	{ 324, 209 },
+	{ 59, 232 },
 } };
 
 static const struct ComicBox block_p8_b3_boxes[] = {
-    { 1, 244, 195, 174, "    CORRECT! YOU WIN THE\n     PRIZE, BABY FACE!", "    EXACT! TU AS GAGNE LE\n  GROS LOT, GUEULE D'AMOUR!", "    EXACTO! HAS GANADO\n   EL PRECIO, NENE!", "    STIMMT! DER KANDIDAT HAT\n HUNDERT PUNKTE, MILCHGESICHT!" },
+	{ 1, 244, 195, 174, "    CORRECT! YOU WIN THE\n     PRIZE, BABY FACE!", "    EXACT! TU AS GAGNE LE\n  GROS LOT, GUEULE D'AMOUR!", "    EXACTO! HAS GANADO\n   EL PRECIO, NENE!", "    STIMMT! DER KANDIDAT HAT\n HUNDERT PUNKTE, MILCHGESICHT!" },
 };
 
 static const struct ComicBlock block_p8_3 = { &poly_p8_b3, 99, 27, block_p8_b3_boxes, 1 };
 
 static const struct Polygon poly_p8_b4 = { {
-    { 60, 303 },
-    { 181, 303 },
-    { 181, 399 },
-    { 59, 399 },
+	{ 60, 303 },
+	{ 181, 303 },
+	{ 181, 399 },
+	{ 59, 399 },
 } };
 
 static const struct ComicBox block_p8_b4_boxes[] = {
-    { 3, 244, 196, 298, "        I WATCHED YOU TAKE\n   OUT DESPERADO AND WIDOWMARK...\n    YOU WERE MARVY! BUT I CAN'T\n  IMAGINE WHY YOU'RE WORKING SO\n  HARD TO REMOVE THE COMPETITION.\n       WE NEED EACH OTHER...", "        JE VOUS AI OBSERVE\n     PENDANT QUE VOUS VOUS\n    OCCUPIEZ DE DESPERADO ET DE\n      WIDOWMARK... VOUS ETIEZ\n           MERVEILLEUX!", "    FUISTE MUY HABIL PARA\n  MATAR A DESESPERADO Y VIUDA\n  NEGRA. PERO NO CONTASTE CON\n  MI ASTUCIA.\n   RECUERDA QUE SOMOS UNO...", "        ICH HABE ZUGESCHAUT,\n     WIE DU SHOWDOWN UND DIESE\n SPINNE AUSGESCHALTET HAST...DU BIST\n SUPERSUPERSUPER, BABIIIEE! ABER ICH\n  WEI\xe1"" GAR NICHT, WARUM DU DICH SO\n     ANSTRENGST MIT MIR. WIR\n     BRAUCHEN EINANDER DOCH..." },
-    { 3, 244, 196, 298, nullptr, "\n      MAIS JE NE COMPRENDS\n   PAS POURQUOI VOUS FAITES\n  TOUS CES EFFORTS POUR VOUS\n DEBARRASSER DE VOS ADVERSAIRES.\n   NOUS AVONS BESOIN DE CETTE\n           RIVALITE...", nullptr, nullptr },
+	{ 3, 244, 196, 298, "        I WATCHED YOU TAKE\n   OUT DESPERADO AND WIDOWMARK...\n    YOU WERE MARVY! BUT I CAN'T\n  IMAGINE WHY YOU'RE WORKING SO\n  HARD TO REMOVE THE COMPETITION.\n       WE NEED EACH OTHER...", "        JE VOUS AI OBSERVE\n     PENDANT QUE VOUS VOUS\n    OCCUPIEZ DE DESPERADO ET DE\n      WIDOWMARK... VOUS ETIEZ\n           MERVEILLEUX!", "    FUISTE MUY HABIL PARA\n  MATAR A DESESPERADO Y VIUDA\n  NEGRA. PERO NO CONTASTE CON\n  MI ASTUCIA.\n   RECUERDA QUE SOMOS UNO...", "        ICH HABE ZUGESCHAUT,\n     WIE DU SHOWDOWN UND DIESE\n SPINNE AUSGESCHALTET HAST...DU BIST\n SUPERSUPERSUPER, BABIIIEE! ABER ICH\n  WEI\xe1"" GAR NICHT, WARUM DU DICH SO\n     ANSTRENGST MIT MIR. WIR\n     BRAUCHEN EINANDER DOCH..." },
+	{ 3, 244, 196, 298, nullptr, "\n      MAIS JE NE COMPRENDS\n   PAS POURQUOI VOUS FAITES\n  TOUS CES EFFORTS POUR VOUS\n DEBARRASSER DE VOS ADVERSAIRES.\n   NOUS AVONS BESOIN DE CETTE\n           RIVALITE...", nullptr, nullptr },
 };
 
 static const struct ComicBlock block_p8_4 = { &poly_p8_b4, -1, -1, block_p8_b4_boxes, 2 };
 
 static const struct Polygon poly_p8_b5 = { {
-    { 191, 305 },
-    { 324, 305 },
-    { 324, 399 },
-    { 191, 399 },
+	{ 191, 305 },
+	{ 324, 305 },
+	{ 324, 399 },
+	{ 191, 399 },
 } };
 
 static const struct ComicBox block_p8_b5_boxes[] = {
-    { 4, 244, 12, 285, "     ...LIKE DIFFERENT SIDES\n  OF THE SAME COIN, SWEET CHEEKS,\n WE DEFINE OUR OPPOSITE! MMMMM,\n   YUMMY... TASTES JUST LIKE\n            CHICKEN!", "    ... COMME LES DEUX COTES\n  D'UNE PIECE, NOUS DEFINISSONS\n NOTRE CONTRAIRE! MMMMM, MIAM...\n       ON DIRAIT DU POULET!", "     ...COMO LAS DOS CARAS\n  DE UNA MONEDA. SOMOS LOS\n OPUESTOS QUE NO PUEDEN VIVIR\n  EL UNO SIN EL OTRO...", "     ...WIE DIE BEIDEN SEITEN\n  DERSELBEN M\x9a""NZE, KNUDDELB\x8e""R.\n OHNE DEN ANDEREN G\x8e""BE ES KEINEN\n   VON UNS. HMMMM, LECKER...\n        SCHMECKT WIE H\x9a""HNCHEN!" },
+	{ 4, 244, 12, 285, "     ...LIKE DIFFERENT SIDES\n  OF THE SAME COIN, SWEET CHEEKS,\n WE DEFINE OUR OPPOSITE! MMMMM,\n   YUMMY... TASTES JUST LIKE\n            CHICKEN!", "    ... COMME LES DEUX COTES\n  D'UNE PIECE, NOUS DEFINISSONS\n NOTRE CONTRAIRE! MMMMM, MIAM...\n       ON DIRAIT DU POULET!", "     ...COMO LAS DOS CARAS\n  DE UNA MONEDA. SOMOS LOS\n OPUESTOS QUE NO PUEDEN VIVIR\n  EL UNO SIN EL OTRO...", "     ...WIE DIE BEIDEN SEITEN\n  DERSELBEN M\x9a""NZE, KNUDDELB\x8e""R.\n OHNE DEN ANDEREN G\x8e""BE ES KEINEN\n   VON UNS. HMMMM, LECKER...\n        SCHMECKT WIE H\x9a""HNCHEN!" },
 };
 
 static const struct ComicBlock block_p8_5 = { &poly_p8_b5, -1, -1, block_p8_b5_boxes, 1 };
 
 static const struct Polygon poly_p8_b6 = { {
-    { 324, 0 },
-    { 562, 0 },
-    { 524, 30 },
-    { 523, 102 },
-    { 322, 102 },
+	{ 324, 0 },
+	{ 562, 0 },
+	{ 524, 30 },
+	{ 523, 102 },
+	{ 322, 102 },
 } };
 
 static const struct ComicBox block_p8_b6_boxes[] = {
-    { 6, 246, 200, 83, "    STAY CONSCIOUS... JUST\n       STAY AWAKE...!", "      RESTER CONSCIENT...\n       RESTER EVEILLE...!", "   MANTENTE DESPIERTO...\n    NO TE DUERMAS...!", "     BLEIB' BEI BEWU\xe1""TSEIN....\n      BLEIB' BLO\xe1"" WACH...!" },
+	{ 6, 246, 200, 83, "    STAY CONSCIOUS... JUST\n       STAY AWAKE...!", "      RESTER CONSCIENT...\n       RESTER EVEILLE...!", "   MANTENTE DESPIERTO...\n    NO TE DUERMAS...!", "     BLEIB' BEI BEWU\xe1""TSEIN....\n      BLEIB' BLO\xe1"" WACH...!" },
 };
 
 static const struct ComicBlock block_p8_6 = { &poly_p8_b6, -1, -1, block_p8_b6_boxes, 1 };
 
 static const struct Polygon poly_p8_b7 = { {
-    { 562, 0 },
-    { 524, 30 },
-    { 523, 102 },
-    { 558, 131 },
-    { 589, 135 },
+	{ 562, 0 },
+	{ 524, 30 },
+	{ 523, 102 },
+	{ 558, 131 },
+	{ 589, 135 },
 } };
 
 static const struct ComicBox block_p8_b7_boxes[] = {
-    { 2, 244, 340, 81, "    NOW FOR SOME REAL FUN!", "          ON VA ENFIN\n       POUVOIR S'AMUSER!", "   AHORA NOS DIVERTIREMOS!", "        UND JETZT ZU ETWAS\n         RICHTIG SPA\xe1""IGEM!" },
+	{ 2, 244, 340, 81, "    NOW FOR SOME REAL FUN!", "          ON VA ENFIN\n       POUVOIR S'AMUSER!", "   AHORA NOS DIVERTIREMOS!", "        UND JETZT ZU ETWAS\n         RICHTIG SPA\xe1""IGEM!" },
 };
 
 static const struct ComicBlock block_p8_7 = { &poly_p8_b7, -1, -1, block_p8_b7_boxes, 1 };
 
 static const struct Polygon poly_p8_b8 = { {
-    { 324, 102 },
-    { 523, 102 },
-    { 558, 131 },
-    { 589, 135 },
-    { 589, 260 },
-    { 324, 260 },
+	{ 324, 102 },
+	{ 523, 102 },
+	{ 558, 131 },
+	{ 589, 135 },
+	{ 589, 260 },
+	{ 324, 260 },
 } };
 
 static const struct ComicBox block_p8_b8_boxes[] = {
-    { 4, 244, 227, 82, "     YEE-HAW, RIDE'M COWBOY!\n  I REALLY DON'T THINK YOU'RE\n INTO THIS, DEAR...I WONDER IF\nIT WOULD HELP IF I SHOVED ANOTHER\n      COIN IN YOUR SLOT!", "\n     YIPPY, ALLEZ GO! JE CROIS\n   VRAIMENT QUE VOUS N'AVEZ PAS\n  LA TETE A CE QUE VOUS FAITES,\n MON CHER! JE ME DEMANDE SI VOUS\n   N'AURIEZ PAS BESOIN D'UN\n        PETIT COUP DE MAIN!", "    VENGA, VAQUERO!\n  VEAMOS SI SABES JUGAR A\n ESTO... BAILARAS MEJOR SI\nPONGO OTRA MONEDA EN LA\n      MAQUINA?", "             JUHUUH, LOS,\n         REITE SIE ZU, COWBOY!\n  IRGENDWIE SCHEINT DIR DAS NICHT SO\n RICHTIG ZU GEFALLEN, SCHATZ. OB\nES WOHL HELFEN W\x9a""RDE, WENN ICH\n NOCH EINE WEITERE M\x9a""NZE IN DEINEN\n     SCHLITZ EINWERFE?" },
+	{ 4, 244, 227, 82, "     YEE-HAW, RIDE'M COWBOY!\n  I REALLY DON'T THINK YOU'RE\n INTO THIS, DEAR...I WONDER IF\nIT WOULD HELP IF I SHOVED ANOTHER\n      COIN IN YOUR SLOT!", "\n     YIPPY, ALLEZ GO! JE CROIS\n   VRAIMENT QUE VOUS N'AVEZ PAS\n  LA TETE A CE QUE VOUS FAITES,\n MON CHER! JE ME DEMANDE SI VOUS\n   N'AURIEZ PAS BESOIN D'UN\n        PETIT COUP DE MAIN!", "    VENGA, VAQUERO!\n  VEAMOS SI SABES JUGAR A\n ESTO... BAILARAS MEJOR SI\nPONGO OTRA MONEDA EN LA\n      MAQUINA?", "             JUHUUH, LOS,\n         REITE SIE ZU, COWBOY!\n  IRGENDWIE SCHEINT DIR DAS NICHT SO\n RICHTIG ZU GEFALLEN, SCHATZ. OB\nES WOHL HELFEN W\x9a""RDE, WENN ICH\n NOCH EINE WEITERE M\x9a""NZE IN DEINEN\n     SCHLITZ EINWERFE?" },
 };
 
 static const struct ComicBlock block_p8_8 = { &poly_p8_b8, -1, -1, block_p8_b8_boxes, 1 };
 
 static const struct Polygon poly_p8_b9 = { {
-    { 324, 260 },
-    { 461, 260 },
-    { 461, 399 },
-    { 324, 399 },
+	{ 324, 260 },
+	{ 461, 260 },
+	{ 461, 399 },
+	{ 324, 399 },
 } };
 
 static const struct ComicBox block_p8_b9_boxes[] = {
-    { 4, 244, 181, 258, "    AND TO THINK YOU WANTED\nTO STAY IN TONIGHT! OH, YOU\n         SILLY BOY!", "      ET DIRE QUE VOUS NE\n  PENSIEZ PAS SORTIR CE SOIR!\n        PAUVRE IMBECILE!", "  Y PENSAR QUE IBAS A\nQUEDARTE EN CASA HOY,\n    CHICO TONTO!", "    NA BITTE, UND DU WOLLTEST\nHEUTE ABEND ZU HAUSE BLEIBEN!\n         DUMMERLE....!" },
+	{ 4, 244, 181, 258, "    AND TO THINK YOU WANTED\nTO STAY IN TONIGHT! OH, YOU\n         SILLY BOY!", "      ET DIRE QUE VOUS NE\n  PENSIEZ PAS SORTIR CE SOIR!\n        PAUVRE IMBECILE!", "  Y PENSAR QUE IBAS A\nQUEDARTE EN CASA HOY,\n    CHICO TONTO!", "    NA BITTE, UND DU WOLLTEST\nHEUTE ABEND ZU HAUSE BLEIBEN!\n         DUMMERLE....!" },
 };
 
 static const struct ComicBlock block_p8_9 = { &poly_p8_b9, -1, -1, block_p8_b9_boxes, 1 };
 
 static const struct Polygon poly_p8_b10 = { {
-    { 461, 260 },
-    { 589, 260 },
-    { 589, 399 },
-    { 461, 399 },
+	{ 461, 260 },
+	{ 589, 260 },
+	{ 589, 399 },
+	{ 461, 399 },
 } };
 
 static const struct ComicBox block_p8_b10_boxes[] = {
-    { 4, 244, 314, 253, "      WELL I'M SURE WE COULD\n  HAVE MORE FUN, BUT IT IS A\nSCHOOL NIGHT...SO, I'LL JUST\n       MURDER YOU NOW!!", "      JE SUIS SURE QUE NOUS\n  POURRIONS NOUS AMUSER ENCORE\nPLUS, MAIS C'EST UNE NUIT SPECIALE...\n     ALORS JE VAIS VOUS TUER!", "   ME GUSTARIA DIVERTIRME\n  UN POCO MAS, PERO DEBO IRME,\n ASI QUE TE MATARE YA!", "\n        NAJA, ALSO ICH SCH\x8e""TZE,\n    WIR K\x99""NNTEN NOCH MEHR SPA\xe1""\n  MITEINANDER HABEN, ABER ICH MU\xe1""\n    ZEITIG HEIM. ALSO WERDE ICH\n      DICH JETZT EINFACH\n       KURZ UMBRINGEN!!" },
+	{ 4, 244, 314, 253, "      WELL I'M SURE WE COULD\n  HAVE MORE FUN, BUT IT IS A\nSCHOOL NIGHT...SO, I'LL JUST\n       MURDER YOU NOW!!", "      JE SUIS SURE QUE NOUS\n  POURRIONS NOUS AMUSER ENCORE\nPLUS, MAIS C'EST UNE NUIT SPECIALE...\n     ALORS JE VAIS VOUS TUER!", "   ME GUSTARIA DIVERTIRME\n  UN POCO MAS, PERO DEBO IRME,\n ASI QUE TE MATARE YA!", "\n        NAJA, ALSO ICH SCH\x8e""TZE,\n    WIR K\x99""NNTEN NOCH MEHR SPA\xe1""\n  MITEINANDER HABEN, ABER ICH MU\xe1""\n    ZEITIG HEIM. ALSO WERDE ICH\n      DICH JETZT EINFACH\n       KURZ UMBRINGEN!!" },
 };
 
 static const struct ComicBlock block_p8_10 = { &poly_p8_b10, -1, -1, block_p8_b10_boxes, 1 };
 
 static const struct ComicBlock page_8_blocks[] = {
-    block_p8_0,
-    block_p8_1,
-    block_p8_2,
-    block_p8_3,
-    block_p8_4,
-    block_p8_5,
-    block_p8_6,
-    block_p8_7,
-    block_p8_8,
-    block_p8_9,
-    block_p8_10,
+	block_p8_0,
+	block_p8_1,
+	block_p8_2,
+	block_p8_3,
+	block_p8_4,
+	block_p8_5,
+	block_p8_6,
+	block_p8_7,
+	block_p8_8,
+	block_p8_9,
+	block_p8_10,
 };
 
 static struct ComicPage page_8 = { "DARK/COMDATA/LEPG1516.SCN", 98, 48, 1, 0, page_8_blocks, 11 };
 
 static const struct Polygon poly_p9_b0 = { {
-    { 187, 0 },
-    { 306, 0 },
-    { 334, 35 },
-    { 311, 82 },
-    { 247, 95 },
-    { 187, 83 },
+	{ 187, 0 },
+	{ 306, 0 },
+	{ 334, 35 },
+	{ 311, 82 },
+	{ 247, 95 },
+	{ 187, 83 },
 } };
 
 static const struct ComicBox block_p9_b0_boxes[] = {
-    { 2, 255, 75, 40, "    BACK OFF, TOPHAT!", "\n        RECULE, TOPHAT!", "    ATRAS, DIVA!", "\n      ZUR\x9a""CK, ZYLINDERLADY!" },
+	{ 2, 255, 75, 40, "    BACK OFF, TOPHAT!", "\n        RECULE, TOPHAT!", "    ATRAS, DIVA!", "\n      ZUR\x9a""CK, ZYLINDERLADY!" },
 };
 
 static const struct ComicBlock block_p9_0 = { &poly_p9_b0, 99, 25, block_p9_b0_boxes, 1 };
 
 static const struct Polygon poly_p9_b1 = { {
-    { 187, 83 },
-    { 247, 95 },
-    { 308, 102 },
-    { 278, 153 },
-    { 289, 230 },
-    { 319, 261 },
-    { 255, 399 },
-    { 187, 399 },
+	{ 187, 83 },
+	{ 247, 95 },
+	{ 308, 102 },
+	{ 278, 153 },
+	{ 289, 230 },
+	{ 319, 261 },
+	{ 255, 399 },
+	{ 187, 399 },
 } };
 
 static const struct ComicBox block_p9_b1_boxes[] = {
-    { 2, 255, 10, 150, "        TOPHAT'S OUT FOR THE\n   COUNT. I FOUND DESPERADO AND I\n ASSUME THAT MOUND OF HAIR AND\nBLOOD IS WHAT'S LEFT OF WIDOWMARK.\n YOU SURE AS HELL WERE THOROUGH...\n         ARE YOU O.K.?", "\n        TOPHAT EST ELIMINEE.\n   J'AI TROUVE DESPERADO ET JE\nSUPPOSE QU'IL NE RESTE DE WIDOWMARK\nQUE CES TAS DE CHEVEUX COUVERTS DE\n     SANG. TU AS FAIT DU BEAU\n         TRAVAIL... \x80""A VA?", "      LA DIVA ESTA FUERA DE\n   COMBATE. VI A DESESPERADO Y\n SUPONGO QUE AQUELLOS RESTOS\n ES LO QUE QUEDA DE VIUDA NEGRA.\n PARECE QUE TE HAS DIVERTIDO...\n        ESTAS BIEN?", "        MISS ZYLINDERCHEN IST\n   AUSGEZ\x8e""HLT. ICH HABE SHOWDOWN\n   GEFUNDEN, UND ICH VERMUTE MAL,\n  DIESER HAUFEN BLUTIGER HAARE IST\n   ALLES, WAS VON DER SCHWARZEN\n   WITWE \x9a""BRIGGEBLIEBEN IST." },
-    { 2, 255, 10, 150, nullptr, nullptr, nullptr, "      ALSO DU ARBEITEST\n    SCHON VERDAMMT GR\x9a""NDLICH.\n       HE, BIST DU OK?" },
-    { 4, 246, 44, 208, "    I'M FINE! YOU'VE GOT A\nLOT OF NERVE, STILETTO, BUTTING\n  IN WHERE YOU DON'T BELONG!", "\n    JE VAIS TRES BIEN! TU AS\nDU CRAN, STILETTO D'INTERVENIR DANS\n   DES AFFAIRES QUI NE TE\n        REGARDENT PAS!", "   PERFECTAMENTE! NO SE\n POR QUE TE METES DONDE NO TE\n LLAMAN, STILETTO!", "\n    MIR GEHT'S GUT. DU HAST\nVIELLEICHT NERVEN, STILETTO, HIER\n  EINFACH REINZUPLATZEN, WO DU\n    GAR NICHTS VERLOREN HAST!" },
+	{ 2, 255, 10, 150, "        TOPHAT'S OUT FOR THE\n   COUNT. I FOUND DESPERADO AND I\n ASSUME THAT MOUND OF HAIR AND\nBLOOD IS WHAT'S LEFT OF WIDOWMARK.\n YOU SURE AS HELL WERE THOROUGH...\n         ARE YOU O.K.?", "\n        TOPHAT EST ELIMINEE.\n   J'AI TROUVE DESPERADO ET JE\nSUPPOSE QU'IL NE RESTE DE WIDOWMARK\nQUE CES TAS DE CHEVEUX COUVERTS DE\n     SANG. TU AS FAIT DU BEAU\n         TRAVAIL... \x80""A VA?", "      LA DIVA ESTA FUERA DE\n   COMBATE. VI A DESESPERADO Y\n SUPONGO QUE AQUELLOS RESTOS\n ES LO QUE QUEDA DE VIUDA NEGRA.\n PARECE QUE TE HAS DIVERTIDO...\n        ESTAS BIEN?", "        MISS ZYLINDERCHEN IST\n   AUSGEZ\x8e""HLT. ICH HABE SHOWDOWN\n   GEFUNDEN, UND ICH VERMUTE MAL,\n  DIESER HAUFEN BLUTIGER HAARE IST\n   ALLES, WAS VON DER SCHWARZEN\n   WITWE \x9a""BRIGGEBLIEBEN IST." },
+	{ 2, 255, 10, 150, nullptr, nullptr, nullptr, "      ALSO DU ARBEITEST\n    SCHON VERDAMMT GR\x9a""NDLICH.\n       HE, BIST DU OK?" },
+	{ 4, 246, 44, 208, "    I'M FINE! YOU'VE GOT A\nLOT OF NERVE, STILETTO, BUTTING\n  IN WHERE YOU DON'T BELONG!", "\n    JE VAIS TRES BIEN! TU AS\nDU CRAN, STILETTO D'INTERVENIR DANS\n   DES AFFAIRES QUI NE TE\n        REGARDENT PAS!", "   PERFECTAMENTE! NO SE\n POR QUE TE METES DONDE NO TE\n LLAMAN, STILETTO!", "\n    MIR GEHT'S GUT. DU HAST\nVIELLEICHT NERVEN, STILETTO, HIER\n  EINFACH REINZUPLATZEN, WO DU\n    GAR NICHTS VERLOREN HAST!" },
 };
 
 static const struct ComicBlock block_p9_1 = { &poly_p9_b1, -1, -1, block_p9_b1_boxes, 3 };
 
 static const struct Polygon poly_p9_b2 = { {
-    { 278, 153 },
-    { 309, 102 },
-    { 451, 102 },
-    { 451, 251 },
-    { 353, 277 },
-    { 289, 230 },
+	{ 278, 153 },
+	{ 309, 102 },
+	{ 451, 102 },
+	{ 451, 251 },
+	{ 353, 277 },
+	{ 289, 230 },
 } };
 
 static const struct ComicBox block_p9_b2_boxes[] = {
-    { 1, 255, 443, 168, "        I'M YOUR PARTNER! I\n   DON'T KNOW WHAT YOUR PROBLEM\n IS LATELY. YOU'RE OBVIOUSLY ON\nSOME EGO TRIP, TAKING OUT ALL THE\n BUTTHEADS SINGLE-HANDEDLY, BUT IF\n  I HADN'T SHOWN, TOPHAT WOULD'VE\n    FINISHED YOU OFF, HERO!", "       JE SUIS TA PARTENAIRE!\n   JE NE SAIS PAS QUEL EST TON\n     PROBLEME DEPUIS QUELQUE\n              TEMPS.", "        SOMOS SOCIOS! NO\n   SE QUE TE PASA ULTIMAMENTE.\n TE HAS VUELTO EGOISTA, NO CUENTAS\n CONMIGO PARA NADA... PERO DE NO\n SER POR MI, LA DIVA TE HUBIERA\n    MATADO, HEROE!", "       ICH BIN DEINE PARTNERIN!\n    ICH WEI\xe1"" NICHT, WAS IN LETZTER\n        ZEIT MIT DIR LOS IST!" },
-    { 1, 255, 443, 168, nullptr, "\n     TU ES APPAREMMENT DANS\n  UN TRIP SOLITAIRE, TU ESSAYES\n  D'ELIMINER TOUS LES MALFRATS\n  DE LA VILLE D'UNE SEULE MAIN.\n   MAIS SANS MON INTERVENTION,\n     TOPHAT T'AURAIT REGLE TON\n           COMPTE, HEROS! ", nullptr, "           DU BIST WOHL AUF\n       EINEM EGO-TRIP, DA\xe1"" DU\n   ALLE MISTBACKEN GANZ ALLEINE\n AUSSCHALTEN WILLST, ABER WENN ICH\n    NICHT AUFGETAUCHT W\x8e""RE, H\x8e""TTE\n        MISS ZYLINDERCHEN DICH\n          HELDEN ABSERVIERT!" },
+	{ 1, 255, 443, 168, "        I'M YOUR PARTNER! I\n   DON'T KNOW WHAT YOUR PROBLEM\n IS LATELY. YOU'RE OBVIOUSLY ON\nSOME EGO TRIP, TAKING OUT ALL THE\n BUTTHEADS SINGLE-HANDEDLY, BUT IF\n  I HADN'T SHOWN, TOPHAT WOULD'VE\n    FINISHED YOU OFF, HERO!", "       JE SUIS TA PARTENAIRE!\n   JE NE SAIS PAS QUEL EST TON\n     PROBLEME DEPUIS QUELQUE\n              TEMPS.", "        SOMOS SOCIOS! NO\n   SE QUE TE PASA ULTIMAMENTE.\n TE HAS VUELTO EGOISTA, NO CUENTAS\n CONMIGO PARA NADA... PERO DE NO\n SER POR MI, LA DIVA TE HUBIERA\n    MATADO, HEROE!", "       ICH BIN DEINE PARTNERIN!\n    ICH WEI\xe1"" NICHT, WAS IN LETZTER\n        ZEIT MIT DIR LOS IST!" },
+	{ 1, 255, 443, 168, nullptr, "\n     TU ES APPAREMMENT DANS\n  UN TRIP SOLITAIRE, TU ESSAYES\n  D'ELIMINER TOUS LES MALFRATS\n  DE LA VILLE D'UNE SEULE MAIN.\n   MAIS SANS MON INTERVENTION,\n     TOPHAT T'AURAIT REGLE TON\n           COMPTE, HEROS! ", nullptr, "           DU BIST WOHL AUF\n       EINEM EGO-TRIP, DA\xe1"" DU\n   ALLE MISTBACKEN GANZ ALLEINE\n AUSSCHALTEN WILLST, ABER WENN ICH\n    NICHT AUFGETAUCHT W\x8e""RE, H\x8e""TTE\n        MISS ZYLINDERCHEN DICH\n          HELDEN ABSERVIERT!" },
 };
 
 static const struct ComicBlock block_p9_2 = { &poly_p9_b2, -1, -1, block_p9_b2_boxes, 2 };
 
 static const struct Polygon poly_p9_b3 = { {
-    { 319, 261 },
-    { 353, 277 },
-    { 329, 399 },
-    { 255, 399 },
+	{ 319, 261 },
+	{ 353, 277 },
+	{ 329, 399 },
+	{ 255, 399 },
 } };
 
 static const struct ComicBox block_p9_b3_boxes[] = {
-    { 3, 246, 384, 308, "      YOU ARE FULL OF CRAP,\n  GIRL! I HAD EVERYTHING UNDER\nCONTROL...JUST DROP IT BECAUSE THIS\n     DISCUSSION IS OVER!", "      TU NE RACONTES QUE DES\n  CONNERIES, FEMME. JE CONTROLAIS\nPARFAITEMENT LA SITUATION... LAISSE\n  TOMBER, DE TOUTE MANIERE, CETTE\n      DISCUSSION EST TERMINEE!", "  TE DAS MUCHA IMPORTANCIA,\n MUCHACHITA! TODO ESTABA BAJO\n CONTROL... LARGATE YA! NO HAY\n NADA DE QUE HABLAR!", "          DU ERZ\x8e""HLST NUR\n  BL\x99""DSINN, STILETTO! ICH HATTE\nALLES WUNDERBAR UNTER KONTROLLE...\n  VERGI\xe1"" ES, DIE DISKUSSION IST\n             GELAUFEN!" },
+	{ 3, 246, 384, 308, "      YOU ARE FULL OF CRAP,\n  GIRL! I HAD EVERYTHING UNDER\nCONTROL...JUST DROP IT BECAUSE THIS\n     DISCUSSION IS OVER!", "      TU NE RACONTES QUE DES\n  CONNERIES, FEMME. JE CONTROLAIS\nPARFAITEMENT LA SITUATION... LAISSE\n  TOMBER, DE TOUTE MANIERE, CETTE\n      DISCUSSION EST TERMINEE!", "  TE DAS MUCHA IMPORTANCIA,\n MUCHACHITA! TODO ESTABA BAJO\n CONTROL... LARGATE YA! NO HAY\n NADA DE QUE HABLAR!", "          DU ERZ\x8e""HLST NUR\n  BL\x99""DSINN, STILETTO! ICH HATTE\nALLES WUNDERBAR UNTER KONTROLLE...\n  VERGI\xe1"" ES, DIE DISKUSSION IST\n             GELAUFEN!" },
 };
 
 static const struct ComicBlock block_p9_3 = { &poly_p9_b3, -1, -1, block_p9_b3_boxes, 1 };
 
 static const struct Polygon poly_p9_b4 = { {
-    { 353, 277 },
-    { 451, 251 },
-    { 451, 399 },
-    { 329, 399 },
+	{ 353, 277 },
+	{ 451, 251 },
+	{ 451, 399 },
+	{ 329, 399 },
 } };
 
 static const struct ComicBox block_p9_b4_boxes[] = {
-    { 4, 246, 198, 243, "      TAKE TOPHAT TO THE\n  POLICE, AND DON'T FORGET\nABOUT THE OTHER BODIES. I'M\n    GOING TO SHADOWLAIR.", "      EMMENE TOPHAT A LA\n  POLICE, ET N'OUBLIE PAS LES\n  AUTRES CADAVRES. JE VAIS A\n       L'ANTRE D'OMBRE.", "   LLEVA A LA DIVA A LA\n  POLICIA Y NO OLVIDES LOS\n DOS CADAVERES. YO VOY A\n LA CUEVA SOMBRIA.", "     BRING ZYLINDERCHEN ZUR\n  POLIZEI, UND VERGI\xe1"" DIE ANDEREN\nLEICHEN NICHT. ICH GEHE ZUM\n    SCHATTENHORT ZUR\x9a""CK." },
+	{ 4, 246, 198, 243, "      TAKE TOPHAT TO THE\n  POLICE, AND DON'T FORGET\nABOUT THE OTHER BODIES. I'M\n    GOING TO SHADOWLAIR.", "      EMMENE TOPHAT A LA\n  POLICE, ET N'OUBLIE PAS LES\n  AUTRES CADAVRES. JE VAIS A\n       L'ANTRE D'OMBRE.", "   LLEVA A LA DIVA A LA\n  POLICIA Y NO OLVIDES LOS\n DOS CADAVERES. YO VOY A\n LA CUEVA SOMBRIA.", "     BRING ZYLINDERCHEN ZUR\n  POLIZEI, UND VERGI\xe1"" DIE ANDEREN\nLEICHEN NICHT. ICH GEHE ZUM\n    SCHATTENHORT ZUR\x9a""CK." },
 };
 
 static const struct ComicBlock block_p9_4 = { &poly_p9_b4, -1, -1, block_p9_b4_boxes, 1 };
 
 static const struct ComicBlock page_9_blocks[] = {
-    block_p9_0,
-    block_p9_1,
-    block_p9_2,
-    block_p9_3,
-    block_p9_4,
+	block_p9_0,
+	block_p9_1,
+	block_p9_2,
+	block_p9_3,
+	block_p9_4,
 };
 
 static struct ComicPage page_9 = { "DARK/COMDATA/LEPG17.SCN", 98, 49, 1, 0, page_9_blocks, 5 };
 
 static const struct Polygon poly_p10_b0 = { {
-    { 59, 0 },
-    { 228, 0 },
-    { 222, 115 },
-    { 59, 115 },
+	{ 59, 0 },
+	{ 228, 0 },
+	{ 222, 115 },
+	{ 59, 115 },
 } };
 
 static const struct ComicBox block_p10_b0_boxes[] = {
-    { 0, 246, 69, 103, "SHADOWLAIR. LOCATED DEEP UNDERGROUND, THE REFORMED\nTEMPLE IS A REMNANT OF AN ERA PASSED. ONCE THE\nHALLOWED SHRINE OF AN ELITE SECRET ORDER OF\nINTELLIGENTSIA, THE TEMPLE NOW SERVES A SINGLE MAN\nAS THE BASTION OF MIDNIGHT... THE REFUGE OF SHADOW...\nTHE SANCTUARY OF DARKSHEER.", "L'ANTRE D'OMBRE.  ENFOUI DANS LES PROFONDEURS DE\nLA VILLE, LE TEMPLE REFORME TEMOIGNE DES SPLENDEURS\nDU PASSE. AUTREFOIS UTILISE COMME SANCTUAIRE POUR UN\nORDRE SECRET, LE TEMPLE NE SERT PLUS AUJOURD'HUI QU'A\nUN SEUL HOMME, QUI S'EN SERT DE BASTION NOCTURNE...\nLE REFUGE DE L'OMBRE... LE SANCTUAIRE DE DARKSHEER.", "LA CUEVA SOMBRIA. REFUGIO SUBTERRANEO HECHO A\nPARTIR DE UN TEMPLO ANTIGUO. LO QUE UNA VEZ FUE\nLA ELITE DE UNA ORDEN SECRETA DE ESTUDIOSOS,\nAHORA ES EL HOGAR DE UN SOLO HOMBRE, EL AMO DE\nLA NOCHE... EL SANTUARIO DE TENEBROSO.", "DER SCHATTENHORT. DER UNTERIRDISCHE EHEMALIGE\nTEMPEL IST DAS \x9a""BERBLEIBSEL EINER LANGE\nVERGANGENEN \x8e""RA. EINST DIENTE ER ALS HEILIGER\nSCHREIN EINES GEHEIMBUNDES DER GEISTIGEN ELITE.\nHEUTE DIENT ER NUR EINEM EINZIGEN MANN ALS BASTION\nDER MITTERNACHT...ALS HORT DER FINSTERNIS...\nALS ZUFLUCHT VON DARKSHEER." },
-    { 5, 246, 177, 102, "        LIQUIDARK... SO COLD IT\n    BURNS! IT'S ALWAYS LIKE THAT\n WHEN I'M INJURED. HOW MANY TIMES\nHAVE I DONE THIS? BAPTIZED IN THE\nICY WETNESS OF DISTILLED DARKNESS...\n      IT WORKS EVERY TIME...\n         SAVES MY SKIN.", "        LE LIQUIDARK... IL EST SI\n    FROID QU'IL BRULE! C'EST COMME\n \x80""A QUAND JE SUIS BLESSE, EN TOUT\nCAS. COMMENT AI-JE REUSSI? BAPTISE\nDANS L'HUMIDITE GLACIALE DES TENEBRES\n  DISTILLEES... IL FONCTIONNE TOUT\n       LE TEMPS... ET ME SAUVE\n                LA VIE.", "        LIQUIOSCURO... TAN FRIO\n    QUE QUEMA! SIEMPRE PASA CUANDO\n ESTOY HERIDO. CUANTAS VECES HE\nHECHO ESTO? ES MI BAUTISMO EN LA\nHELADA HUMEDAD DE LAS TINIEBLAS...\n   SIEMPRE FUNCIONA...\n   SIEMPRE ME SALVA.", "         DUSTER\x99""L... SO KALT,\n      DA\xe1"" ES BRENNT. SO IST ES\n  IMMER, WENN ICH VERLETZT BIN. WIE\n  OFT HABE ICH DAS SCHON GETAN?\n GETAUFT IN DER EISIGEN FEUCHTIGKEIT\n   DESTILLIERTER DUNKELHEIT...\n         FUNKTIONIERT JEDESMAL...\n              RETTET MICH." },
+	{ 0, 246, 69, 103, "SHADOWLAIR. LOCATED DEEP UNDERGROUND, THE REFORMED\nTEMPLE IS A REMNANT OF AN ERA PASSED. ONCE THE\nHALLOWED SHRINE OF AN ELITE SECRET ORDER OF\nINTELLIGENTSIA, THE TEMPLE NOW SERVES A SINGLE MAN\nAS THE BASTION OF MIDNIGHT... THE REFUGE OF SHADOW...\nTHE SANCTUARY OF DARKSHEER.", "L'ANTRE D'OMBRE.  ENFOUI DANS LES PROFONDEURS DE\nLA VILLE, LE TEMPLE REFORME TEMOIGNE DES SPLENDEURS\nDU PASSE. AUTREFOIS UTILISE COMME SANCTUAIRE POUR UN\nORDRE SECRET, LE TEMPLE NE SERT PLUS AUJOURD'HUI QU'A\nUN SEUL HOMME, QUI S'EN SERT DE BASTION NOCTURNE...\nLE REFUGE DE L'OMBRE... LE SANCTUAIRE DE DARKSHEER.", "LA CUEVA SOMBRIA. REFUGIO SUBTERRANEO HECHO A\nPARTIR DE UN TEMPLO ANTIGUO. LO QUE UNA VEZ FUE\nLA ELITE DE UNA ORDEN SECRETA DE ESTUDIOSOS,\nAHORA ES EL HOGAR DE UN SOLO HOMBRE, EL AMO DE\nLA NOCHE... EL SANTUARIO DE TENEBROSO.", "DER SCHATTENHORT. DER UNTERIRDISCHE EHEMALIGE\nTEMPEL IST DAS \x9a""BERBLEIBSEL EINER LANGE\nVERGANGENEN \x8e""RA. EINST DIENTE ER ALS HEILIGER\nSCHREIN EINES GEHEIMBUNDES DER GEISTIGEN ELITE.\nHEUTE DIENT ER NUR EINEM EINZIGEN MANN ALS BASTION\nDER MITTERNACHT...ALS HORT DER FINSTERNIS...\nALS ZUFLUCHT VON DARKSHEER." },
+	{ 5, 246, 177, 102, "        LIQUIDARK... SO COLD IT\n    BURNS! IT'S ALWAYS LIKE THAT\n WHEN I'M INJURED. HOW MANY TIMES\nHAVE I DONE THIS? BAPTIZED IN THE\nICY WETNESS OF DISTILLED DARKNESS...\n      IT WORKS EVERY TIME...\n         SAVES MY SKIN.", "        LE LIQUIDARK... IL EST SI\n    FROID QU'IL BRULE! C'EST COMME\n \x80""A QUAND JE SUIS BLESSE, EN TOUT\nCAS. COMMENT AI-JE REUSSI? BAPTISE\nDANS L'HUMIDITE GLACIALE DES TENEBRES\n  DISTILLEES... IL FONCTIONNE TOUT\n       LE TEMPS... ET ME SAUVE\n                LA VIE.", "        LIQUIOSCURO... TAN FRIO\n    QUE QUEMA! SIEMPRE PASA CUANDO\n ESTOY HERIDO. CUANTAS VECES HE\nHECHO ESTO? ES MI BAUTISMO EN LA\nHELADA HUMEDAD DE LAS TINIEBLAS...\n   SIEMPRE FUNCIONA...\n   SIEMPRE ME SALVA.", "         DUSTER\x99""L... SO KALT,\n      DA\xe1"" ES BRENNT. SO IST ES\n  IMMER, WENN ICH VERLETZT BIN. WIE\n  OFT HABE ICH DAS SCHON GETAN?\n GETAUFT IN DER EISIGEN FEUCHTIGKEIT\n   DESTILLIERTER DUNKELHEIT...\n         FUNKTIONIERT JEDESMAL...\n              RETTET MICH." },
 };
 
 static const struct ComicBlock block_p10_0 = { &poly_p10_b0, -1, -1, block_p10_b0_boxes, 2 };
 
 static const struct Polygon poly_p10_b1 = { {
-    { 59, 115 },
-    { 222, 115 },
-    { 230, 286 },
-    { 59, 286 },
+	{ 59, 115 },
+	{ 222, 115 },
+	{ 230, 286 },
+	{ 59, 286 },
 } };
 
 static const struct ComicBox block_p10_b1_boxes[] = {
-    { 7, 246, 153, 252, "        REMEMBERING... HOW IT\n   ALL STARTED. I WAS JUST A PUNK\n ORPHAN. FATHER DESMOND... WHAT A\nSALESMAN! HE HAD US ALL JUMPING TO\n BECOME WARDS... TO HELP CLEAN UP\n   THE STREETS OF NOCTROPOLIS.\n     BIRTH OF A VIGILANTE...", "          JE ME SOUVIENS...\n    COMMENT TOUT A COMMENCE.\n J'ETAIS ORPHELIN. LE PERE DESMOND...\nQUEL VENDEUR! NOUS VOULIONS TOUS\nDEVENIR DES PUPILLES... POUR L'AIDER\n     A NETTOYER LES RUES DE\n     NOCTROPOLIS. LA NAISSANCE\n          D'UN VIGILE....", "        RECUERDO COMO EMPEZO\n  TODO. YO ERA UN PILLUELO DE LAS\n CALLES. EL PADRE DESMOND... QUE\n TIO! NOS TENIA A TODOS SALTANDO\n PARA CONVERTIRNOS EN GUARDIANES Y\n   LIMPIAR LAS CALLES.\n     ASI ME HICE VIGILANTE...", "     ERINNERUNGEN...WIE ALLES\n     BEGANN. ICH WAR NUR EIN\n     STREUNENDER WAISENKNABE." },
-    { 7, 246, 153, 252, nullptr, nullptr, nullptr, "          VATER DESMOND...\n   WAS F\x9a""R EIN VERK\x8e""UFER! BRACHTE\n  UNS ALLE DAZU, NICHTS SEHNLICHER\n     ZU WOLLEN, ALS DER WEHR\nANZUGEH\x99""REN... DIE STRA\xe1""EN AUFR\x8e""UMEN.\n       GEBURT EINER B\x9a""RGERWEHR..." },
+	{ 7, 246, 153, 252, "        REMEMBERING... HOW IT\n   ALL STARTED. I WAS JUST A PUNK\n ORPHAN. FATHER DESMOND... WHAT A\nSALESMAN! HE HAD US ALL JUMPING TO\n BECOME WARDS... TO HELP CLEAN UP\n   THE STREETS OF NOCTROPOLIS.\n     BIRTH OF A VIGILANTE...", "          JE ME SOUVIENS...\n    COMMENT TOUT A COMMENCE.\n J'ETAIS ORPHELIN. LE PERE DESMOND...\nQUEL VENDEUR! NOUS VOULIONS TOUS\nDEVENIR DES PUPILLES... POUR L'AIDER\n     A NETTOYER LES RUES DE\n     NOCTROPOLIS. LA NAISSANCE\n          D'UN VIGILE....", "        RECUERDO COMO EMPEZO\n  TODO. YO ERA UN PILLUELO DE LAS\n CALLES. EL PADRE DESMOND... QUE\n TIO! NOS TENIA A TODOS SALTANDO\n PARA CONVERTIRNOS EN GUARDIANES Y\n   LIMPIAR LAS CALLES.\n     ASI ME HICE VIGILANTE...", "     ERINNERUNGEN...WIE ALLES\n     BEGANN. ICH WAR NUR EIN\n     STREUNENDER WAISENKNABE." },
+	{ 7, 246, 153, 252, nullptr, nullptr, nullptr, "          VATER DESMOND...\n   WAS F\x9a""R EIN VERK\x8e""UFER! BRACHTE\n  UNS ALLE DAZU, NICHTS SEHNLICHER\n     ZU WOLLEN, ALS DER WEHR\nANZUGEH\x99""REN... DIE STRA\xe1""EN AUFR\x8e""UMEN.\n       GEBURT EINER B\x9a""RGERWEHR..." },
 };
 
 static const struct ComicBlock block_p10_1 = { &poly_p10_b1, -1, -1, block_p10_b1_boxes, 2 };
 
 static const struct Polygon poly_p10_b2 = { {
-    { 193, 286 },
-    { 326, 286 },
-    { 326, 399 },
-    { 226, 399 },
+	{ 193, 286 },
+	{ 326, 286 },
+	{ 326, 399 },
+	{ 226, 399 },
 } };
 
 static const struct ComicBox block_p10_b2_boxes[] = {
-    { 7, 246, 196, 276, "         YEARS LATER, POKING\n  AROUND: SUBTERRAINIA... STUMBLED\nACROSS THE BROTHERHOOD'S TEMPLE.\nMAN, I DIDN'T KNOW WHAT I'D FOUND!\n       ...TOOK IT SLOW...\n        WORKED IN SECRET...", "         DES ANNEES PLUS TARD,\n  EN EXPLORANT SUBTERRAINIA... J'AI\n RETROUVE PAR HASARD LE TEMPLE DE\nLA CONFRERIE. MAIS JE NE SAVAIS PAS\n CE QUE JE VENAIS DE DECOUVRIR! IL\n    M'A FALLU LONGTEMPS... J'AI\n     TRAVAILLE DANS LE PLUS\n             GRAND SECRET....", "    Y LUEGO DESCUBRI A\n  SUBTERRAINIA Y A ESTE\n TEMPLO OLVIDADO.\n AUN NO SABIA LO QUE HABIA\n   HALLADO! PERO \n   TRABAJE EN SECRETO...", "        JAHRE SP\x8e""TER, ALS ICH\n   IN SUBTERRAINIA HERUMST\x99""BERTE...\n  STOLPERTE \x9a""BER DEN TEMPEL DER\n  BRUDERSCHAFT. MANN, ICH WU\xe1""TE\n     JA NICHT MAL, WAS ICH\n      DA GEFUNDEN HATTE! LIE\xe1""\n       MIR ZEIT...ARBEITETE\n           IM GEHEIMEN..." },
+	{ 7, 246, 196, 276, "         YEARS LATER, POKING\n  AROUND: SUBTERRAINIA... STUMBLED\nACROSS THE BROTHERHOOD'S TEMPLE.\nMAN, I DIDN'T KNOW WHAT I'D FOUND!\n       ...TOOK IT SLOW...\n        WORKED IN SECRET...", "         DES ANNEES PLUS TARD,\n  EN EXPLORANT SUBTERRAINIA... J'AI\n RETROUVE PAR HASARD LE TEMPLE DE\nLA CONFRERIE. MAIS JE NE SAVAIS PAS\n CE QUE JE VENAIS DE DECOUVRIR! IL\n    M'A FALLU LONGTEMPS... J'AI\n     TRAVAILLE DANS LE PLUS\n             GRAND SECRET....", "    Y LUEGO DESCUBRI A\n  SUBTERRAINIA Y A ESTE\n TEMPLO OLVIDADO.\n AUN NO SABIA LO QUE HABIA\n   HALLADO! PERO \n   TRABAJE EN SECRETO...", "        JAHRE SP\x8e""TER, ALS ICH\n   IN SUBTERRAINIA HERUMST\x99""BERTE...\n  STOLPERTE \x9a""BER DEN TEMPEL DER\n  BRUDERSCHAFT. MANN, ICH WU\xe1""TE\n     JA NICHT MAL, WAS ICH\n      DA GEFUNDEN HATTE! LIE\xe1""\n       MIR ZEIT...ARBEITETE\n           IM GEHEIMEN..." },
 };
 
 static const struct ComicBlock block_p10_2 = { &poly_p10_b2, -1, -1, block_p10_b2_boxes, 1 };
 
 static const struct Polygon poly_p10_b3 = { {
-    { 326, 0 },
-    { 491, 0 },
-    { 491, 93 },
-    { 448, 93 },
-    { 448, 81 },
-    { 337, 81 },
-    { 337, 93 },
-    { 326, 93 },
+	{ 326, 0 },
+	{ 491, 0 },
+	{ 491, 93 },
+	{ 448, 93 },
+	{ 448, 81 },
+	{ 337, 81 },
+	{ 337, 93 },
+	{ 326, 93 },
 } };
 
 static const struct ComicBox block_p10_b3_boxes[] = {
-    { 6, 246, 195, 85, "        I'VE PROBABLY READ IT A\n   THOUSAND TIMES... THE BIG BOOK...\n     MY BIBLE AND BLUEPRINT: A\n    COMPENDIUM OF KNOWLEDGE AND\n   THEOREMS AS RESEARCHED BY THE\n      BROTHERHOOD OF THE NIGHT.", "\n        J'AI PROBABLEMENT DU LE\n    LIRE UN MILLIER DE FOIS... LE\n   GRAND LIVRE... MA BIBLE... UN\n CONCENTRE DE CONNAISSANCE ET DE\n   THEOREMES TEL QUE LE DICTE\n       LA CONFRERIE DE LA NUIT.", "        LEI EL LIBRO MAS DE\n   MIL VECES... FUE MI BIBLIA...\n     CONTENIA TODOS LOS \n   DESCUBRIMIENTOS DE LA \n     HERMANDAD DE LA NOCHE.", "           ICH MU\xe1"" ES SCHON\n    HUNDERTMAL GELESEN HABEN...\n  DAS GROSSE BUCH... MEINE BIBEL UND\n GEBRAUCHSANWEISUNG - DIE SAMMLUNG\n  ALLEN WISSENS UND DER THEOREME\n       DER BRUDERSCHAFT DER NACHT." },
+	{ 6, 246, 195, 85, "        I'VE PROBABLY READ IT A\n   THOUSAND TIMES... THE BIG BOOK...\n     MY BIBLE AND BLUEPRINT: A\n    COMPENDIUM OF KNOWLEDGE AND\n   THEOREMS AS RESEARCHED BY THE\n      BROTHERHOOD OF THE NIGHT.", "\n        J'AI PROBABLEMENT DU LE\n    LIRE UN MILLIER DE FOIS... LE\n   GRAND LIVRE... MA BIBLE... UN\n CONCENTRE DE CONNAISSANCE ET DE\n   THEOREMES TEL QUE LE DICTE\n       LA CONFRERIE DE LA NUIT.", "        LEI EL LIBRO MAS DE\n   MIL VECES... FUE MI BIBLIA...\n     CONTENIA TODOS LOS \n   DESCUBRIMIENTOS DE LA \n     HERMANDAD DE LA NOCHE.", "           ICH MU\xe1"" ES SCHON\n    HUNDERTMAL GELESEN HABEN...\n  DAS GROSSE BUCH... MEINE BIBEL UND\n GEBRAUCHSANWEISUNG - DIE SAMMLUNG\n  ALLEN WISSENS UND DER THEOREME\n       DER BRUDERSCHAFT DER NACHT." },
 };
 
 static const struct ComicBlock block_p10_3 = { &poly_p10_b3, -1, -1, block_p10_b3_boxes, 1 };
 
 static const struct Polygon poly_p10_b4 = { {
-    { 491, 0 },
-    { 593, 0 },
-    { 593, 157 },
-    { 530, 143 },
-    { 471, 151 },
-    { 471, 93 },
-    { 491, 93 },
+	{ 491, 0 },
+	{ 593, 0 },
+	{ 593, 157 },
+	{ 530, 143 },
+	{ 471, 151 },
+	{ 471, 93 },
+	{ 491, 93 },
 } };
 
 static const struct ComicBox block_p10_b4_boxes[] = {
-    { 6, 246, 330, 88, "        THE BOOK TAUGHT ME\n   HOW TO DISTILL LIQUIDARK. I\n PUT WHAT I LEARNED TO GOOD USE...\nSPENT COUNTLESS HOURS IN THAT DAMN\n LAB... UNTIL I FOUND A WAY TO BIND\n  THE LIQUIDARK TO FABRIC AND\n           BODY ARMOR.", "        LE LIVRE M'A APPRIS\n   A DISTILLER LE LIQUIDARK. J'AI\n MIS DE MON MIEUX CES CONNAISSANCES\nEN PRATIQUE... DES HEURES INFINIES\n DANS CE LABO AVANT DE... TROUVER\n  UN MOYEN DE LIER LE LIQUIDARK\n    ET LE TISSU DE MON COSTUME.", "        EN EL LIBRO VI COMO\n   DESTILAR EL LIQUIOSCIRO. LE\n DI UN BUEN USO... PASE MUCHAS\nHORAS EN EL LABORATORIO HASTA QUE\n  PUDE CONSTRUIR CON EL MI\n           ARMADURA.", "        DAS BUCH LEHRTE MICH,\n     DUSTER\x99""L ZU DESTILLIEREN.\n   ICH WANDTE MEIN WISSEN GUT AN,\n   VERBRACHTE ENDLOSE STUNDEN IN\n  DIESEM VERDAMMTEN LABOR, BIS ICH\n      EINEN WEG FAND, DUSTER\x99""L\n        AN GEWEBE ZU BINDEN." },
+	{ 6, 246, 330, 88, "        THE BOOK TAUGHT ME\n   HOW TO DISTILL LIQUIDARK. I\n PUT WHAT I LEARNED TO GOOD USE...\nSPENT COUNTLESS HOURS IN THAT DAMN\n LAB... UNTIL I FOUND A WAY TO BIND\n  THE LIQUIDARK TO FABRIC AND\n           BODY ARMOR.", "        LE LIVRE M'A APPRIS\n   A DISTILLER LE LIQUIDARK. J'AI\n MIS DE MON MIEUX CES CONNAISSANCES\nEN PRATIQUE... DES HEURES INFINIES\n DANS CE LABO AVANT DE... TROUVER\n  UN MOYEN DE LIER LE LIQUIDARK\n    ET LE TISSU DE MON COSTUME.", "        EN EL LIBRO VI COMO\n   DESTILAR EL LIQUIOSCIRO. LE\n DI UN BUEN USO... PASE MUCHAS\nHORAS EN EL LABORATORIO HASTA QUE\n  PUDE CONSTRUIR CON EL MI\n           ARMADURA.", "        DAS BUCH LEHRTE MICH,\n     DUSTER\x99""L ZU DESTILLIEREN.\n   ICH WANDTE MEIN WISSEN GUT AN,\n   VERBRACHTE ENDLOSE STUNDEN IN\n  DIESEM VERDAMMTEN LABOR, BIS ICH\n      EINEN WEG FAND, DUSTER\x99""L\n        AN GEWEBE ZU BINDEN." },
 };
 
 static const struct ComicBlock block_p10_4 = { &poly_p10_b4, -1, -1, block_p10_b4_boxes, 1 };
 
 static const struct Polygon poly_p10_b5 = { {
-    { 326, 93 },
-    { 337, 93 },
-    { 337, 81 },
-    { 448, 81 },
-    { 448, 93 },
-    { 471, 93 },
-    { 471, 151 },
-    { 438, 173 },
-    { 426, 200 },
-    { 326, 200 },
+	{ 326, 93 },
+	{ 337, 93 },
+	{ 337, 81 },
+	{ 448, 81 },
+	{ 448, 93 },
+	{ 471, 93 },
+	{ 471, 151 },
+	{ 438, 173 },
+	{ 426, 200 },
+	{ 326, 200 },
 } };
 
 static const struct ComicBox block_p10_b5_boxes[] = {
-    { 5, 246, 439, 161, "         THE NOCTROGLYPH...\n   IT TOOK WEEKS JUST TO FIGURE\n OUT WHAT THE HELL IT WAS, LET\nALONE HOW TO WORK IT! POWERFUL...\n  SAVED MY BUTT MORE THAN A\n           FEW TIMES...", "\n         LE NOCTROGLYPHE...\n   IL M'A FALLU DES SEMAINES POUR\n COMPRENDRE DE QUOI IL S'AGISSAIT,\nSANS MEME PARLER DE L'UTILISER! MAIS\n    IL M'A SAUVE LA VIE PLUS\n          D'UNE FOIS...", "     EL NOCTROGLIFO...\n   ME LLEVO SEMANAS DESCUBRIR\n LO QUE ERA Y HACERLO FUNCIONAR.\n ES MUY PODEROSO... ME HA SACADO\n DE APUROS MAS DE UNA VEZ...", "         DER NOCTROGLYPH...\n    ICH HABE WOCHEN GEBRAUCHT,\n  NUR UM HERAUSZUFINDEN, WAS DAS\n IST, GAR NICHT DAVON ZU REDEN, WIE\n  ER FUNKTIONIERT. M\x8e""CHTIG....HAT\n     MEINEN HINTERN MEHR ALS\n    NUR EIN PAARMAL GERETTET." },
+	{ 5, 246, 439, 161, "         THE NOCTROGLYPH...\n   IT TOOK WEEKS JUST TO FIGURE\n OUT WHAT THE HELL IT WAS, LET\nALONE HOW TO WORK IT! POWERFUL...\n  SAVED MY BUTT MORE THAN A\n           FEW TIMES...", "\n         LE NOCTROGLYPHE...\n   IL M'A FALLU DES SEMAINES POUR\n COMPRENDRE DE QUOI IL S'AGISSAIT,\nSANS MEME PARLER DE L'UTILISER! MAIS\n    IL M'A SAUVE LA VIE PLUS\n          D'UNE FOIS...", "     EL NOCTROGLIFO...\n   ME LLEVO SEMANAS DESCUBRIR\n LO QUE ERA Y HACERLO FUNCIONAR.\n ES MUY PODEROSO... ME HA SACADO\n DE APUROS MAS DE UNA VEZ...", "         DER NOCTROGLYPH...\n    ICH HABE WOCHEN GEBRAUCHT,\n  NUR UM HERAUSZUFINDEN, WAS DAS\n IST, GAR NICHT DAVON ZU REDEN, WIE\n  ER FUNKTIONIERT. M\x8e""CHTIG....HAT\n     MEINEN HINTERN MEHR ALS\n    NUR EIN PAARMAL GERETTET." },
 };
 
 static const struct ComicBlock block_p10_5 = { &poly_p10_b5, -1, -1, block_p10_b5_boxes, 1 };
 
 static const struct Polygon poly_p10_b6 = { {
-    { 426, 200 },
-    { 438, 173 },
-    { 471, 151 },
-    { 530, 143 },
-    { 593, 157 },
-    { 593, 245 },
-    { 593, 233 },
-    { 491, 245 },
-    { 443, 233 },
+	{ 426, 200 },
+	{ 438, 173 },
+	{ 471, 151 },
+	{ 530, 143 },
+	{ 593, 157 },
+	{ 593, 245 },
+	{ 593, 233 },
+	{ 491, 245 },
+	{ 443, 233 },
 } };
 
 static const struct ComicBox block_p10_b6_boxes[] = {
-    { 6, 246, 279, 203, "        THOUGHT I WAS READY...\n  GONE AND FORGED MYSELF INTO\nONE BAD-ASS HERO! THEN I MET HER\n IN A BLIND ALLEY ONE NIGHT...\n  THOUGHT SHE WAS SOME PUNK THIEF...\n           STILETTO...", "        JE CROYAIS ETRE PRET...\n   JE ME SUIS FORGE UNE IMAGE DE\n HEROS PEU COMMODE! ET PUIS UN\nJOUR, JE L'AI RENCONTREE DANS UNE\n    ALLEE SOMBRE... JE CROYAIS\n     QUE C'ETAIT UNE VOLEUSE...\n            STILETTO....", "    CREI ESTAR LISTO...\n  YA ME HABIA FRAGUADO COMO\n SUPER-HEROE! Y ENTONCES LA\n ENCONTRE A ELLA, A\n ESA VAGABUNDA...\n           STILETTO...", "        DACHTE, ICH W\x8e""RE BEREIT...\n    MACHTE AUS MIR SELBST EINEN\n   VERDAMMTEN SUPERHELDEN. UND\n DANN, EINES ABENDS IN EINER DUNKLEN\n    SEITENSTRA\xe1""E, TRAF ICH SIE...\n     DACHTE, SIE W\x8e""RE NUR\n     EINE DIEBIN...STILETTO..." },
+	{ 6, 246, 279, 203, "        THOUGHT I WAS READY...\n  GONE AND FORGED MYSELF INTO\nONE BAD-ASS HERO! THEN I MET HER\n IN A BLIND ALLEY ONE NIGHT...\n  THOUGHT SHE WAS SOME PUNK THIEF...\n           STILETTO...", "        JE CROYAIS ETRE PRET...\n   JE ME SUIS FORGE UNE IMAGE DE\n HEROS PEU COMMODE! ET PUIS UN\nJOUR, JE L'AI RENCONTREE DANS UNE\n    ALLEE SOMBRE... JE CROYAIS\n     QUE C'ETAIT UNE VOLEUSE...\n            STILETTO....", "    CREI ESTAR LISTO...\n  YA ME HABIA FRAGUADO COMO\n SUPER-HEROE! Y ENTONCES LA\n ENCONTRE A ELLA, A\n ESA VAGABUNDA...\n           STILETTO...", "        DACHTE, ICH W\x8e""RE BEREIT...\n    MACHTE AUS MIR SELBST EINEN\n   VERDAMMTEN SUPERHELDEN. UND\n DANN, EINES ABENDS IN EINER DUNKLEN\n    SEITENSTRA\xe1""E, TRAF ICH SIE...\n     DACHTE, SIE W\x8e""RE NUR\n     EINE DIEBIN...STILETTO..." },
 };
 
 static const struct ComicBlock block_p10_6 = { &poly_p10_b6, -1, -1, block_p10_b6_boxes, 1 };
 
 static const struct Polygon poly_p10_b7 = { {
-    { 326, 200 },
-    { 426, 200 },
-    { 426, 312 },
-    { 395, 373 },
-    { 326, 399 },
+	{ 326, 200 },
+	{ 426, 200 },
+	{ 426, 312 },
+	{ 395, 373 },
+	{ 326, 399 },
 } };
 
 static const struct ComicBox block_p10_b7_boxes[] = {
-    { 8, 246, 156, 213, "        SHE LAID ME OUT FLAT!\n   BEFORE I KNEW WHAT'D HAPPENED,\nSHE HAD A BLADE AT MY THROAT... SHE\n LIKED THE COSTUME THOUGH. GOOD\n THING TOO, OR SHE'D PROBABLY HAVE\n      GUTTED ME RIGHT THERE.", "        ELLE M'A EU! AVANT QUE\n   JE PUISSE COMPRENDRE CE QUI SE\n PASSAIT, ELLE AVAIT DEJA POSE SA\n LAME SUR MA GORGE! ELLE AIMAIT\n  MON COSTUME.. HEUREUSEMENT,\n  SINON ELLE M'AURAIT EGORGE\n             SUR PLACE.", "     ME HIZO CAER Y, ANTES\n DE SABER LO QUE OCURRIA,\n APOYO UN CUCHILLO EN MI GARGANTA.\n QUERIA ROBARME EL DISFRAZ.\n  LA CONVENCI PARA HABLAR.", "         SIE LEGTE MICH AUFS\n    KREUZ! BEVOR ICH WU\xe1""TE, WAS\n MIR GESCHAH, HATTE ICH IHR MESSER\nAN DER KEHLE! ABER DER ANZUG GEFIEL\n IHR; WAS F\x9a""R EIN GL\x9a""CK, SONST H\x8e""TTE\n    SIE MICH WOHL AN ORT UND\n         STELLE AUSGEWEIDET." },
+	{ 8, 246, 156, 213, "        SHE LAID ME OUT FLAT!\n   BEFORE I KNEW WHAT'D HAPPENED,\nSHE HAD A BLADE AT MY THROAT... SHE\n LIKED THE COSTUME THOUGH. GOOD\n THING TOO, OR SHE'D PROBABLY HAVE\n      GUTTED ME RIGHT THERE.", "        ELLE M'A EU! AVANT QUE\n   JE PUISSE COMPRENDRE CE QUI SE\n PASSAIT, ELLE AVAIT DEJA POSE SA\n LAME SUR MA GORGE! ELLE AIMAIT\n  MON COSTUME.. HEUREUSEMENT,\n  SINON ELLE M'AURAIT EGORGE\n             SUR PLACE.", "     ME HIZO CAER Y, ANTES\n DE SABER LO QUE OCURRIA,\n APOYO UN CUCHILLO EN MI GARGANTA.\n QUERIA ROBARME EL DISFRAZ.\n  LA CONVENCI PARA HABLAR.", "         SIE LEGTE MICH AUFS\n    KREUZ! BEVOR ICH WU\xe1""TE, WAS\n MIR GESCHAH, HATTE ICH IHR MESSER\nAN DER KEHLE! ABER DER ANZUG GEFIEL\n IHR; WAS F\x9a""R EIN GL\x9a""CK, SONST H\x8e""TTE\n    SIE MICH WOHL AN ORT UND\n         STELLE AUSGEWEIDET." },
 };
 
 static const struct ComicBlock block_p10_7 = { &poly_p10_b7, -1, -1, block_p10_b7_boxes, 1 };
 
 static const struct Polygon poly_p10_b8 = { {
-    { 326, 399 },
-    { 395, 373 },
-    { 426, 233 },
-    { 492, 233 },
-    { 494, 312 },
-    { 517, 379 },
-    { 593, 399 },
+	{ 326, 399 },
+	{ 395, 373 },
+	{ 426, 233 },
+	{ 492, 233 },
+	{ 494, 312 },
+	{ 517, 379 },
+	{ 593, 399 },
 } };
 
 static const struct ComicBox block_p10_b8_boxes[] = {
-    { 8, 246, 240, 282, "        I TOOK HER BACK TO\n  SHADOWLAIR WHERE SHE AGREED TO\n BECOME MY PARTNER. WE PROWLED\nTHE STREETS TOGETHER. UNARMED, SHE'S\n VICIOUS, BUT WITH THOSE BLADES,\n   SHE'S DOWNRIGHT LETHAL! WE\n    BECAME A FORMIDABLE TEAM...\n       DARKSHEER AND STILETTO.", "         JE L'AI RAMENEE A\n    L'ANTRE D'OMBRE, OU ELLE\n ACCEPTA DE DEVENIR MA PARTENAIRE.\n   NOUS AVONS ECUME LES RUES\nENSEMBLE... SANS ARME, ELLE EST\n   RUSEE, MAIS AVEC SES COUTEAUX,\n         ELLE EST MORTELLE!", "        LA TRAJE A LA CUEVA\n  SOMBRIA Y ACEPTO SER MI SOCIA.\n JUNTOS RECORRIMOS LAS CALLES.\n ES MORTAL CON SUS CUCHILLOS.\n ERAMOS UN GRAN EQUIPO...\n       TENEBROSO Y STILETTO.", "      ICH NAHM SIE MIT ZUR\x9a""CK\n  ZUM SCHATTENHORT, UND SIE WILLIGTE\n  EIN, MEINE PARTNERIN ZU WERDEN." },
-    { 8, 246, 240, 282, nullptr, "          NOUS FORMIONS\n        UNE EQUIPE UNIQUE...\n        DARKSHEER ET STILETTO.", nullptr, "            WIR TRIEBEN UNS\n    ZUSAMMEN RUM. UNBEWAFFNET\n  IST SIE SCHON GEF\x8e""HRLICH, ABER\n MIT DIESEN KLINGEN IST SIE EINFACH\n    T\x99""DLICH! WIR WURDEN EIN\n       UNSCHLAGBARES TEAM...\n       DARKSHEER UND STILETTO." },
+	{ 8, 246, 240, 282, "        I TOOK HER BACK TO\n  SHADOWLAIR WHERE SHE AGREED TO\n BECOME MY PARTNER. WE PROWLED\nTHE STREETS TOGETHER. UNARMED, SHE'S\n VICIOUS, BUT WITH THOSE BLADES,\n   SHE'S DOWNRIGHT LETHAL! WE\n    BECAME A FORMIDABLE TEAM...\n       DARKSHEER AND STILETTO.", "         JE L'AI RAMENEE A\n    L'ANTRE D'OMBRE, OU ELLE\n ACCEPTA DE DEVENIR MA PARTENAIRE.\n   NOUS AVONS ECUME LES RUES\nENSEMBLE... SANS ARME, ELLE EST\n   RUSEE, MAIS AVEC SES COUTEAUX,\n         ELLE EST MORTELLE!", "        LA TRAJE A LA CUEVA\n  SOMBRIA Y ACEPTO SER MI SOCIA.\n JUNTOS RECORRIMOS LAS CALLES.\n ES MORTAL CON SUS CUCHILLOS.\n ERAMOS UN GRAN EQUIPO...\n       TENEBROSO Y STILETTO.", "      ICH NAHM SIE MIT ZUR\x9a""CK\n  ZUM SCHATTENHORT, UND SIE WILLIGTE\n  EIN, MEINE PARTNERIN ZU WERDEN." },
+	{ 8, 246, 240, 282, nullptr, "          NOUS FORMIONS\n        UNE EQUIPE UNIQUE...\n        DARKSHEER ET STILETTO.", nullptr, "            WIR TRIEBEN UNS\n    ZUSAMMEN RUM. UNBEWAFFNET\n  IST SIE SCHON GEF\x8e""HRLICH, ABER\n MIT DIESEN KLINGEN IST SIE EINFACH\n    T\x99""DLICH! WIR WURDEN EIN\n       UNSCHLAGBARES TEAM...\n       DARKSHEER UND STILETTO." },
 };
 
 static const struct ComicBlock block_p10_8 = { &poly_p10_b8, -1, -1, block_p10_b8_boxes, 2 };
 
 static const struct Polygon poly_p10_b9 = { {
-    { 491, 245 },
-    { 593, 245 },
-    { 593, 399 },
-    { 517, 379 },
-    { 494, 312 },
+	{ 491, 245 },
+	{ 593, 245 },
+	{ 593, 399 },
+	{ 517, 379 },
+	{ 494, 312 },
 } };
 
 static const struct ComicBox block_p10_b9_boxes[] = {
-    { 8, 246, 305, 212, "        WE'VE BEEN TOGETHER\n   EVER SINCE... WELL, EXCEPT\n LATELY... I GUESS SHE HAS A RIGHT\nTO BE TICKED THAT I'VE BEEN WORKING\n ALONE. THE VENOM'S GONE... AND THE\n   BULLET SCORE'S HEALED... LIKE I\n    SAID, IT WORKS EVERY TIME.", "\n       NOUS SOMMES ENSEMBLE\n   DEPUIS CE JOUR-LA.... EN FAIT,\nUN PEU MOINS DEPUIS QUELQUE TEMPS.\nJE PENSE QU'ELLE A LE DROIT\n  D'ETRE VEXEE PARCE QUE J'AI\n         TRAVAILLE SEUL.", "      DESDE ENTONCES\n   ESTAMOS JUNTOS... HASTA HACE\n POCO... SUPONGO QUE TIENE RAZON\n AL ENFADARSE PORQUE YO TRABAJE\n SOLO. BIEN. EL VENENO SE HA IDO Y\n  LA HERIDA DE BALA ESTA CURADA...\n       SIEMPRE FUNCIONA.", "         SEITDEM SIND WIR\n    ZUSAMMEN...NAJA, BIS AUF DIE\n LETZTE ZEIT. SCH\x8e""TZE, SIE HAT DAS\n RECHT, ETWAS SAUER ZU SEIN, DA\xe1"" ICH\nALLEIN GEARBEITET HABE. DAS GIFT IST\n   FORT...DIE WUNDE VERHEILT...WIE\n    GESAGT, FUNKTIONIERT\n             JEDESMAL." },
-    { 8, 246, 305, 212, nullptr, "       LE VENIN EST PARTI... \n  ET LES BLESSURES DES BALLES\nONT ETE GUERIES. COMME JE VOUS\n    L'AI DIT, \x80""A MARCHE A TOUS\n           LES COUPS.", nullptr, nullptr },
+	{ 8, 246, 305, 212, "        WE'VE BEEN TOGETHER\n   EVER SINCE... WELL, EXCEPT\n LATELY... I GUESS SHE HAS A RIGHT\nTO BE TICKED THAT I'VE BEEN WORKING\n ALONE. THE VENOM'S GONE... AND THE\n   BULLET SCORE'S HEALED... LIKE I\n    SAID, IT WORKS EVERY TIME.", "\n       NOUS SOMMES ENSEMBLE\n   DEPUIS CE JOUR-LA.... EN FAIT,\nUN PEU MOINS DEPUIS QUELQUE TEMPS.\nJE PENSE QU'ELLE A LE DROIT\n  D'ETRE VEXEE PARCE QUE J'AI\n         TRAVAILLE SEUL.", "      DESDE ENTONCES\n   ESTAMOS JUNTOS... HASTA HACE\n POCO... SUPONGO QUE TIENE RAZON\n AL ENFADARSE PORQUE YO TRABAJE\n SOLO. BIEN. EL VENENO SE HA IDO Y\n  LA HERIDA DE BALA ESTA CURADA...\n       SIEMPRE FUNCIONA.", "         SEITDEM SIND WIR\n    ZUSAMMEN...NAJA, BIS AUF DIE\n LETZTE ZEIT. SCH\x8e""TZE, SIE HAT DAS\n RECHT, ETWAS SAUER ZU SEIN, DA\xe1"" ICH\nALLEIN GEARBEITET HABE. DAS GIFT IST\n   FORT...DIE WUNDE VERHEILT...WIE\n    GESAGT, FUNKTIONIERT\n             JEDESMAL." },
+	{ 8, 246, 305, 212, nullptr, "       LE VENIN EST PARTI... \n  ET LES BLESSURES DES BALLES\nONT ETE GUERIES. COMME JE VOUS\n    L'AI DIT, \x80""A MARCHE A TOUS\n           LES COUPS.", nullptr, nullptr },
 };
 
 static const struct ComicBlock block_p10_9 = { &poly_p10_b9, -1, -1, block_p10_b9_boxes, 2 };
 
 static const struct ComicBlock page_10_blocks[] = {
-    block_p10_0,
-    block_p10_1,
-    block_p10_2,
-    block_p10_3,
-    block_p10_4,
-    block_p10_5,
-    block_p10_6,
-    block_p10_7,
-    block_p10_8,
-    block_p10_9,
+	block_p10_0,
+	block_p10_1,
+	block_p10_2,
+	block_p10_3,
+	block_p10_4,
+	block_p10_5,
+	block_p10_6,
+	block_p10_7,
+	block_p10_8,
+	block_p10_9,
 };
 
 static struct ComicPage page_10 = { "DARK/COMDATA/LEPG1819.SCN", 98, 50, 1, 0, page_10_blocks, 10 };
 
 static const struct Polygon poly_p11_b0 = { {
-    { 232, 82 },
-    { 323, 83 },
-    { 323, 165 },
-    { 239, 165 },
+	{ 232, 82 },
+	{ 323, 83 },
+	{ 323, 165 },
+	{ 239, 165 },
 } };
 
 static const struct ComicBox block_p11_b0_boxes[] = {
-    { 7, 246, 332, 32, "         THEY COINED ME THEIR\n   CHAMPION...THE PRESS! JUST A\n     LOT OF GLAMOUR AND WINDOW\n DRESSING. OH, THEY WERE USUALLY\nLOYAL, BUT THERE WERE TIMES THEY\n       TURNED ON ME OVERNIGHT!", "\n        IL M'ONT CONSACRE COMME\n   LEUR CHAMPION... LA PRESSE! EN\nFAIT, BEAUCOUP DE POUDRE AUX YEUX...\nOH, ILS ETAIENT LOYALS, MAIS IL M'ONT\n      PARFOIS ABANDONNE SANS\n           EXPLICATION!", "         ME HICIERON SU\n  CAMPEON LA PRENSA! YO\n  ERA EL MAS FAMOSO DE LA\n CIUDAD. Y POR LO GENERAL ERAN\n LEALES CONMIGO, PERO TAMBIEN\n         ES QUE UNO SE CANSA!", "       SIE HABEN MICH ZU IHREM\n    HELDEN GEMACHT....DIE PRESSE!\n  JEDE MENGE GLAMOUR UND SHOW.\n    NAJA, MEISTENS HABEN SIE MICH\nUNTERST\x9a""TZT, ABER ES GAB AUCH ZEITEN,\n     DA HABEN SIE SICH \x9a""BER NACHT\n        GEGEN MICH GEWANDT!" },
+	{ 7, 246, 332, 32, "         THEY COINED ME THEIR\n   CHAMPION...THE PRESS! JUST A\n     LOT OF GLAMOUR AND WINDOW\n DRESSING. OH, THEY WERE USUALLY\nLOYAL, BUT THERE WERE TIMES THEY\n       TURNED ON ME OVERNIGHT!", "\n        IL M'ONT CONSACRE COMME\n   LEUR CHAMPION... LA PRESSE! EN\nFAIT, BEAUCOUP DE POUDRE AUX YEUX...\nOH, ILS ETAIENT LOYALS, MAIS IL M'ONT\n      PARFOIS ABANDONNE SANS\n           EXPLICATION!", "         ME HICIERON SU\n  CAMPEON LA PRENSA! YO\n  ERA EL MAS FAMOSO DE LA\n CIUDAD. Y POR LO GENERAL ERAN\n LEALES CONMIGO, PERO TAMBIEN\n         ES QUE UNO SE CANSA!", "       SIE HABEN MICH ZU IHREM\n    HELDEN GEMACHT....DIE PRESSE!\n  JEDE MENGE GLAMOUR UND SHOW.\n    NAJA, MEISTENS HABEN SIE MICH\nUNTERST\x9a""TZT, ABER ES GAB AUCH ZEITEN,\n     DA HABEN SIE SICH \x9a""BER NACHT\n        GEGEN MICH GEWANDT!" },
 };
 
 static const struct ComicBlock block_p11_0 = { &poly_p11_b0, -1, -1, block_p11_b0_boxes, 1 };
 
 static const struct Polygon poly_p11_b1 = { {
-    { 61, 0 },
-    { 323, 0 },
-    { 322, 234 },
-    { 62, 234 },
+	{ 61, 0 },
+	{ 323, 0 },
+	{ 322, 234 },
+	{ 62, 234 },
 } };
 
 static const struct ComicBox block_p11_b1_boxes[] = {
-    { 7, 246, 166, 33, "         I'M STILL NOT SURE\n   I'M DOING THE RIGHT THING...\n THIS CITY HAS COUNTED ON ME TO\nALWAYS BE THERE... LURKING IN THE\n       EVER-PRESENT SHADOWS.", "        JE NE SAIS PAS ENCORE\n   SI J'AI PRIS LA BONNE DECISION...\nCETTE VILLE A TOUJOURS COMPTE SUR\n    MOI... RODANT DANS L'OMBRE\n          OMNIPRESENTE.", "         NO ESTOY SEGURO DE\n ESTAR HACIENDO LO CORRECTO...\n ESTA CIUDAD HA CONTADO CONMIGO\n DESDE QUE ME CONVERTI EN\n       TENEBROSO.", "        ICH BIN MIR IMMER NOCH\n       NICHT SICHER, OB ICH DAS\n RICHTIGE TUE. DIE STADT HAT SICH\nDARAUF VERLASSEN, DA\xe1"" ICH IMMER F\x9a""R\n    SIE DA BIN.. IN DEN SCHATTEN,\n          DIE \x9a""BERALL SIND." },
+	{ 7, 246, 166, 33, "         I'M STILL NOT SURE\n   I'M DOING THE RIGHT THING...\n THIS CITY HAS COUNTED ON ME TO\nALWAYS BE THERE... LURKING IN THE\n       EVER-PRESENT SHADOWS.", "        JE NE SAIS PAS ENCORE\n   SI J'AI PRIS LA BONNE DECISION...\nCETTE VILLE A TOUJOURS COMPTE SUR\n    MOI... RODANT DANS L'OMBRE\n          OMNIPRESENTE.", "         NO ESTOY SEGURO DE\n ESTAR HACIENDO LO CORRECTO...\n ESTA CIUDAD HA CONTADO CONMIGO\n DESDE QUE ME CONVERTI EN\n       TENEBROSO.", "        ICH BIN MIR IMMER NOCH\n       NICHT SICHER, OB ICH DAS\n RICHTIGE TUE. DIE STADT HAT SICH\nDARAUF VERLASSEN, DA\xe1"" ICH IMMER F\x9a""R\n    SIE DA BIN.. IN DEN SCHATTEN,\n          DIE \x9a""BERALL SIND." },
 };
 
 static const struct ComicBlock block_p11_1 = { &poly_p11_b1, -1, -1, block_p11_b1_boxes, 1 };
 
 static const struct Polygon poly_p11_b2 = { {
-    { 322, 234 },
-    { 266, 257 },
-    { 242, 320 },
-    { 261, 369 },
-    { 322, 399 },
+	{ 322, 234 },
+	{ 266, 257 },
+	{ 242, 320 },
+	{ 261, 369 },
+	{ 322, 399 },
 } };
 
 static const struct ComicBox block_p11_b2_boxes[] = {
-    { 8, 246, 84, 219, "       ...I DESERVE MORE!", "\n   ... JE MERITE MIEUX QUE \x80""A!", "       ...MEREZCO MAS!", "\n       ... ICH VERDIENE MEHR!" },
+	{ 8, 246, 84, 219, "       ...I DESERVE MORE!", "\n   ... JE MERITE MIEUX QUE \x80""A!", "       ...MEREZCO MAS!", "\n       ... ICH VERDIENE MEHR!" },
 };
 
 static const struct ComicBlock block_p11_2 = { &poly_p11_b2, -1, -1, block_p11_b2_boxes, 1 };
 
 static const struct Polygon poly_p11_b3 = { {
-    { 62, 235 },
-    { 322, 234 },
-    { 322, 399 },
-    { 62, 399 },
+	{ 62, 235 },
+	{ 322, 234 },
+	{ 322, 399 },
+	{ 62, 399 },
 } };
 
 static const struct ComicBox block_p11_b3_boxes[] = {
-    { 5, 246, 181, 280, "         I'VE WORKED HARD TO\n   BECOME WHAT I AM, BUT I'M SO\n DAMN TIRED! FIGHTING OFF EVERY\nCRACKPOT AND PSYCHO THAT WANTS TO\n   USE NOCTROPOLIS AS THEIR\n     PERSONAL PLAYGROUND...", "         J'AI TRAVAILLE DUR\n     POUR DEVENIR CE QUE JE SUIS\n AUJOU'D'HUI, MAIS JE SUIS VRAIMENT\nFATIGUE! JE ME SUIS BATTU CONTRE TOUS\n MALFAITEURS ET AUTRES PSYCHOPATHES\n  QUI DECIDAIENT UN JOUR D'ADOPTER\n        NOCTROPOLIS COMME\n          TERRAIN DE JEU...", "         TRABAJE MUCHO PARA\n  CONVERTIRME EN LO QUE SOY,\n PERO TODO TIENE UN FIN. PELEAR\n CONTRA CADA RATERO O SICOPATA\n QUE QUIERE HACER DE NOCTROPOLIS\n        SUS DOMINIOS...", "         ICH HABE HART\n   GEARBEITET, UM DAS ZU WERDEN,\n       WAS ICH HEUTE BIN." },
-    { 5, 246, 181, 280, nullptr, nullptr, nullptr, "         ABER ICH BIN ES SO\n    VERDAMMT LEID, GEGEN JEDEN\n  VERR\x9a""CKTEN UND PSYCHOPATHEN ZU\n   K\x8e""MPFEN, DER NOCTROPOLIS ALS\n   SEINEN PERS\x99""NLICHEN SPIELPLATZ\n             BETRACHTET..." },
+	{ 5, 246, 181, 280, "         I'VE WORKED HARD TO\n   BECOME WHAT I AM, BUT I'M SO\n DAMN TIRED! FIGHTING OFF EVERY\nCRACKPOT AND PSYCHO THAT WANTS TO\n   USE NOCTROPOLIS AS THEIR\n     PERSONAL PLAYGROUND...", "         J'AI TRAVAILLE DUR\n     POUR DEVENIR CE QUE JE SUIS\n AUJOU'D'HUI, MAIS JE SUIS VRAIMENT\nFATIGUE! JE ME SUIS BATTU CONTRE TOUS\n MALFAITEURS ET AUTRES PSYCHOPATHES\n  QUI DECIDAIENT UN JOUR D'ADOPTER\n        NOCTROPOLIS COMME\n          TERRAIN DE JEU...", "         TRABAJE MUCHO PARA\n  CONVERTIRME EN LO QUE SOY,\n PERO TODO TIENE UN FIN. PELEAR\n CONTRA CADA RATERO O SICOPATA\n QUE QUIERE HACER DE NOCTROPOLIS\n        SUS DOMINIOS...", "         ICH HABE HART\n   GEARBEITET, UM DAS ZU WERDEN,\n       WAS ICH HEUTE BIN." },
+	{ 5, 246, 181, 280, nullptr, nullptr, nullptr, "         ABER ICH BIN ES SO\n    VERDAMMT LEID, GEGEN JEDEN\n  VERR\x9a""CKTEN UND PSYCHOPATHEN ZU\n   K\x8e""MPFEN, DER NOCTROPOLIS ALS\n   SEINEN PERS\x99""NLICHEN SPIELPLATZ\n             BETRACHTET..." },
 };
 
 static const struct ComicBlock block_p11_3 = { &poly_p11_b3, -1, -1, block_p11_b3_boxes, 2 };
 
 static const struct Polygon poly_p11_b4 = { {
-    { 323, 0 },
-    { 471, 0 },
-    { 324, 175 },
+	{ 323, 0 },
+	{ 471, 0 },
+	{ 324, 175 },
 } };
 
 static const struct ComicBox block_p11_b4_boxes[] = {
-    { 0, 246, 349, 61, "NOCTROPOLIS CITY HALL", "MAIRIE DE NOCTROPOLIS", "AYUNTAMIENTO DE NOCTROPOLIS", "RATHAUS VON NOCTROPOLIS" },
+	{ 0, 246, 349, 61, "NOCTROPOLIS CITY HALL", "MAIRIE DE NOCTROPOLIS", "AYUNTAMIENTO DE NOCTROPOLIS", "RATHAUS VON NOCTROPOLIS" },
 };
 
 static const struct ComicBlock block_p11_4 = { &poly_p11_b4, -1, -1, block_p11_b4_boxes, 1 };
 
 static const struct Polygon poly_p11_b5 = { {
-    { 471, 0 },
-    { 586, 0 },
-    { 586, 170 },
+	{ 471, 0 },
+	{ 586, 0 },
+	{ 586, 170 },
 } };
 
 static const struct ComicBox block_p11_b5_boxes[] = {
-    { 0, 246, 349, 61, "NOCTROPOLIS CITY HALL", "MAIRIE DE NOCTROPOLIS", "AYUNTAMIENTO DE NOCTROPOLIS", "RATHAUS VON NOCTROPOLIS" },
+	{ 0, 246, 349, 61, "NOCTROPOLIS CITY HALL", "MAIRIE DE NOCTROPOLIS", "AYUNTAMIENTO DE NOCTROPOLIS", "RATHAUS VON NOCTROPOLIS" },
 };
 
 static const struct ComicBlock block_p11_5 = { &poly_p11_b5, -1, -1, block_p11_b5_boxes, 1 };
 
 static const struct Polygon poly_p11_b6 = { {
-    { 376, 111 },
-    { 534, 111 },
-    { 534, 187 },
-    { 376, 187 },
+	{ 376, 111 },
+	{ 534, 111 },
+	{ 534, 187 },
+	{ 376, 187 },
 } };
 
 static const struct ComicBox block_p11_b6_boxes[] = {
-    { 4, 255, 235, 51, "        AHH DARKSHEER, WE WERE\n   JUST DISCUSSING YOU... YOUR\n RECENT CAMPAIGN AGAINST THE\nCITY'S MORE NOTORIOUS ENEMIES\n   HAS BEEN MOST IMPRESSIVE!\n            WELL DONE!", "\n        AHH... DARKSHEER! NOUS\n   PARLIONS JUSTEMENT DE VOUS...\nVOTRE DERNIERE CAMPAGNE CONTRE LES\n ENNEMIS NOTOIRES DE LA VILLE ETAIT\n     VRAIMENT IMPRESSIONNANTE!\n            BIEN JOUE! ", "        AH, TENEBROSO.\n  HABLABAMOS DE TI... TU\n RECIENTE CRUZADA CONTRA LOS\n ENEMIGOS MAS NOTABLES DE\n LA CIUDAD HA SIDO IMPRESIONANTE!\n          BIEN HECHO!", "        AAH, DARKSHEER, WIR\n   REDEN GERADE \x9a""BER SIE. IHRE\n J\x9a""NGSTE KAMPAGNE GEGEN DIE \x9a""BLEN\n  FEINDE DER STADT WAR \x8e""U\xe1""ERST\n       EINDRUCKSVOLL. SEHR GUT\n              GEMACHT!" },
-    { 4, 246, 247, 71, "        THANK YOU MR. MAYOR.\n   YOU'LL BE PLEASED TO KNOW\n THAT TOPHAT IS IN CUSTODY AND\nTHAT DESPERADO AND WIDOWMARK WON'T\n     TROUBLE THE CITIZENS OF\n      NOCTROPOLIS EVER AGAIN.", "\n       MERCI, MONSIEUR LE MAIRE.\n   VOUS SEREZ HEUREUX D'APPRENDRE\n QUE TOPHAT EST EN PRISON, ET QUE\nDESPERADO ET WIDOWMARK N'ENNUIERONT\n    PLUS JAMAIS LES HABITANTS\n         DE NOCTROPOLIS.", "        GRACIAS, ALCALDE.\n  LE GUSTARA SABER QUE LA\n DIVA ESTA EN PRISION Y QUE\n DESESPERADO Y VIUDA NEGRA NO\n   VOLVERAN A MOLESTAR A LOS\n   CIUDADANOS DE NOCTROPOLIS.", "         VIELEN DANK, HERR\n     B\x9a""RGERMEISTER. ES WIRD SIE\n     FREUEN, ZU H\x99""REN, DA\xe1"" MISS\n  ZYLINDERCHEN IN HAFT GENOMMEN\n WURDE, UND DA\xe1"" SHOWDOWN UND DIE\n     SCHWARZE WITWE DIE B\x9a""RGER VON\n     NOCTROPOLIS NIE WIEDER\n         BEL\x8e""STIGEN WERDEN." },
+	{ 4, 255, 235, 51, "        AHH DARKSHEER, WE WERE\n   JUST DISCUSSING YOU... YOUR\n RECENT CAMPAIGN AGAINST THE\nCITY'S MORE NOTORIOUS ENEMIES\n   HAS BEEN MOST IMPRESSIVE!\n            WELL DONE!", "\n        AHH... DARKSHEER! NOUS\n   PARLIONS JUSTEMENT DE VOUS...\nVOTRE DERNIERE CAMPAGNE CONTRE LES\n ENNEMIS NOTOIRES DE LA VILLE ETAIT\n     VRAIMENT IMPRESSIONNANTE!\n            BIEN JOUE! ", "        AH, TENEBROSO.\n  HABLABAMOS DE TI... TU\n RECIENTE CRUZADA CONTRA LOS\n ENEMIGOS MAS NOTABLES DE\n LA CIUDAD HA SIDO IMPRESIONANTE!\n          BIEN HECHO!", "        AAH, DARKSHEER, WIR\n   REDEN GERADE \x9a""BER SIE. IHRE\n J\x9a""NGSTE KAMPAGNE GEGEN DIE \x9a""BLEN\n  FEINDE DER STADT WAR \x8e""U\xe1""ERST\n       EINDRUCKSVOLL. SEHR GUT\n              GEMACHT!" },
+	{ 4, 246, 247, 71, "        THANK YOU MR. MAYOR.\n   YOU'LL BE PLEASED TO KNOW\n THAT TOPHAT IS IN CUSTODY AND\nTHAT DESPERADO AND WIDOWMARK WON'T\n     TROUBLE THE CITIZENS OF\n      NOCTROPOLIS EVER AGAIN.", "\n       MERCI, MONSIEUR LE MAIRE.\n   VOUS SEREZ HEUREUX D'APPRENDRE\n QUE TOPHAT EST EN PRISON, ET QUE\nDESPERADO ET WIDOWMARK N'ENNUIERONT\n    PLUS JAMAIS LES HABITANTS\n         DE NOCTROPOLIS.", "        GRACIAS, ALCALDE.\n  LE GUSTARA SABER QUE LA\n DIVA ESTA EN PRISION Y QUE\n DESESPERADO Y VIUDA NEGRA NO\n   VOLVERAN A MOLESTAR A LOS\n   CIUDADANOS DE NOCTROPOLIS.", "         VIELEN DANK, HERR\n     B\x9a""RGERMEISTER. ES WIRD SIE\n     FREUEN, ZU H\x99""REN, DA\xe1"" MISS\n  ZYLINDERCHEN IN HAFT GENOMMEN\n WURDE, UND DA\xe1"" SHOWDOWN UND DIE\n     SCHWARZE WITWE DIE B\x9a""RGER VON\n     NOCTROPOLIS NIE WIEDER\n         BEL\x8e""STIGEN WERDEN." },
 };
 
 static const struct ComicBlock block_p11_6 = { &poly_p11_b6, -1, -1, block_p11_b6_boxes, 2 };
 
 static const struct Polygon poly_p11_b7 = { {
-    { 323, 261 },
-    { 378, 270 },
-    { 396, 292 },
-    { 396, 336 },
-    { 367, 366 },
-    { 323, 368 },
+	{ 323, 261 },
+	{ 378, 270 },
+	{ 396, 292 },
+	{ 396, 336 },
+	{ 367, 366 },
+	{ 323, 368 },
 } };
 
 static const struct ComicBox block_p11_b7_boxes[] = {
-    { 3, 255, 431, 210, "         R-RETIRE? BUT YOU\n   CAN'T! WE'RE JUST NOT CAPABLE\nOF DEALING WITH THE MISCREANTS THAT\nPLAGUE THE CITY... FOR THE LOVE OF\n  GOD, THINK OF MY PUBLIC IMAGE!\n    THERE'S AN ELECTION COMING...", "\n       P-PRENDRE VOTRE RETRAITE?\n   MAIS C'EST IMPOSSIBLE! NOUS NE\nPOURRONS PAS LUTTER SEUL CONTRE\nLES MALFAITEURS QUI RUINENT NOTRE\n CITE! POUR L'AMOUR DU CIEL, PENSEZ\n      A MON IMAGE! IL Y A DES\n         ELECTIONS BIENTOT...", "         RETIRARTE? NO\n   PUEDES! NOSOTROS NO SOMOS\n CAPACES DE HACER FRENTE A LOS\n DESALMADOS QUE ASEDIAN ESTA\n   CIUDAD. POR FAVOR, ESPERA\n       A LAS ELECCIONES!", "         Z-Z-ZUR RUHE SETZEN?\n   ABER DAS GEHT NICHT! WIR WERDEN\n DOCH ALLEINE NICHT MIT ALL DIESEN\n\x9a""BELT\x8e""TERN FERTIG, DIE UNSERE STADT\n   PLAGEN! UM GOTTES WILLEN,\n   DENKEN SIE DOCH AM MEIN IMAGE...\n      DIE WAHLEN STEHEN VOR\n             DER T\x9a""R!" },
+	{ 3, 255, 431, 210, "         R-RETIRE? BUT YOU\n   CAN'T! WE'RE JUST NOT CAPABLE\nOF DEALING WITH THE MISCREANTS THAT\nPLAGUE THE CITY... FOR THE LOVE OF\n  GOD, THINK OF MY PUBLIC IMAGE!\n    THERE'S AN ELECTION COMING...", "\n       P-PRENDRE VOTRE RETRAITE?\n   MAIS C'EST IMPOSSIBLE! NOUS NE\nPOURRONS PAS LUTTER SEUL CONTRE\nLES MALFAITEURS QUI RUINENT NOTRE\n CITE! POUR L'AMOUR DU CIEL, PENSEZ\n      A MON IMAGE! IL Y A DES\n         ELECTIONS BIENTOT...", "         RETIRARTE? NO\n   PUEDES! NOSOTROS NO SOMOS\n CAPACES DE HACER FRENTE A LOS\n DESALMADOS QUE ASEDIAN ESTA\n   CIUDAD. POR FAVOR, ESPERA\n       A LAS ELECCIONES!", "         Z-Z-ZUR RUHE SETZEN?\n   ABER DAS GEHT NICHT! WIR WERDEN\n DOCH ALLEINE NICHT MIT ALL DIESEN\n\x9a""BELT\x8e""TERN FERTIG, DIE UNSERE STADT\n   PLAGEN! UM GOTTES WILLEN,\n   DENKEN SIE DOCH AM MEIN IMAGE...\n      DIE WAHLEN STEHEN VOR\n             DER T\x9a""R!" },
 };
 
 static const struct ComicBlock block_p11_7 = { &poly_p11_b7, -1, -1, block_p11_b7_boxes, 1 };
 
 static const struct Polygon poly_p11_b8 = { {
-    { 507, 213 },
-    { 535, 226 },
-    { 544, 250 },
-    { 535, 277 },
-    { 506, 292 },
-    { 475, 277 },
-    { 466, 255 },
-    { 475, 226 },
+	{ 507, 213 },
+	{ 535, 226 },
+	{ 544, 250 },
+	{ 535, 277 },
+	{ 506, 292 },
+	{ 475, 277 },
+	{ 466, 255 },
+	{ 475, 226 },
 } };
 
 static const struct ComicBox block_p11_b8_boxes[] = {
-    { 4, 246, 266, 169, "       ACTUALLY MR MAYOR,\n   THAT'S WHY I CAME TO SEE YOU...\n I HAVE DECIDED TO RETIRE. AS A\n COURTESY, I THOUGHT YOU SHOULD\n   KNOW BEFORE ANY PUBLIC\n        ANNOUNCEMENT.", "        EN FAIT, MONSIEUR LE\n    MAIRE, C'EST POUR \x80""A QUE JE\n SUIS VENU VOUS VOIR. J'AI DECIDE DE\nPRENDRE MA RETRAITE. JE PENSAIS QU'IL\n  ETAIT PLUS CONVENABLE DE VOUS\n     PREVENIR PERSONNELLEMENT\n       AVANT DE L'ANNONCER\n         OFFICIELLEMENT.", "      EN REALIDAD POR ESO\n   VENIA A VERLE, ALCALDE...\n HE DECIDIDO RETIRARME. ME\n PARECIO QUE DEBIA DECIRSELO A\n    USTED ANTES QUE A\n        NADIE.", "          EIGENTLICH BIN ICH\n      GENAU DESWEGEN HIER, HERR\n       B\x9a""RGERMEISTER. ICH HABE\n  BESCHLOSSEN, MICH ZUR RUHE ZU\n  SETZEN. ICH DACHTE, SIE SOLLTEN ES\n       ERFAHREN, BEVOR ICH ES\n        \x99""FFENTLICH BEKANNTGEBE." },
+	{ 4, 246, 266, 169, "       ACTUALLY MR MAYOR,\n   THAT'S WHY I CAME TO SEE YOU...\n I HAVE DECIDED TO RETIRE. AS A\n COURTESY, I THOUGHT YOU SHOULD\n   KNOW BEFORE ANY PUBLIC\n        ANNOUNCEMENT.", "        EN FAIT, MONSIEUR LE\n    MAIRE, C'EST POUR \x80""A QUE JE\n SUIS VENU VOUS VOIR. J'AI DECIDE DE\nPRENDRE MA RETRAITE. JE PENSAIS QU'IL\n  ETAIT PLUS CONVENABLE DE VOUS\n     PREVENIR PERSONNELLEMENT\n       AVANT DE L'ANNONCER\n         OFFICIELLEMENT.", "      EN REALIDAD POR ESO\n   VENIA A VERLE, ALCALDE...\n HE DECIDIDO RETIRARME. ME\n PARECIO QUE DEBIA DECIRSELO A\n    USTED ANTES QUE A\n        NADIE.", "          EIGENTLICH BIN ICH\n      GENAU DESWEGEN HIER, HERR\n       B\x9a""RGERMEISTER. ICH HABE\n  BESCHLOSSEN, MICH ZUR RUHE ZU\n  SETZEN. ICH DACHTE, SIE SOLLTEN ES\n       ERFAHREN, BEVOR ICH ES\n        \x99""FFENTLICH BEKANNTGEBE." },
 };
 
 static const struct ComicBlock block_p11_8 = { &poly_p11_b8, -1, -1, block_p11_b8_boxes, 1 };
 
 static const struct Polygon poly_p11_b9 = { {
-    { 324, 175 },
-    { 585, 170 },
-    { 585, 267 },
-    { 323, 267 },
+	{ 324, 175 },
+	{ 585, 170 },
+	{ 585, 267 },
+	{ 323, 267 },
 } };
 
 static const struct ComicBox block_p11_b9_boxes[] = {
-    { 4, 255, 224, 135, "      EXCELLENT! ACCORDING TO\n  OUR LISTS, THAT ACCOUNTS FOR\nEVERY CRIMINAL MASTERMIND TO DATE.\n  YOU'VE CERTAINLY EARNED A REST!", "      EXCELLENT! D'APRES NOS\n  LISTES, TOUS LES CRIMINELS SONT\nMAINTENANT SOUS LES VERROUS.\n VOUS AVEZ BIEN GAGNE UN PEU\n           DE REPOS!", "      EXCELENTE! SEGUN NUESTRA\n  LISTA, ESO DEJA LA CIUDAD LIMPIA\n DE CRIMINALES IMPORTANTES.\n  TE HAS GANADO UN DESCANSO!", "       AUSGEZEICHNET! NACH\n  UNSERER LISTE W\x8e""REN DAMIT JETZT\nALLE MEISTERVERBRECHER ABGEHAKT.\n    SIE HABEN SICH WIRKLICH EINE\n           PAUSE VERDIENT!" },
+	{ 4, 255, 224, 135, "      EXCELLENT! ACCORDING TO\n  OUR LISTS, THAT ACCOUNTS FOR\nEVERY CRIMINAL MASTERMIND TO DATE.\n  YOU'VE CERTAINLY EARNED A REST!", "      EXCELLENT! D'APRES NOS\n  LISTES, TOUS LES CRIMINELS SONT\nMAINTENANT SOUS LES VERROUS.\n VOUS AVEZ BIEN GAGNE UN PEU\n           DE REPOS!", "      EXCELENTE! SEGUN NUESTRA\n  LISTA, ESO DEJA LA CIUDAD LIMPIA\n DE CRIMINALES IMPORTANTES.\n  TE HAS GANADO UN DESCANSO!", "       AUSGEZEICHNET! NACH\n  UNSERER LISTE W\x8e""REN DAMIT JETZT\nALLE MEISTERVERBRECHER ABGEHAKT.\n    SIE HABEN SICH WIRKLICH EINE\n           PAUSE VERDIENT!" },
 };
 
 static const struct ComicBlock block_p11_9 = { &poly_p11_b9, -1, -1, block_p11_b9_boxes, 1 };
 
 static const struct Polygon poly_p11_b10 = { {
-    { 378, 270 },
-    { 506, 270 },
-    { 506, 324 },
-    { 378, 324 },
+	{ 378, 270 },
+	{ 506, 270 },
+	{ 506, 324 },
+	{ 378, 324 },
 } };
 
 static const struct ComicBox block_p11_b10_boxes[] = {
-    { 4, 246, 233, 219, "        I DON'T GIVE A DAMN\n   ABOUT YOUR POPULARITY RATING!\nAND, AS YOU MENTIONED BEFORE,\nNOCTROPOLIS' BOGEY MEN ARE EITHER\n DEAD, OR IN LOCK-UP... MY\n  DECISION IS NOT NEGOTIABLE.", "       JE N'AI QUE FAIRE DE\n   VOTRE POPULARITE! ET, COMME\n JE VOUS L'AI DIT LES ENNEMIS DE\nNOCTROPOLIS SONT TOUS MORTS OU EN\n    PRISON... MA DECISION EST\n          IRREVOCABLE.", "         NO ME IMPORTA TU\n   IMAGEN PUBLICA! Y TODOS LOS\n CRIMINALES IMPORTANTES ESTAN\n MUERTOS O ENCERRADOS. MI\n  DECISION NO ES NEGOCIABLE.", "       IHRE BELIEBTHEIT K\x9a""MMERT\n    MICH EINEN DRECK! UND WIE SIE\n   BEREITS SO RICHTIG BEMERKTEN,\n SIND DIE B\x99""SEWICHTE ALLE ENTWEDER\n  TOT ODER IM GEF\x8e""NGNIS. MEINE\n   ENTSCHEIDUNG IST UNUMST\x99""\xe1""LICH." },
+	{ 4, 246, 233, 219, "        I DON'T GIVE A DAMN\n   ABOUT YOUR POPULARITY RATING!\nAND, AS YOU MENTIONED BEFORE,\nNOCTROPOLIS' BOGEY MEN ARE EITHER\n DEAD, OR IN LOCK-UP... MY\n  DECISION IS NOT NEGOTIABLE.", "       JE N'AI QUE FAIRE DE\n   VOTRE POPULARITE! ET, COMME\n JE VOUS L'AI DIT LES ENNEMIS DE\nNOCTROPOLIS SONT TOUS MORTS OU EN\n    PRISON... MA DECISION EST\n          IRREVOCABLE.", "         NO ME IMPORTA TU\n   IMAGEN PUBLICA! Y TODOS LOS\n CRIMINALES IMPORTANTES ESTAN\n MUERTOS O ENCERRADOS. MI\n  DECISION NO ES NEGOCIABLE.", "       IHRE BELIEBTHEIT K\x9a""MMERT\n    MICH EINEN DRECK! UND WIE SIE\n   BEREITS SO RICHTIG BEMERKTEN,\n SIND DIE B\x99""SEWICHTE ALLE ENTWEDER\n  TOT ODER IM GEF\x8e""NGNIS. MEINE\n   ENTSCHEIDUNG IST UNUMST\x99""\xe1""LICH." },
 };
 
 static const struct ComicBlock block_p11_10 = { &poly_p11_b10, -1, -1, block_p11_b10_boxes, 1 };
 
 static const struct Polygon poly_p11_b11 = { {
-    { 323, 324 },
-    { 506, 324 },
-    { 506, 399 },
-    { 323, 399 },
+	{ 323, 324 },
+	{ 506, 324 },
+	{ 506, 399 },
+	{ 323, 399 },
 } };
 
 static const struct ComicBox block_p11_b11_boxes[] = {
-    { 4, 255, 239, 288, "        MR. MAYOR, I PROPOSE\n   THAT WE THROW DARKSHEER A\nHERO'S PARADE! AFTERWARD, YOU\nCOULD GIVE HIM THE KEY TO THE\n  CITY AT A TELEVISED CEREMONY!\n   IT WOULD BE GREAT PUBLICITY...", "       MONSIEUR LE MAIRE, JE\n   PROPOSE D'ORGANISER UN DEFILE\n   POUR NOTRE HEROS, DARKSHEER!\nENSUITE, VOUS POURRIEZ LUI REMETTRE\n LA CLEF DE LA VILLE AU COURS D'UNE\n  EMISSION TELEVISEE! CELA VOUS\n      FERAIT UNE EXCELLENTE\n             PUBLICITE.", "        ALCALDE, PROPONGO\n   QUE LE DESPIDAMOS CON UN \n DESFILE. USTED PODRIA DARLE\n LAS LLAVES DE LA CIUDAD\n   EN UN ACTO TELEVISADO!\n    SERIA UNA GRAN PUBLICIDAD...", "       HERR B\x9a""RGERMEISTER, ICH\n   SCHLAGE VOR, WIR VERANSTALTEN\n     ZU EHREN DARKSHEERS EINE\nHELDENPARADE! ANSCHLIE\xe1""END K\x99""NNTEN\nSIE IHM DIE EHRENSCHL\x9a""SSEL ZUR STADT\n    \x9a""BERREICHEN, LIVE IM FERNSEHEN.\n       DAS W\x8e""RE PRIMA PUBLICITY!" },
+	{ 4, 255, 239, 288, "        MR. MAYOR, I PROPOSE\n   THAT WE THROW DARKSHEER A\nHERO'S PARADE! AFTERWARD, YOU\nCOULD GIVE HIM THE KEY TO THE\n  CITY AT A TELEVISED CEREMONY!\n   IT WOULD BE GREAT PUBLICITY...", "       MONSIEUR LE MAIRE, JE\n   PROPOSE D'ORGANISER UN DEFILE\n   POUR NOTRE HEROS, DARKSHEER!\nENSUITE, VOUS POURRIEZ LUI REMETTRE\n LA CLEF DE LA VILLE AU COURS D'UNE\n  EMISSION TELEVISEE! CELA VOUS\n      FERAIT UNE EXCELLENTE\n             PUBLICITE.", "        ALCALDE, PROPONGO\n   QUE LE DESPIDAMOS CON UN \n DESFILE. USTED PODRIA DARLE\n LAS LLAVES DE LA CIUDAD\n   EN UN ACTO TELEVISADO!\n    SERIA UNA GRAN PUBLICIDAD...", "       HERR B\x9a""RGERMEISTER, ICH\n   SCHLAGE VOR, WIR VERANSTALTEN\n     ZU EHREN DARKSHEERS EINE\nHELDENPARADE! ANSCHLIE\xe1""END K\x99""NNTEN\nSIE IHM DIE EHRENSCHL\x9a""SSEL ZUR STADT\n    \x9a""BERREICHEN, LIVE IM FERNSEHEN.\n       DAS W\x8e""RE PRIMA PUBLICITY!" },
 };
 
 static const struct ComicBlock block_p11_11 = { &poly_p11_b11, -1, -1, block_p11_b11_boxes, 1 };
 
 static const struct Polygon poly_p11_b12 = { {
-    { 506, 267 },
-    { 585, 267 },
-    { 585, 399 },
-    { 506, 399 },
+	{ 506, 267 },
+	{ 585, 267 },
+	{ 585, 399 },
+	{ 506, 399 },
 } };
 
 static const struct ComicBox block_p11_b12_boxes[] = {
-    { 4, 255, 362, 245, "      WELL, DARKSHEER, WHAT\n      DO YOU THINK?", "       ALORS, DARKSHEER,\n  QU'EST-CE QUE VOUS EN PENSEZ?", "      BIEN, TENEBROSO, QUE\n      DICES A ESO?", "      NUN, DARKSHEER, WAS\n      HALTEN SIE DAVON?" },
-    { 2, 246, 332, 314, "      I SUPPOSE THAT WOULD\n      BE ALL RIGHT...", "        JE PENSE QUE \x80""A\n        POURRAIT ALLER...", "      SUPONGO QUE ES UNA\n      BUENA IDEA...", "      ICH SCH\x8e""TZE, DAS GEHT\n       IN ORDNUNG..." },
+	{ 4, 255, 362, 245, "      WELL, DARKSHEER, WHAT\n      DO YOU THINK?", "       ALORS, DARKSHEER,\n  QU'EST-CE QUE VOUS EN PENSEZ?", "      BIEN, TENEBROSO, QUE\n      DICES A ESO?", "      NUN, DARKSHEER, WAS\n      HALTEN SIE DAVON?" },
+	{ 2, 246, 332, 314, "      I SUPPOSE THAT WOULD\n      BE ALL RIGHT...", "        JE PENSE QUE \x80""A\n        POURRAIT ALLER...", "      SUPONGO QUE ES UNA\n      BUENA IDEA...", "      ICH SCH\x8e""TZE, DAS GEHT\n       IN ORDNUNG..." },
 };
 
 static const struct ComicBlock block_p11_12 = { &poly_p11_b12, -1, -1, block_p11_b12_boxes, 2 };
 
 static const struct ComicBlock page_11_blocks[] = {
-    block_p11_0,
-    block_p11_1,
-    block_p11_2,
-    block_p11_3,
-    block_p11_4,
-    block_p11_5,
-    block_p11_6,
-    block_p11_7,
-    block_p11_8,
-    block_p11_9,
-    block_p11_10,
-    block_p11_11,
-    block_p11_12,
+	block_p11_0,
+	block_p11_1,
+	block_p11_2,
+	block_p11_3,
+	block_p11_4,
+	block_p11_5,
+	block_p11_6,
+	block_p11_7,
+	block_p11_8,
+	block_p11_9,
+	block_p11_10,
+	block_p11_11,
+	block_p11_12,
 };
 
 static struct ComicPage page_11 = { "DARK/COMDATA/LEPG2021.SCN", 98, 15, 1, 0, page_11_blocks, 13 };
 
 static const struct Polygon poly_p12_b0 = { {
-    { 186, 112 },
-    { 220, 123 },
-    { 229, 144 },
-    { 219, 167 },
-    { 186, 177 },
-    { 155, 169 },
-    { 144, 144 },
-    { 158, 118 },
+	{ 186, 112 },
+	{ 220, 123 },
+	{ 229, 144 },
+	{ 219, 167 },
+	{ 186, 177 },
+	{ 155, 169 },
+	{ 144, 144 },
+	{ 158, 118 },
 } };
 
 static const struct ComicBox block_p12_b0_boxes[] = {
-    { 1, 255, 244, 170, "      FORGIVE ME FATHER, FOR\n      I HAVE SINNED...", "\n    PARDONNEZ-MOI, MON PERE,\n    CAR J'AI PECHE...", "     PERDONEME, PADRE, PORQUE\n      HE PECADO...", "     VERGIB MIR, VATER, DENN\n     ICH HABE GES\x9a""NDIGT..." },
+	{ 1, 255, 244, 170, "      FORGIVE ME FATHER, FOR\n      I HAVE SINNED...", "\n    PARDONNEZ-MOI, MON PERE,\n    CAR J'AI PECHE...", "     PERDONEME, PADRE, PORQUE\n      HE PECADO...", "     VERGIB MIR, VATER, DENN\n     ICH HABE GES\x9a""NDIGT..." },
 };
 
 static const struct ComicBlock block_p12_0 = { &poly_p12_b0, -1, -1, block_p12_b0_boxes, 1 };
 
 static const struct Polygon poly_p12_b1 = { {
-    { 57, 3 },
-    { 179, 3 },
-    { 182, 140 },
-    { 57, 137 },
+	{ 57, 3 },
+	{ 179, 3 },
+	{ 182, 140 },
+	{ 57, 137 },
 } };
 
 static const struct ComicBox block_p12_b1_boxes[] = {
-    { 0, 246, 84, 113, "THE NOCTROPOLIS CITY CATHEDRAL", "CATHEDRALE DE NOCTROPOLIS", "LA CATEDRAL DE NOCTROPOLIS", "DER DOM VON NOCTROPOLIS" },
-    { 5, 255, 168, 93, "      I DON'T KNOW WHAT ELSE\n   TO DO... WHO TO TALK TO. I\n    WONDER IF DESMOND EVEN\n          KNOWS YET.", "       JE NE SAIS PAS QUOI\n   FAIRE... NI A QUI PARLER. JE\n ME DEMANDE SI LE PERE DESMOND\n         EST AU COURANT...", "      NO SE QUE HACER NI A\n   QUIEN HABLAR. ME PREGUNTO\n      SI DESMOND LO\n         SABRA.", "      ICH WEI\xe1"" NICHT MEHR,\n  WAS ICH NOCH TUN KANN....MIT WEM\n ICH NOCH REDEN KANN. OB ES VATER\n  DESMOND \x9a""BERHAUPT SCHON WEI\xe1""?" },
+	{ 0, 246, 84, 113, "THE NOCTROPOLIS CITY CATHEDRAL", "CATHEDRALE DE NOCTROPOLIS", "LA CATEDRAL DE NOCTROPOLIS", "DER DOM VON NOCTROPOLIS" },
+	{ 5, 255, 168, 93, "      I DON'T KNOW WHAT ELSE\n   TO DO... WHO TO TALK TO. I\n    WONDER IF DESMOND EVEN\n          KNOWS YET.", "       JE NE SAIS PAS QUOI\n   FAIRE... NI A QUI PARLER. JE\n ME DEMANDE SI LE PERE DESMOND\n         EST AU COURANT...", "      NO SE QUE HACER NI A\n   QUIEN HABLAR. ME PREGUNTO\n      SI DESMOND LO\n         SABRA.", "      ICH WEI\xe1"" NICHT MEHR,\n  WAS ICH NOCH TUN KANN....MIT WEM\n ICH NOCH REDEN KANN. OB ES VATER\n  DESMOND \x9a""BERHAUPT SCHON WEI\xe1""?" },
 };
 
 static const struct ComicBlock block_p12_1 = { &poly_p12_b1, -1, -1, block_p12_b1_boxes, 2 };
 
 static const struct Polygon poly_p12_b2 = { {
-    { 193, 3 },
-    { 316, 3 },
-    { 316, 137 },
-    { 190, 140 },
+	{ 193, 3 },
+	{ 316, 3 },
+	{ 316, 137 },
+	{ 190, 140 },
 } };
 
 static const struct ComicBox block_p12_b2_boxes[] = {
-    { 7, 255, 325, 32, "      I HATE COMING HERE. THE\n CONFESSIONAL ALWAYS MAKES ME\n  FEEL SO... GUILTY. I HATE\n          COMING HERE.", "\n     J'AI HORREUR DE VENIR ICI.\n JE ME SENS TOUJOURS... COUPABLE\n  DANS UN CONFESSIONNAL. JE HAIS\n            CET ENDROIT.", "      ODIO VENIR AQUI. EL\n CONFESIONARIO SIEMPRE ME\n  HACE SENTIR... CULPABLE.", "\n       ICH HASSE ES HIER. BEI\n DER BEICHTE F\x9a""HLE ICH MICH IMMER\n    SO...SCHULDIG. ICH HASSE\n               ES HIER." },
+	{ 7, 255, 325, 32, "      I HATE COMING HERE. THE\n CONFESSIONAL ALWAYS MAKES ME\n  FEEL SO... GUILTY. I HATE\n          COMING HERE.", "\n     J'AI HORREUR DE VENIR ICI.\n JE ME SENS TOUJOURS... COUPABLE\n  DANS UN CONFESSIONNAL. JE HAIS\n            CET ENDROIT.", "      ODIO VENIR AQUI. EL\n CONFESIONARIO SIEMPRE ME\n  HACE SENTIR... CULPABLE.", "\n       ICH HASSE ES HIER. BEI\n DER BEICHTE F\x9a""HLE ICH MICH IMMER\n    SO...SCHULDIG. ICH HASSE\n               ES HIER." },
 };
 
 static const struct ComicBlock block_p12_2 = { &poly_p12_b2, -1, -1, block_p12_b2_boxes, 1 };
 
 static const struct Polygon poly_p12_b3 = { {
-    { 57, 152 },
-    { 181, 149 },
-    { 177, 396 },
-    { 57, 396 },
+	{ 57, 152 },
+	{ 181, 149 },
+	{ 177, 396 },
+	{ 57, 396 },
 } };
 
 static const struct ComicBox block_p12_b3_boxes[] = {
-    { 3, 255, 201, 181, "      STILETTO, HAVE YOU SEEN\n     THE PAPER? IT READS:\n    \"DARKSHEER TO RETIRE\"!\n NOW, WHAT THE HELL IS GOING ON?", "      STILETTO, TU AS LU LES\n    JOURNAUX? \"DARKSHEER PREND\n    SA RETRAITE!\" MAIS QUE SE\n            PASSE-T-IL?", "      STILETTO, HAS LEIDO\n     LA PRENSA? DICE QUE\n    TENEBROSO SE RETIRA!\n QUE DEMONIOS ESTA PASANDO?", "      STILETTO, HAST DU DIE\n     ZEITUNG GELESEN? DA STEHT\n    \"DARKSHEER IN PENSION\"!\n  WAS ZUR H\x99""LLE IST DA LOS?" },
-    { 3, 255, 132, 160, "       I WISH I KNEW, FATHER.\n  IT'S NOT THE SAME BETWEEN US\nANYMORE... WE HARDLY EVEN SPEAK\n            ANYMORE.", "       J'AIMERAIS LE SAVOIR,\n  PERE. CE N'EST PLUS LA MEME\nCHOSE ENTRE NOUS DEPUIS QUELQUE\n             TEMPS...", "       ESO QUERRIA SABER YO.\nTODO HA CAMBIADO ENTRE NOSOTROS.\n     YA NO HABLAMOS SIN PELEAR.", "       ICH W\x9a""NSCHTE, ICH W\x9a""\xe1""TE\n  ES, VATER. ES WAR IN LETZTER\n ZEIT ZWISCHEN UNS NICHT MEHR SO\n   WIE FR\x9a""HER...WIR REDEN KAUM\n          NOCH MITEINANDER." },
+	{ 3, 255, 201, 181, "      STILETTO, HAVE YOU SEEN\n     THE PAPER? IT READS:\n    \"DARKSHEER TO RETIRE\"!\n NOW, WHAT THE HELL IS GOING ON?", "      STILETTO, TU AS LU LES\n    JOURNAUX? \"DARKSHEER PREND\n    SA RETRAITE!\" MAIS QUE SE\n            PASSE-T-IL?", "      STILETTO, HAS LEIDO\n     LA PRENSA? DICE QUE\n    TENEBROSO SE RETIRA!\n QUE DEMONIOS ESTA PASANDO?", "      STILETTO, HAST DU DIE\n     ZEITUNG GELESEN? DA STEHT\n    \"DARKSHEER IN PENSION\"!\n  WAS ZUR H\x99""LLE IST DA LOS?" },
+	{ 3, 255, 132, 160, "       I WISH I KNEW, FATHER.\n  IT'S NOT THE SAME BETWEEN US\nANYMORE... WE HARDLY EVEN SPEAK\n            ANYMORE.", "       J'AIMERAIS LE SAVOIR,\n  PERE. CE N'EST PLUS LA MEME\nCHOSE ENTRE NOUS DEPUIS QUELQUE\n             TEMPS...", "       ESO QUERRIA SABER YO.\nTODO HA CAMBIADO ENTRE NOSOTROS.\n     YA NO HABLAMOS SIN PELEAR.", "       ICH W\x9a""NSCHTE, ICH W\x9a""\xe1""TE\n  ES, VATER. ES WAR IN LETZTER\n ZEIT ZWISCHEN UNS NICHT MEHR SO\n   WIE FR\x9a""HER...WIR REDEN KAUM\n          NOCH MITEINANDER." },
 };
 
 static const struct ComicBlock block_p12_3 = { &poly_p12_b3, -1, -1, block_p12_b3_boxes, 2 };
 
 static const struct Polygon poly_p12_b4 = { {
-    { 191, 149 },
-    { 316, 152 },
-    { 316, 396 },
-    { 196, 396 },
+	{ 191, 149 },
+	{ 316, 152 },
+	{ 316, 396 },
+	{ 196, 396 },
 } };
 
 static const struct ComicBox block_p12_b4_boxes[] = {
-    { 1, 255, 325, 262, "        I HAD TO READ IT IN THE\n   PAPER, TOO. THAT SON OF A - HE\n DOESN'T GIVE A DAMN ABOUT THINGS...\n  ABOUT ME!  HE'S JUST GOING TO\n   THROW IT ALL AWAY WITHOUT\n          LOOKING BACK.", "       JE L'AI APPRIS MOI AUSSI\n  DANS LE JOURNAL. CE FILS DE P...,\n IL SE FICHE PAS MAL DES AUTRES...\n ET DE MOI! IL VA SIMPLEMENT TOUT\n      ABANDONNER SANS REGRET.", "        ME HE ENTERADO POR\n   LA PRENSA. ESE HIJO DE... NO\n  FUE CAPAZ DE DECIRMELO!\n   NOS HA DADO A TODOS LA\n      ESPALDA.", "\n        SELBST ICH MU\xe1""TE ES AUS\n   DER ZEITUNG ERFAHREN. DIESER\n VERDAMMTE---ER K\x9a""MMERT SICH EINEN\nDRECK UM ALLES...UM MICH! ER SCHMEI\xe1""T\n   EINFACH ALLES WEG, OHNE SICH\n         AUCH NUR UMZUDREHEN." },
-    { 1, 255, 189, 258, "      EASY STILETTO, THERE\n  MUST BE AN EXPLANATION...", "     DU CALME, STILETTO, IL\n DOIT BIEN Y AVOIR UNE\n       EXPLICATION!", "      CALMA, STILETTO, DEBE\n DE HABER UNA EXPLICACION...", "      BERUHIGE DICH, STILETTO,\n  ES MU\xe1"" EINE VERN\x9a""NFTIGE\n    ERKL\x8e""RUNG DAF\x9a""R GEBEN." },
+	{ 1, 255, 325, 262, "        I HAD TO READ IT IN THE\n   PAPER, TOO. THAT SON OF A - HE\n DOESN'T GIVE A DAMN ABOUT THINGS...\n  ABOUT ME!  HE'S JUST GOING TO\n   THROW IT ALL AWAY WITHOUT\n          LOOKING BACK.", "       JE L'AI APPRIS MOI AUSSI\n  DANS LE JOURNAL. CE FILS DE P...,\n IL SE FICHE PAS MAL DES AUTRES...\n ET DE MOI! IL VA SIMPLEMENT TOUT\n      ABANDONNER SANS REGRET.", "        ME HE ENTERADO POR\n   LA PRENSA. ESE HIJO DE... NO\n  FUE CAPAZ DE DECIRMELO!\n   NOS HA DADO A TODOS LA\n      ESPALDA.", "\n        SELBST ICH MU\xe1""TE ES AUS\n   DER ZEITUNG ERFAHREN. DIESER\n VERDAMMTE---ER K\x9a""MMERT SICH EINEN\nDRECK UM ALLES...UM MICH! ER SCHMEI\xe1""T\n   EINFACH ALLES WEG, OHNE SICH\n         AUCH NUR UMZUDREHEN." },
+	{ 1, 255, 189, 258, "      EASY STILETTO, THERE\n  MUST BE AN EXPLANATION...", "     DU CALME, STILETTO, IL\n DOIT BIEN Y AVOIR UNE\n       EXPLICATION!", "      CALMA, STILETTO, DEBE\n DE HABER UNA EXPLICACION...", "      BERUHIGE DICH, STILETTO,\n  ES MU\xe1"" EINE VERN\x9a""NFTIGE\n    ERKL\x8e""RUNG DAF\x9a""R GEBEN." },
 };
 
 static const struct ComicBlock block_p12_4 = { &poly_p12_b4, -1, -1, block_p12_b4_boxes, 2 };
 
 static const struct Polygon poly_p12_b5 = { {
-    { 448, 140 },
-    { 482, 153 },
-    { 498, 186 },
-    { 485, 219 },
-    { 448, 235 },
-    { 409, 216 },
-    { 399, 183 },
-    { 404, 154 },
+	{ 448, 140 },
+	{ 482, 153 },
+	{ 498, 186 },
+	{ 485, 219 },
+	{ 448, 235 },
+	{ 409, 216 },
+	{ 399, 183 },
+	{ 404, 154 },
 } };
 
 static const struct ComicBox block_p12_b5_boxes[] = {
-    { 2, 255, 201, 219, "       THERE, THERE, STILETTO,\n    OF COURSE GOD HEARS YOUR\nPRAYERS. HE WANTS YOU TO BE HAPPY..\n BUT RIGHT NOW YOU MUST TALK TO\n  DARKSHEER. HE NO LONGER TAKES\n         MY COUNSEL...", "\n      ALLONS, ALLONS, STILETTO,\n    BIEN SUR QUE DIEU ENTEND TES\n   PRIERES... IL VEUT QUE TU SOIS\n HEUREUSE... MAIS POUR L'INSTANT, TU\n    DOIS PARLER A DARKSHEER. IL\n       REFUSE D'ECOUTER MES\n              CONSEILS.", "        TE EQUIVOCAS,\n    DIOS TE ESCUCHA Y DESEA\n QUE SEAS FELIZ...\n HABLALE A TENEBROSO. SIEMPRE\n EL TE HACE MAS CASO QUE A\n         MI...", "\n       KOMM, KOMM, STILETTO,\n   NAT\x9a""RLICH H\x99""RT GOTT DEINE GEBETE.\n  ER WILL, DA\xe1"" DU GL\x9a""CKLICH BIST...\n ABER ERSTMAL MU\xe1""T DU MIT DARKSHEER\n  REDEN. ER H\x99""RT NICHT MEHR AUF\n            MEINEN RAT." },
+	{ 2, 255, 201, 219, "       THERE, THERE, STILETTO,\n    OF COURSE GOD HEARS YOUR\nPRAYERS. HE WANTS YOU TO BE HAPPY..\n BUT RIGHT NOW YOU MUST TALK TO\n  DARKSHEER. HE NO LONGER TAKES\n         MY COUNSEL...", "\n      ALLONS, ALLONS, STILETTO,\n    BIEN SUR QUE DIEU ENTEND TES\n   PRIERES... IL VEUT QUE TU SOIS\n HEUREUSE... MAIS POUR L'INSTANT, TU\n    DOIS PARLER A DARKSHEER. IL\n       REFUSE D'ECOUTER MES\n              CONSEILS.", "        TE EQUIVOCAS,\n    DIOS TE ESCUCHA Y DESEA\n QUE SEAS FELIZ...\n HABLALE A TENEBROSO. SIEMPRE\n EL TE HACE MAS CASO QUE A\n         MI...", "\n       KOMM, KOMM, STILETTO,\n   NAT\x9a""RLICH H\x99""RT GOTT DEINE GEBETE.\n  ER WILL, DA\xe1"" DU GL\x9a""CKLICH BIST...\n ABER ERSTMAL MU\xe1""T DU MIT DARKSHEER\n  REDEN. ER H\x99""RT NICHT MEHR AUF\n            MEINEN RAT." },
 };
 
 static const struct ComicBlock block_p12_5 = { &poly_p12_b5, -1, -1, block_p12_b5_boxes, 1 };
 
 static const struct Polygon poly_p12_b6 = { {
-    { 317, 0 },
-    { 400, 0 },
-    { 400, 83 },
-    { 317, 83 },
+	{ 317, 0 },
+	{ 400, 0 },
+	{ 400, 83 },
+	{ 317, 83 },
 } };
 
 static const struct ComicBox block_p12_b6_boxes[] = {
-    { 1, 255, 406, 57, "      DO YOU BELIEVE GOD'S\n REALLY THERE, FATHER? IS ALL\nTHAT CRAP ABOUT HEARING PRAYERS\n AND GIVING BLESSINGS FOR REAL...?", "      VOUS CROYEZ VRAIMENT\n  QUE DIEU EST LA, PERE? TOUTES\n  CES HISTOIRES DE PRIERES ET DE\n BENEDICTIONS, C'EST DONC VRAI?", "     CREE QUE DIOS ESTA\n AQUI, PADRE? Y QUE ESCUCHA\n NUESTRAS PLEGARIAS?", "\n      GLAUBEN SIE DENN WIRKLICH,\n DA\xe1"" ES EINEN GOTT GIBT, VATER? DA\xe1""\n  AN ALL DIESEM UNFUG MIT GEBETEN\n      UND SEGEN WAS DRAN IST?" },
+	{ 1, 255, 406, 57, "      DO YOU BELIEVE GOD'S\n REALLY THERE, FATHER? IS ALL\nTHAT CRAP ABOUT HEARING PRAYERS\n AND GIVING BLESSINGS FOR REAL...?", "      VOUS CROYEZ VRAIMENT\n  QUE DIEU EST LA, PERE? TOUTES\n  CES HISTOIRES DE PRIERES ET DE\n BENEDICTIONS, C'EST DONC VRAI?", "     CREE QUE DIOS ESTA\n AQUI, PADRE? Y QUE ESCUCHA\n NUESTRAS PLEGARIAS?", "\n      GLAUBEN SIE DENN WIRKLICH,\n DA\xe1"" ES EINEN GOTT GIBT, VATER? DA\xe1""\n  AN ALL DIESEM UNFUG MIT GEBETEN\n      UND SEGEN WAS DRAN IST?" },
 };
 
 static const struct ComicBlock block_p12_6 = { &poly_p12_b6, -1, -1, block_p12_b6_boxes, 1 };
 
 static const struct Polygon poly_p12_b7 = { {
-    { 496, 0 },
-    { 580, 0 },
-    { 580, 154 },
-    { 496, 154 },
+	{ 496, 0 },
+	{ 580, 0 },
+	{ 580, 154 },
+	{ 496, 154 },
 } };
 
 static const struct ComicBox block_p12_b7_boxes[] = {
-    { 6, 255, 306, 79, "      IF THERE IS A GOD, HE\n  DOESN'T HEAR MY PRAYERS...", "      S'IL Y A UN DIEU, IL\n  N'ENTEND PAS MES PRIERES.", "    SI HAY UN DIOS, SE HA\n  OLVIDADO DE MI...", "      WENN ES EINEN GOTT GIBT,\n  DANN H\x99""RT ER MEINE GEBETE\n            NICHT." },
+	{ 6, 255, 306, 79, "      IF THERE IS A GOD, HE\n  DOESN'T HEAR MY PRAYERS...", "      S'IL Y A UN DIEU, IL\n  N'ENTEND PAS MES PRIERES.", "    SI HAY UN DIOS, SE HA\n  OLVIDADO DE MI...", "      WENN ES EINEN GOTT GIBT,\n  DANN H\x99""RT ER MEINE GEBETE\n            NICHT." },
 };
 
 static const struct ComicBlock block_p12_7 = { &poly_p12_b7, -1, -1, block_p12_b7_boxes, 1 };
 
 static const struct Polygon poly_p12_b8 = { {
-    { 317, 83 },
-    { 446, 83 },
-    { 446, 292 },
-    { 317, 292 },
+	{ 317, 83 },
+	{ 446, 83 },
+	{ 446, 292 },
+	{ 317, 292 },
 } };
 
 static const struct ComicBox block_p12_b8_boxes[] = {
-    { 2, 255, 126, 112, "       YOU DON'T UNDERSTAND,\n FATHER...I LOVE HIM! I LOVE HIM\n AND HE'S READY TO WALK OUT OF\n          MY LIFE!", "       VOUS NE COMPRENEZ PAS,\n MON PERE... JE L'AIME! JE L'AIME\n         ET IL M'ABANDONNE!", "       USTED NO COMPRENDE,\n PADRE... YO LO AMO! Y AHORA VA\n A ESCAPAR DE MI!", "       SIE VERSTEHEN NICHT,\n  VATER...ICH LIEBE IHN! ICH LIEBE\n IHN, UND ER WILL EINFACH SO AUS\n   MEINEM LEBEN VERSCHWINDEN!" },
-    { 1, 255, 431, 102, "      I KNOW YOUR FEELINGS...\n THAT'S WHY YOU HAVE TO BE THE\nONE TO CONVINCE HIM THAT THIS\n DECISION TO RETIRE IS WRONG.", "     JE CONNAIS TES SENTIMENTS...\n C'EST POUR CETTE RAISON QUE TU\nDOIS LE CONVAINCRE QUE SA DECISION\n     DE PARTIR EST UNE ERREUR.", "    SIEMPRE LO HE SABIDO...\n ES POR ESO QUE ERES TU QUIEN\n DEBE CONVENCERLO DE QUE ESTA\n EN UN ERROR AL RETIRARSE.", "      ICH KENNE DEINE GEF\x9a""HLE...\n    DARUM IST ES JA AUCH DEINE\nAUFGABE, IHN ZU \x9a""BERZEUGEN, DA\xe1""\n  SEIN ENTSCHLU\xe1"", SICH ZUR RUHE ZU\n         SETZEN, FALSCH IST." },
+	{ 2, 255, 126, 112, "       YOU DON'T UNDERSTAND,\n FATHER...I LOVE HIM! I LOVE HIM\n AND HE'S READY TO WALK OUT OF\n          MY LIFE!", "       VOUS NE COMPRENEZ PAS,\n MON PERE... JE L'AIME! JE L'AIME\n         ET IL M'ABANDONNE!", "       USTED NO COMPRENDE,\n PADRE... YO LO AMO! Y AHORA VA\n A ESCAPAR DE MI!", "       SIE VERSTEHEN NICHT,\n  VATER...ICH LIEBE IHN! ICH LIEBE\n IHN, UND ER WILL EINFACH SO AUS\n   MEINEM LEBEN VERSCHWINDEN!" },
+	{ 1, 255, 431, 102, "      I KNOW YOUR FEELINGS...\n THAT'S WHY YOU HAVE TO BE THE\nONE TO CONVINCE HIM THAT THIS\n DECISION TO RETIRE IS WRONG.", "     JE CONNAIS TES SENTIMENTS...\n C'EST POUR CETTE RAISON QUE TU\nDOIS LE CONVAINCRE QUE SA DECISION\n     DE PARTIR EST UNE ERREUR.", "    SIEMPRE LO HE SABIDO...\n ES POR ESO QUE ERES TU QUIEN\n DEBE CONVENCERLO DE QUE ESTA\n EN UN ERROR AL RETIRARSE.", "      ICH KENNE DEINE GEF\x9a""HLE...\n    DARUM IST ES JA AUCH DEINE\nAUFGABE, IHN ZU \x9a""BERZEUGEN, DA\xe1""\n  SEIN ENTSCHLU\xe1"", SICH ZUR RUHE ZU\n         SETZEN, FALSCH IST." },
 };
 
 static const struct ComicBlock block_p12_8 = { &poly_p12_b8, -1, -1, block_p12_b8_boxes, 2 };
 
 static const struct Polygon poly_p12_b9 = { {
-    { 317, 292 },
-    { 446, 292 },
-    { 446, 399 },
-    { 317, 399 },
+	{ 317, 292 },
+	{ 446, 292 },
+	{ 446, 399 },
+	{ 317, 399 },
 } };
 
 static const struct ComicBox block_p12_b9_boxes[] = {
-    { 4, 255, 156, 238, "        COME, I'LL WALK YOU\n  OUT. STILETTO, I KNOW IN MY HEART\nTHAT IF YOU CAN PERSUADE DARKSHEER\n  TO STAY, THEN HE'LL RETURN YOUR\n   AFFECTION.  YOU WILL TRY,\n          WON'T YOU?", "\n        VIENS, JE VAIS TE\n  RACCOMPAGNER. STILETTO, JE SAIS,\nAU FOND DE MON COEUR, QUE SI TU\nPEUX PERSUADER DARKSHEER DE RESTER,\n     IL TE RENDRA TON AFFECTION.\n            TU ESSAIERAS? ", "        VE, SE QUE TU PUEDES\n  CONVENCER A TENEBROSO.\n  MUESTRALE TUS SENTIMIENTOS. LO\n  INTENTARAS, VERDAD?", "\n        KOMM, ICH BRINGE DICH\n  ZUR T\x9a""R. STILETTO, ICH WEI\xe1"" GENAU,\nWENN DU ES SCHAFFST, DARKSHEER ZUM\n BLEIBEN ZU \x9a""BERREDEN, WIRD ER DEINE\n  GEF\x9a""HLE ERWIDERN. DU WIRST ES\n      VERSUCHEN, NICHT WAHR?" },
+	{ 4, 255, 156, 238, "        COME, I'LL WALK YOU\n  OUT. STILETTO, I KNOW IN MY HEART\nTHAT IF YOU CAN PERSUADE DARKSHEER\n  TO STAY, THEN HE'LL RETURN YOUR\n   AFFECTION.  YOU WILL TRY,\n          WON'T YOU?", "\n        VIENS, JE VAIS TE\n  RACCOMPAGNER. STILETTO, JE SAIS,\nAU FOND DE MON COEUR, QUE SI TU\nPEUX PERSUADER DARKSHEER DE RESTER,\n     IL TE RENDRA TON AFFECTION.\n            TU ESSAIERAS? ", "        VE, SE QUE TU PUEDES\n  CONVENCER A TENEBROSO.\n  MUESTRALE TUS SENTIMIENTOS. LO\n  INTENTARAS, VERDAD?", "\n        KOMM, ICH BRINGE DICH\n  ZUR T\x9a""R. STILETTO, ICH WEI\xe1"" GENAU,\nWENN DU ES SCHAFFST, DARKSHEER ZUM\n BLEIBEN ZU \x9a""BERREDEN, WIRD ER DEINE\n  GEF\x9a""HLE ERWIDERN. DU WIRST ES\n      VERSUCHEN, NICHT WAHR?" },
 };
 
 static const struct ComicBlock block_p12_9 = { &poly_p12_b9, -1, -1, block_p12_b9_boxes, 1 };
 
 static const struct Polygon poly_p12_b10 = { {
-    { 448, 154 },
-    { 580, 154 },
-    { 580, 399 },
-    { 448, 399 },
+	{ 448, 154 },
+	{ 580, 154 },
+	{ 580, 399 },
+	{ 448, 399 },
 } };
 
 static const struct ComicBox block_p12_b10_boxes[] = {
-    { 4, 255, 252, 263, "      I-I'LL TRY, FATHER...", "        JE... J'ESSAIERAI,\n        MON PERE.", "  LO INTENTARE, PADRE...", "         ICH...ICH WERDE ES\n         VERSUCHEN, VATER..." },
+	{ 4, 255, 252, 263, "      I-I'LL TRY, FATHER...", "        JE... J'ESSAIERAI,\n        MON PERE.", "  LO INTENTARE, PADRE...", "         ICH...ICH WERDE ES\n         VERSUCHEN, VATER..." },
 };
 
 static const struct ComicBlock block_p12_10 = { &poly_p12_b10, -1, -1, block_p12_b10_boxes, 1 };
 
 static const struct ComicBlock page_12_blocks[] = {
-    block_p12_0,
-    block_p12_1,
-    block_p12_2,
-    block_p12_3,
-    block_p12_4,
-    block_p12_5,
-    block_p12_6,
-    block_p12_7,
-    block_p12_8,
-    block_p12_9,
-    block_p12_10,
+	block_p12_0,
+	block_p12_1,
+	block_p12_2,
+	block_p12_3,
+	block_p12_4,
+	block_p12_5,
+	block_p12_6,
+	block_p12_7,
+	block_p12_8,
+	block_p12_9,
+	block_p12_10,
 };
 
 static struct ComicPage page_12 = { "DARK/COMDATA/LEPG2223.SCN", 98, 51, 1, 0, page_12_blocks, 11 };
 
 static const struct Polygon poly_p13_b0 = { {
-    { 188, 0 },
-    { 270, 0 },
-    { 285, 141 },
-    { 270, 145 },
-    { 188, 91 },
+	{ 188, 0 },
+	{ 270, 0 },
+	{ 285, 141 },
+	{ 270, 145 },
+	{ 188, 91 },
 } };
 
 static const struct ComicBox block_p13_b0_boxes[] = {
-    { 2, 246, 13, 86, "      WHAT THE HELL?!", "\n      QUE SE PASSE-T-IL?!", "      QUE DEMONIOS?!", "\n        WAS ZUR H\x99""LLE?!" },
+	{ 2, 246, 13, 86, "      WHAT THE HELL?!", "\n      QUE SE PASSE-T-IL?!", "      QUE DEMONIOS?!", "\n        WAS ZUR H\x99""LLE?!" },
 };
 
 static const struct ComicBlock block_p13_0 = { &poly_p13_b0, 99, 25, block_p13_b0_boxes, 1 };
 
 static const struct Polygon poly_p13_b1 = { {
-    { 188, 91 },
-    { 270, 145 },
-    { 240, 156 },
-    { 222, 189 },
-    { 188, 189 },
+	{ 188, 91 },
+	{ 270, 145 },
+	{ 240, 156 },
+	{ 222, 189 },
+	{ 188, 189 },
 } };
 
 static const struct ComicBox block_p13_b1_boxes[] = {
-    { 1, 246, 261, 193, "      YOU'D BETTER HAVE A\nDAMN GOOD REASON FOR DOING\n      THAT, STILETTO!", "     J'ESPERE QUE TU AS UNE\n    BONNE RAISON DE FAIRE \x80""A,\n            STILETTO!", "  SUPONGO QUE TENDRAS UNA\n BUENA RAZON PARA HACER\n      ESTO, STILETTO!", "      ICH HOFFE, DU HAST EINEN\n VERDAMMT GUTEN GRUND DAF\x9a""R,\n            STILETTO!" },
+	{ 1, 246, 261, 193, "      YOU'D BETTER HAVE A\nDAMN GOOD REASON FOR DOING\n      THAT, STILETTO!", "     J'ESPERE QUE TU AS UNE\n    BONNE RAISON DE FAIRE \x80""A,\n            STILETTO!", "  SUPONGO QUE TENDRAS UNA\n BUENA RAZON PARA HACER\n      ESTO, STILETTO!", "      ICH HOFFE, DU HAST EINEN\n VERDAMMT GUTEN GRUND DAF\x9a""R,\n            STILETTO!" },
 };
 
 static const struct ComicBlock block_p13_1 = { &poly_p13_b1, -1, -1, block_p13_b1_boxes, 1 };
 
 static const struct Polygon poly_p13_b2 = { {
-    { 270, 0 },
-    { 369, 0 },
-    { 351, 140 },
-    { 285, 141 },
+	{ 270, 0 },
+	{ 369, 0 },
+	{ 351, 140 },
+	{ 285, 141 },
 } };
 
 static const struct ComicBox block_p13_b2_boxes[] = {
-    { 1, 255, 372, 62, "        I THOUGHT YOU MIGHT\n   BE GETTING SOFT...THAT MIGHT\n  EXPLAIN YOUR \"RETIREMENT!\" I\n APPRECIATE YOU TALKING WITH ME\n  BEFORE PUBLICLY DISSOLVING OUR\n          PARTNERSHIP.", "        JE VOYAIS BIEN QUE TU\n   DEVENAIS MOU... CE QUI EXPLIQUE\nTA \"RETRAITE\"!  C'EST GENTIL DE ME\n   PARLER AVANT DE DISSOUDRE EN\n        PUBLIC NOTRE EQUIPE!", "     PENSE QUE TE ESTABAS\n  DEBILITANDO Y QUE ESO EXPLICABA\n  TU \"RETIRO\"! YO HUBIERA\n PREFERIDO QUE HABLARAS CONMIGO\n ANTES DE DISOLVER PUBLICAMENTE\n    NUESTRA SOCIEDAD.", "         ICH DACHTE, DU WIRST\n    VIELLEICHT WEICH. DAS K\x99""NNTE\n  DEINE \"PENSIONIERUNG\" ERKL\x8e""REN.\n DANKE, DA\xe1"" DU ES MIR SO SCHONEND\n BEIGEBRACHT UND \x99""FFENTLICH DAS\n    ENDE UNSERER PARTNERSCHAFT\n        BEKANNTGEGEBEN HAST." },
+	{ 1, 255, 372, 62, "        I THOUGHT YOU MIGHT\n   BE GETTING SOFT...THAT MIGHT\n  EXPLAIN YOUR \"RETIREMENT!\" I\n APPRECIATE YOU TALKING WITH ME\n  BEFORE PUBLICLY DISSOLVING OUR\n          PARTNERSHIP.", "        JE VOYAIS BIEN QUE TU\n   DEVENAIS MOU... CE QUI EXPLIQUE\nTA \"RETRAITE\"!  C'EST GENTIL DE ME\n   PARLER AVANT DE DISSOUDRE EN\n        PUBLIC NOTRE EQUIPE!", "     PENSE QUE TE ESTABAS\n  DEBILITANDO Y QUE ESO EXPLICABA\n  TU \"RETIRO\"! YO HUBIERA\n PREFERIDO QUE HABLARAS CONMIGO\n ANTES DE DISOLVER PUBLICAMENTE\n    NUESTRA SOCIEDAD.", "         ICH DACHTE, DU WIRST\n    VIELLEICHT WEICH. DAS K\x99""NNTE\n  DEINE \"PENSIONIERUNG\" ERKL\x8e""REN.\n DANKE, DA\xe1"" DU ES MIR SO SCHONEND\n BEIGEBRACHT UND \x99""FFENTLICH DAS\n    ENDE UNSERER PARTNERSCHAFT\n        BEKANNTGEGEBEN HAST." },
 };
 
 static const struct ComicBlock block_p13_2 = { &poly_p13_b2, -1, -1, block_p13_b2_boxes, 1 };
 
 static const struct Polygon poly_p13_b3 = { {
-    { 369, 0 },
-    { 450, 0 },
-    { 450, 95 },
-    { 360, 66 },
+	{ 369, 0 },
+	{ 450, 0 },
+	{ 450, 95 },
+	{ 360, 66 },
 } };
 
 static const struct ComicBox block_p13_b3_boxes[] = {
-    { 2, 246, 191, 75, "      LOOK, STILETTO, I'M\n  SORRY...IF IT'S ANY CONSOLATION,\n THE HARDEST THING WILL BE\n         LEAVING YOU...", "      ECOUTE, STILETTO, JE\n   SUIS DESOLE. SI \x80""A PEUT TE\nCONSOLER, SACHE QUE LE PLUS DUR\n       POUR MOI SERA DE TE\n            QUITTER....", "  LO SIENTO, STILETTO, SI\n ESO TE SIRVE DE CONSUELO, LO\n MAS DURO HA SIDO DEJARTE.", "      H\x99""R MAL, STILETTO, ES\n  TUT MIR LEID. WENN ES DICH\n BERUHIGT: DICH ZU VERLASSEN, WIRD\n   DAS SCHWERSTE DARAN SEIN..." },
+	{ 2, 246, 191, 75, "      LOOK, STILETTO, I'M\n  SORRY...IF IT'S ANY CONSOLATION,\n THE HARDEST THING WILL BE\n         LEAVING YOU...", "      ECOUTE, STILETTO, JE\n   SUIS DESOLE. SI \x80""A PEUT TE\nCONSOLER, SACHE QUE LE PLUS DUR\n       POUR MOI SERA DE TE\n            QUITTER....", "  LO SIENTO, STILETTO, SI\n ESO TE SIRVE DE CONSUELO, LO\n MAS DURO HA SIDO DEJARTE.", "      H\x99""R MAL, STILETTO, ES\n  TUT MIR LEID. WENN ES DICH\n BERUHIGT: DICH ZU VERLASSEN, WIRD\n   DAS SCHWERSTE DARAN SEIN..." },
 };
 
 static const struct ComicBlock block_p13_3 = { &poly_p13_b3, -1, -1, block_p13_b3_boxes, 1 };
 
 static const struct Polygon poly_p13_b4 = { {
-    { 360, 66 },
-    { 450, 95 },
-    { 450, 189 },
-    { 415, 189 },
-    { 395, 159 },
-    { 351, 140 },
+	{ 360, 66 },
+	{ 450, 95 },
+	{ 450, 189 },
+	{ 415, 189 },
+	{ 395, 159 },
+	{ 351, 140 },
 } };
 
 static const struct ComicBox block_p13_b4_boxes[] = {
-    { 1, 255, 473, 175, "    DO YOU REALLY MEAN THAT?", "\nTU PENSES VRAIMENT CE QUE TU DIS?", "   LO DICES EN SERIO?", "\n     MEINST DU DAS EHRLICH?" },
+	{ 1, 255, 473, 175, "    DO YOU REALLY MEAN THAT?", "\nTU PENSES VRAIMENT CE QUE TU DIS?", "   LO DICES EN SERIO?", "\n     MEINST DU DAS EHRLICH?" },
 };
 
 static const struct ComicBlock block_p13_4 = { &poly_p13_b4, -1, -1, block_p13_b4_boxes, 1 };
 
 static const struct Polygon poly_p13_b5 = { {
-    { 222, 189 },
-    { 240, 156 },
-    { 285, 141 },
-    { 318, 138 },
-    { 318, 202 },
-    { 254, 201 },
-    { 285, 226 },
+	{ 222, 189 },
+	{ 240, 156 },
+	{ 285, 141 },
+	{ 318, 138 },
+	{ 318, 202 },
+	{ 254, 201 },
+	{ 285, 226 },
 } };
 
 static const struct ComicBox block_p13_b5_boxes[] = {
-    { 3, 255, 309, 112, "    LET ME SHOW YOU...", "\n  LAISSE-MOI TE LE PROUVER....", "   TE LO DEMOSTRARE...", "\n    KOMM, ICH ZEIGE ES DIR...." },
-    { 3, 255, 339, 112, "    OH, YESSS...! WHAT IS IT?\n     WHY ARE YOU STOPPING?!", "           OH, OUIIII..!\n QU'EST-CE QU'IL Y A? POURQUOI\n           TU ARRETES?!", "  QUE HACES?\r  POR QUE TE DETIENES?!", "        OH, JAAAA...!\n   WAS IST LOS? WARUM H\x99""RST\n           DU AUF?" },
+	{ 3, 255, 309, 112, "    LET ME SHOW YOU...", "\n  LAISSE-MOI TE LE PROUVER....", "   TE LO DEMOSTRARE...", "\n    KOMM, ICH ZEIGE ES DIR...." },
+	{ 3, 255, 339, 112, "    OH, YESSS...! WHAT IS IT?\n     WHY ARE YOU STOPPING?!", "           OH, OUIIII..!\n QU'EST-CE QU'IL Y A? POURQUOI\n           TU ARRETES?!", "  QUE HACES?\r  POR QUE TE DETIENES?!", "        OH, JAAAA...!\n   WAS IST LOS? WARUM H\x99""RST\n           DU AUF?" },
 };
 
 static const struct ComicBlock block_p13_5 = { &poly_p13_b5, -1, -1, block_p13_b5_boxes, 2 };
 
 static const struct Polygon poly_p13_b6 = { {
-    { 318, 138 },
-    { 351, 140 },
-    { 395, 159 },
-    { 415, 189 },
-    { 380, 228 },
-    { 383, 201 },
-    { 318, 202 },
+	{ 318, 138 },
+	{ 351, 140 },
+	{ 395, 159 },
+	{ 415, 189 },
+	{ 380, 228 },
+	{ 383, 201 },
+	{ 318, 202 },
 } };
 
 static const struct ComicBox block_p13_b6_boxes[] = {
-    { 4, 246, 121, 110, "      THIS CAN'T WORK OUT,\n STILETTO...I'VE GOT A PARADE\nJUST HOURS FROM NOW, AFTER THAT\n     I'M LEAVING TOWN.", "      STILETTO, \x80""A NE PEUT\n PAS MARCHER... J'AI UN DEFILE\nDANS QUELQUES HEURES, ET JE QUITTE\n        LA VILLE ENSUITE... ", "   ES TARDE,\n STILETTO... AHORA DEBO\n ASISTIR AL DESFILE. LUEGO\n     ME IRE DE LA CIUDAD.", "      DAS KANN NICHT GUTGEHEN,\n  STILETTO...IN EIN PAAR STUNDEN\n    IST DIESE PARADE, DANACH\n   VERSCHWINDE ICH AUS DER STADT." },
-    { 3, 255, 453, 122, "     I KNOW. BUT THERE'S\n SOMETHING YOU DON'T KNOW...\n SOMETHING I'VE NEVER TOLD YOU.", "       JE SAIS. MAIS IL Y A\n  QUELQUE CHOSE QUE TU NE SAIS\n   PAS... QUELQUE CHOSE QUE JE NE\n            T'AI JAMAIS DIT....", "     LO SE. PERO HAY\n ALGO QUE NO SABES...\n ALGO QUE NUNCA TE HE DICHO.", "       ICH WEI\xe1"". ABER DA IST\n  NOCH ETWAS, DAS DU NICHT WEI\xe1""T...\n     ETWAS, DAS ICH DIR NIE\n         GESAGT HABE..." },
+	{ 4, 246, 121, 110, "      THIS CAN'T WORK OUT,\n STILETTO...I'VE GOT A PARADE\nJUST HOURS FROM NOW, AFTER THAT\n     I'M LEAVING TOWN.", "      STILETTO, \x80""A NE PEUT\n PAS MARCHER... J'AI UN DEFILE\nDANS QUELQUES HEURES, ET JE QUITTE\n        LA VILLE ENSUITE... ", "   ES TARDE,\n STILETTO... AHORA DEBO\n ASISTIR AL DESFILE. LUEGO\n     ME IRE DE LA CIUDAD.", "      DAS KANN NICHT GUTGEHEN,\n  STILETTO...IN EIN PAAR STUNDEN\n    IST DIESE PARADE, DANACH\n   VERSCHWINDE ICH AUS DER STADT." },
+	{ 3, 255, 453, 122, "     I KNOW. BUT THERE'S\n SOMETHING YOU DON'T KNOW...\n SOMETHING I'VE NEVER TOLD YOU.", "       JE SAIS. MAIS IL Y A\n  QUELQUE CHOSE QUE TU NE SAIS\n   PAS... QUELQUE CHOSE QUE JE NE\n            T'AI JAMAIS DIT....", "     LO SE. PERO HAY\n ALGO QUE NO SABES...\n ALGO QUE NUNCA TE HE DICHO.", "       ICH WEI\xe1"". ABER DA IST\n  NOCH ETWAS, DAS DU NICHT WEI\xe1""T...\n     ETWAS, DAS ICH DIR NIE\n         GESAGT HABE..." },
 };
 
 static const struct ComicBlock block_p13_6 = { &poly_p13_b6, -1, -1, block_p13_b6_boxes, 2 };
 
 static const struct Polygon poly_p13_b7 = { {
-    { 277, 399 },
-    { 274, 367 },
-    { 318, 334 },
-    { 361, 371 },
-    { 359, 399 },
+	{ 277, 399 },
+	{ 274, 367 },
+	{ 318, 334 },
+	{ 361, 371 },
+	{ 359, 399 },
 } };
 
 static const struct ComicBox block_p13_b7_boxes[] = {
-    { 3, 246, 381, 284, "       ...I'M SORRY, STILETTO,\n    BUT IT CAN'T BE LIKE THAT.\n I'VE MADE OTHER PLANS... GOALS\nTHAT JUST DON'T ACCOMMODATE A\n RELATIONSHIP. SOMEDAY YOU'LL\n   UNDERSTAND... GOODBYE.", "      JE SUIS DESOLE, STILETTO,\n   MAIS \x80""A NE PEUT PAS SE PASSER\nCOMME \x80""A. J'AI D'AUTRES PLANS... DES\n PLANS QUI NE ME PERMETTENT PAS DE\nCONSERVER UNE RELATION AMOUREUSE...\n      UN JOUR, TU COMPRENDRAS...\n              AU REVOIR.", "   ...LO SIENTO, STILETTO,\n   PERO NO PUEDE SER. HE HECHO\n OTROS PLANES... EN LOS QUE NO\n ES POSIBLE MANTENER UNA\n RELACION. ALGUN DIA LO\n   ENTENDERAS... ADIOS.", "\n      ES TUT MIR LEID, STILETTO,\n    ABER DAS KANN ICH NICHT. ICH\n HABE ANDERE PL\x8e""NE...ZIELE, DIE SICH\nMIT EINER BEZIEHUNG NICHT VEREINBAREN\n  LASSEN. EINES TAGES WIRST DU MICH\n        VERSTEHEN. LEB WOHL." },
+	{ 3, 246, 381, 284, "       ...I'M SORRY, STILETTO,\n    BUT IT CAN'T BE LIKE THAT.\n I'VE MADE OTHER PLANS... GOALS\nTHAT JUST DON'T ACCOMMODATE A\n RELATIONSHIP. SOMEDAY YOU'LL\n   UNDERSTAND... GOODBYE.", "      JE SUIS DESOLE, STILETTO,\n   MAIS \x80""A NE PEUT PAS SE PASSER\nCOMME \x80""A. J'AI D'AUTRES PLANS... DES\n PLANS QUI NE ME PERMETTENT PAS DE\nCONSERVER UNE RELATION AMOUREUSE...\n      UN JOUR, TU COMPRENDRAS...\n              AU REVOIR.", "   ...LO SIENTO, STILETTO,\n   PERO NO PUEDE SER. HE HECHO\n OTROS PLANES... EN LOS QUE NO\n ES POSIBLE MANTENER UNA\n RELACION. ALGUN DIA LO\n   ENTENDERAS... ADIOS.", "\n      ES TUT MIR LEID, STILETTO,\n    ABER DAS KANN ICH NICHT. ICH\n HABE ANDERE PL\x8e""NE...ZIELE, DIE SICH\nMIT EINER BEZIEHUNG NICHT VEREINBAREN\n  LASSEN. EINES TAGES WIRST DU MICH\n        VERSTEHEN. LEB WOHL." },
 };
 
 static const struct ComicBlock block_p13_7 = { &poly_p13_b7, -1, -1, block_p13_b7_boxes, 1 };
 
 static const struct Polygon poly_p13_b8 = { {
-    { 254, 201 },
-    { 383, 201 },
-    { 359, 399 },
-    { 277, 399 },
+	{ 254, 201 },
+	{ 383, 201 },
+	{ 359, 399 },
+	{ 277, 399 },
 } };
 
 static const struct ComicBox block_p13_b8_boxes[] = {
-    { 4, 255, 104, 230, "      I... LOVE YOU! IF YOU\n  WON'T CHANGE YOUR MIND ABOUT\nLEAVING, THEN PLEASE... LET ME\n      COME WITH YOU.", "      JE... JE T'AIME! SI TU\n NE VEUX PAS CHANGER D'AVIS AU\nSUJET DE TON DEPART, ALORS JE T'EN\n     PRIE... LAISSE-MOI VENIR\n            AVEC TOI!", "     YO... TE AMO! Y SI\n ESO NO TE HACE DESISTIR DE\n PARTIR... LLEVAME CONTIGO", "       ICH... LIEBE DICH! WENN\n   DU DEINE PL\x8e""NE SCHON NICHT\n    \x8e""NDERST, DANN...LA\xe1"" MICH\n      WENIGSTENS MIT DIR GEHEN!" },
+	{ 4, 255, 104, 230, "      I... LOVE YOU! IF YOU\n  WON'T CHANGE YOUR MIND ABOUT\nLEAVING, THEN PLEASE... LET ME\n      COME WITH YOU.", "      JE... JE T'AIME! SI TU\n NE VEUX PAS CHANGER D'AVIS AU\nSUJET DE TON DEPART, ALORS JE T'EN\n     PRIE... LAISSE-MOI VENIR\n            AVEC TOI!", "     YO... TE AMO! Y SI\n ESO NO TE HACE DESISTIR DE\n PARTIR... LLEVAME CONTIGO", "       ICH... LIEBE DICH! WENN\n   DU DEINE PL\x8e""NE SCHON NICHT\n    \x8e""NDERST, DANN...LA\xe1"" MICH\n      WENIGSTENS MIT DIR GEHEN!" },
 };
 
 static const struct ComicBlock block_p13_8 = { &poly_p13_b8, -1, -1, block_p13_b8_boxes, 1 };
 
 static const struct ComicBlock page_13_blocks[] = {
-    block_p13_0,
-    block_p13_1,
-    block_p13_2,
-    block_p13_3,
-    block_p13_4,
-    block_p13_5,
-    block_p13_6,
-    block_p13_7,
-    block_p13_8,
+	block_p13_0,
+	block_p13_1,
+	block_p13_2,
+	block_p13_3,
+	block_p13_4,
+	block_p13_5,
+	block_p13_6,
+	block_p13_7,
+	block_p13_8,
 };
 
 static struct ComicPage page_13 = { "DARK/COMDATA/LEPG24.SCN", 98, 52, 1, 0, page_13_blocks, 9 };
 
 static const struct Polygon poly_p14_b0 = { {
-    { 323, 111 },
-    { 417, 111 },
-    { 417, 164 },
-    { 323, 164 },
+	{ 323, 111 },
+	{ 417, 111 },
+	{ 417, 164 },
+	{ 323, 164 },
 } };
 
 static const struct ComicBox block_p14_b0_boxes[] = {
-    { 1, 255, 440, 161, "       NEVER AGAIN!!!", "\n         PLUS JAMAIS \x80""A!!!", "    NUNCA MAS!", "\n            NIE WIEDER!!!" },
+	{ 1, 255, 440, 161, "       NEVER AGAIN!!!", "\n         PLUS JAMAIS \x80""A!!!", "    NUNCA MAS!", "\n            NIE WIEDER!!!" },
 };
 
 static const struct ComicBlock block_p14_0 = { &poly_p14_b0, -1, -1, block_p14_b0_boxes, 1 };
 
 static const struct Polygon poly_p14_b1 = { {
-    { 476, 278 },
-    { 589, 278 },
-    { 589, 353 },
-    { 476, 353 },
+	{ 476, 278 },
+	{ 589, 278 },
+	{ 589, 353 },
+	{ 476, 353 },
 } };
 
 static const struct ComicBox block_p14_b1_boxes[] = {
-    { 4, 255, 322, 247, "      NEVER EVER AGAIN!!!", "\n  JAMAIS, NON, PLUS JAMAIS \x80""A!!!", "       NUNCA MAS!!!", "\n     NIEMALS, NIEMALS WIEDER!!!" },
+	{ 4, 255, 322, 247, "      NEVER EVER AGAIN!!!", "\n  JAMAIS, NON, PLUS JAMAIS \x80""A!!!", "       NUNCA MAS!!!", "\n     NIEMALS, NIEMALS WIEDER!!!" },
 };
 
 static const struct ComicBlock block_p14_1 = { &poly_p14_b1, -1, -1, block_p14_b1_boxes, 1 };
 
 static const struct Polygon poly_p14_b2 = { {
-    { 323, 0 },
-    { 589, 0 },
-    { 589, 83 },
-    { 451, 213 },
-    { 323, 90 },
+	{ 323, 0 },
+	{ 589, 0 },
+	{ 589, 83 },
+	{ 451, 213 },
+	{ 323, 90 },
 } };
 
 static const struct ComicBox block_p14_b2_boxes[] = {
-    { 2, 255, 225, 104, "      ...FURTHER MORE, IN\n  RECOGNITION OF CONSPICUOUS\nSERVICE TO THE REGISTERED VOTERS\n    OF NOCTROPOLIS CITY...", "     ... DE PLUS, EN\n  REMERCIEMENT DES SERVICES\n  DESINTERESSES RENDUS AUX\n  ELECTEURS DE NOCTROPOLIS...", "   ...Y EN RECONOCIMIENTO\n  A LOS SERVICIOS PRESTADOS\n A LOS ELECTORES DE\n    NOCTROPOLIS...", "      ...DESWEITEREN M\x99""CHTE\n  ICH, IN ANERKENNUNG DER DIENSTE,\nDIE ER F\x9a""R DIE REGISTRIERTEN W\x8e""HLER\n   VON NOCTROPOLIS GELEISTET HAT..." },
+	{ 2, 255, 225, 104, "      ...FURTHER MORE, IN\n  RECOGNITION OF CONSPICUOUS\nSERVICE TO THE REGISTERED VOTERS\n    OF NOCTROPOLIS CITY...", "     ... DE PLUS, EN\n  REMERCIEMENT DES SERVICES\n  DESINTERESSES RENDUS AUX\n  ELECTEURS DE NOCTROPOLIS...", "   ...Y EN RECONOCIMIENTO\n  A LOS SERVICIOS PRESTADOS\n A LOS ELECTORES DE\n    NOCTROPOLIS...", "      ...DESWEITEREN M\x99""CHTE\n  ICH, IN ANERKENNUNG DER DIENSTE,\nDIE ER F\x9a""R DIE REGISTRIERTEN W\x8e""HLER\n   VON NOCTROPOLIS GELEISTET HAT..." },
 };
 
 static const struct ComicBlock block_p14_2 = { &poly_p14_b2, -1, -1, block_p14_b2_boxes, 1 };
 
 static const struct Polygon poly_p14_b3 = { {
-    { 323, 90 },
-    { 451, 213 },
-    { 451, 300 },
-    { 323, 300 },
+	{ 323, 90 },
+	{ 451, 213 },
+	{ 451, 300 },
+	{ 323, 300 },
 } };
 
 static const struct ComicBox block_p14_b3_boxes[] = {
-    { 2, 255, 160, 227, "      ...IT IS MY HONOR AND\n  PRIVELEGE TO IMPART THE KEY\nTO NOCTROPOLIS CITY TO DARKSHEER,\n WHO LIKE YOUR MAYOR, \"GOT THE\n        JOB DONE IN '51!\"", "      ... J'AI L'HONNEUR ET\n  LE PRIVILEGE D'OFFRIR LA CLEF\nDE NOCTROPOLIS A DARKSHEER, QUI,\n  COMME VOTRE MAIRE, A \"FAIT SON\n          JOB EN '51!\"", "      ...TENGO EL HONOR Y\n EL PRIVILEGIO DE ENTREGAR LAS\n LLAVES DE NOCTROPOLIS A\n TENEBROSO, QUE, AL IGUAL QUE\n  YO, SABE HACER SU TRABAJO", "      ...DEN SCHL\x9a""SSEL ZUR\n  STADT NOCTROPOLIS AN DARKSHEER\n\x9a""BERREICHEN, DER - WIE AUCH ICH ALS\n    B\x9a""RGERMEISTER - STETS SEIN\n          BESTES GEGEBEN HAT." },
+	{ 2, 255, 160, 227, "      ...IT IS MY HONOR AND\n  PRIVELEGE TO IMPART THE KEY\nTO NOCTROPOLIS CITY TO DARKSHEER,\n WHO LIKE YOUR MAYOR, \"GOT THE\n        JOB DONE IN '51!\"", "      ... J'AI L'HONNEUR ET\n  LE PRIVILEGE D'OFFRIR LA CLEF\nDE NOCTROPOLIS A DARKSHEER, QUI,\n  COMME VOTRE MAIRE, A \"FAIT SON\n          JOB EN '51!\"", "      ...TENGO EL HONOR Y\n EL PRIVILEGIO DE ENTREGAR LAS\n LLAVES DE NOCTROPOLIS A\n TENEBROSO, QUE, AL IGUAL QUE\n  YO, SABE HACER SU TRABAJO", "      ...DEN SCHL\x9a""SSEL ZUR\n  STADT NOCTROPOLIS AN DARKSHEER\n\x9a""BERREICHEN, DER - WIE AUCH ICH ALS\n    B\x9a""RGERMEISTER - STETS SEIN\n          BESTES GEGEBEN HAT." },
 };
 
 static const struct ComicBlock block_p14_3 = { &poly_p14_b3, -1, -1, block_p14_b3_boxes, 1 };
 
 static const struct Polygon poly_p14_b4 = { {
-    { 451, 213 },
-    { 589, 83 },
-    { 589, 300 },
-    { 451, 300 },
+	{ 451, 213 },
+	{ 589, 83 },
+	{ 589, 300 },
+	{ 451, 300 },
 } };
 
 static const struct ComicBox block_p14_b4_boxes[] = {
-    { 2, 246, 313, 215, "     UH...THANK-YOU MR. MAYOR.\n     THANKS TO EVERYONE!", "     EUH... MERCI, MONSIEUR LE\n   MAIRE... MERCI TOUT LE MONDE!", "     EH... GRACIAS, ALCALDE.\n     GRACIAS A TODOS!", "     EHM... VIELEN DANK, HERR\n  B\x9a""RGERMEISTER. DANKE, IHNEN\n             ALLEN!" },
+	{ 2, 246, 313, 215, "     UH...THANK-YOU MR. MAYOR.\n     THANKS TO EVERYONE!", "     EUH... MERCI, MONSIEUR LE\n   MAIRE... MERCI TOUT LE MONDE!", "     EH... GRACIAS, ALCALDE.\n     GRACIAS A TODOS!", "     EHM... VIELEN DANK, HERR\n  B\x9a""RGERMEISTER. DANKE, IHNEN\n             ALLEN!" },
 };
 
 static const struct ComicBlock block_p14_4 = { &poly_p14_b4, -1, -1, block_p14_b4_boxes, 1 };
 
 static const struct ComicBlock page_14_blocks[] = {
-    block_p14_0,
-    block_p14_1,
-    block_p14_2,
-    block_p14_3,
-    block_p14_4,
+	block_p14_0,
+	block_p14_1,
+	block_p14_2,
+	block_p14_3,
+	block_p14_4,
 };
 
 static struct ComicPage page_14 = { "DARK/COMDATA/LEPG2526.SCN", 98, 53, 1, 0, page_14_blocks, 5 };
 
 static const struct Polygon poly_p15_b0 = { {
-    { 225, 22 },
-    { 293, 35 },
-    { 283, 103 },
-    { 213, 90 },
+	{ 225, 22 },
+	{ 293, 35 },
+	{ 283, 103 },
+	{ 213, 90 },
 } };
 
 static const struct ComicBox block_p15_b0_boxes[] = {
-    { 5, 246, 312, 85, "      THE MOMENT OF TRUTH...\nDIDN'T THINK IT WOULD BE SO HARD.", "      LE MOMENT DE VERITE...\n    JE NE PENSAIS PAS QUE CE\n         SERAIT SI DUR.", "  EL MOMENTO DE LA VERDAD...\n NUNCA PENSE QUE SERIA TAN DURO.", "     DER MOMENT DER WAHRHEIT...\n  H\x8e""TTE NIE GEDACHT, DA\xe1"" ES SO\n      SCHWER SEIN W\x9a""RDE." },
+	{ 5, 246, 312, 85, "      THE MOMENT OF TRUTH...\nDIDN'T THINK IT WOULD BE SO HARD.", "      LE MOMENT DE VERITE...\n    JE NE PENSAIS PAS QUE CE\n         SERAIT SI DUR.", "  EL MOMENTO DE LA VERDAD...\n NUNCA PENSE QUE SERIA TAN DURO.", "     DER MOMENT DER WAHRHEIT...\n  H\x8e""TTE NIE GEDACHT, DA\xe1"" ES SO\n      SCHWER SEIN W\x9a""RDE." },
 };
 
 static const struct ComicBlock block_p15_0 = { &poly_p15_b0, -1, -1, block_p15_b0_boxes, 1 };
 
 static const struct Polygon poly_p15_b1 = { {
-    { 213, 155 },
-    { 250, 118 },
-    { 289, 155 },
-    { 253, 193 },
+	{ 213, 155 },
+	{ 250, 118 },
+	{ 289, 155 },
+	{ 253, 193 },
 } };
 
 static const struct ComicBox block_p15_b1_boxes[] = {
-    { 5, 246, 309, 176, "      STILL, I KNOW IT'S THE\nRIGHT CHOICE... I'VE GOT A BRIGHTER\n       FUTURE OUT THERE...", "      POURTANT, JE SAIS QUE\nC'EST LE BON CHOIX... MON FUTUR\n  SERA PLUS BRILLANT AILLEURS...", "  PERO SE QUE HAGO LO\n CORRECTO... ME ESPERA UN\n   FUTURO BRILLANTE...", "      TROTZDEM, ICH WEI\xe1"", DA\xe1""\n   ES DIE RICHTIGE ENTSCHEIDUNG\n  WAR... MEINE ZUKUNFT STRAHLT NUN\n          VIEL HELLER..." },
+	{ 5, 246, 309, 176, "      STILL, I KNOW IT'S THE\nRIGHT CHOICE... I'VE GOT A BRIGHTER\n       FUTURE OUT THERE...", "      POURTANT, JE SAIS QUE\nC'EST LE BON CHOIX... MON FUTUR\n  SERA PLUS BRILLANT AILLEURS...", "  PERO SE QUE HAGO LO\n CORRECTO... ME ESPERA UN\n   FUTURO BRILLANTE...", "      TROTZDEM, ICH WEI\xe1"", DA\xe1""\n   ES DIE RICHTIGE ENTSCHEIDUNG\n  WAR... MEINE ZUKUNFT STRAHLT NUN\n          VIEL HELLER..." },
 };
 
 static const struct ComicBlock block_p15_1 = { &poly_p15_b1, -1, -1, block_p15_b1_boxes, 1 };
 
 static const struct Polygon poly_p15_b2 = { {
-    { 239, 209 },
-    { 304, 272 },
-    { 210, 292 },
+	{ 239, 209 },
+	{ 304, 272 },
+	{ 210, 292 },
 } };
 
 static const struct ComicBox block_p15_b2_boxes[] = {
-    { 6, 246, 22, 277, "     TIME TO GO... FAREWELL\nNOCTROPOLIS... YOU'LL ALWAYS BE\n            HOME.", "     IL EST TEMPS DE PARTIR...\nADIEU, NOCTROPOLIS... TU RESTERAS\n     TOUJOURS DANS MON COEUR.", "  ES HORA DE DECIR ADIOS,\nNOCTROPOLIS... SIEMPRE SERAS\n      MI HOGAR.", "      ZEIT ZUM GEHEN...AUF\n   WIEDERSEHEN, NOCTROPOLIS...\n       DU WIRST IMMER MEIN\n           ZUHAUSE SEIN." },
+	{ 6, 246, 22, 277, "     TIME TO GO... FAREWELL\nNOCTROPOLIS... YOU'LL ALWAYS BE\n            HOME.", "     IL EST TEMPS DE PARTIR...\nADIEU, NOCTROPOLIS... TU RESTERAS\n     TOUJOURS DANS MON COEUR.", "  ES HORA DE DECIR ADIOS,\nNOCTROPOLIS... SIEMPRE SERAS\n      MI HOGAR.", "      ZEIT ZUM GEHEN...AUF\n   WIEDERSEHEN, NOCTROPOLIS...\n       DU WIRST IMMER MEIN\n           ZUHAUSE SEIN." },
 };
 
 static const struct ComicBlock block_p15_2 = { &poly_p15_b2, -1, -1, block_p15_b2_boxes, 1 };
 
 static const struct Polygon poly_p15_b3 = { {
-    { 187, 0 },
-    { 452, 0 },
-    { 452, 399 },
-    { 187, 399 },
+	{ 187, 0 },
+	{ 452, 0 },
+	{ 452, 399 },
+	{ 187, 399 },
 } };
 
 static const struct ComicBox block_p15_b3_boxes[] = {
-    { 0, 246, 198, 39, "ASSUAGED BY THE KNOWLEDGE THAT DARKSHEER HAS CLEANSED\nAWAY ALL VESTIGE OF ARCHVILLAINY, THE CITY OF NIGHT\nRELAXES ITS GUARD AND SLEEPS... PERCHANCE TO DREAM...", "RASSUREE DE SAVOIR QUE DARKSHEER A ELIMINE TOUTE TRACE\nDES GRANDS CRIMINELS, LA CITE DE LA NUIT RELACHE SA\nGARDE ET S'ENDORT... ESPERANT UN REVE...", " TRANQUILA AL SABER QUE TENEBROSO LA HA LIBRADO DE\n SUS ENEMIGOS, LA CIUDAD DE LA NOCHE SE RELAJA Y SE\n DISPONE A DORMIR...", "BES\x8e""NFTIGT DURCH DAS WISSEN, DA\xe1"" DARKSHEER ALLE NESTER\nDES ERZSCHURKENTUMS AUSGER\x8e""UCHERT HAT, ENTSPANNT SICH\nDIE STADT DER NACHT UND SCHL\x8e""FT EIN...VIELLEICHT\nTR\x8e""UMT SIE AUCH..." },
+	{ 0, 246, 198, 39, "ASSUAGED BY THE KNOWLEDGE THAT DARKSHEER HAS CLEANSED\nAWAY ALL VESTIGE OF ARCHVILLAINY, THE CITY OF NIGHT\nRELAXES ITS GUARD AND SLEEPS... PERCHANCE TO DREAM...", "RASSUREE DE SAVOIR QUE DARKSHEER A ELIMINE TOUTE TRACE\nDES GRANDS CRIMINELS, LA CITE DE LA NUIT RELACHE SA\nGARDE ET S'ENDORT... ESPERANT UN REVE...", " TRANQUILA AL SABER QUE TENEBROSO LA HA LIBRADO DE\n SUS ENEMIGOS, LA CIUDAD DE LA NOCHE SE RELAJA Y SE\n DISPONE A DORMIR...", "BES\x8e""NFTIGT DURCH DAS WISSEN, DA\xe1"" DARKSHEER ALLE NESTER\nDES ERZSCHURKENTUMS AUSGER\x8e""UCHERT HAT, ENTSPANNT SICH\nDIE STADT DER NACHT UND SCHL\x8e""FT EIN...VIELLEICHT\nTR\x8e""UMT SIE AUCH..." },
 };
 
 static const struct ComicBlock block_p15_3 = { &poly_p15_b3, -1, -1, block_p15_b3_boxes, 1 };
 
 static const struct ComicBlock page_15_blocks[] = {
-    block_p15_0,
-    block_p15_1,
-    block_p15_2,
-    block_p15_3,
+	block_p15_0,
+	block_p15_1,
+	block_p15_2,
+	block_p15_3,
 };
 
 static struct ComicPage page_15 = { "DARK/COMDATA/LEPG27.SCN", 98, 54, 0, 0, page_15_blocks, 4 };
 
 const struct ComicPage *LastComicPages[] = {
-    &page_1,
-    &page_2,
-    &page_3,
-    &page_4,
-    &page_5,
-    &page_6,
-    &page_7,
-    &page_8,
-    &page_9,
-    &page_10,
-    &page_11,
-    &page_12,
-    &page_13,
-    &page_14,
-    &page_15,
-    NULL
+	&page_1,
+	&page_2,
+	&page_3,
+	&page_4,
+	&page_5,
+	&page_6,
+	&page_7,
+	&page_8,
+	&page_9,
+	&page_10,
+	&page_11,
+	&page_12,
+	&page_13,
+	&page_14,
+	&page_15,
+	NULL
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/noctropolis/noctropolis_map.cpp b/engines/access/noctropolis/noctropolis_map.cpp
deleted file mode 100644
index c015be9a2bb..00000000000
--- a/engines/access/noctropolis/noctropolis_map.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-#include "common/array.h"
-#include "common/endian.h"
-#include "common/file.h"
-#include "common/func.h"
-#include "common/util.h"
-
-#include "access/graphics.h"
-#include "access/script_noctropolis.h"
-#include "access/timer.h"
-
-namespace Access {
-
-void AccessEngine_Noctropolis::runMap() {
-
-	const int kMapLocationCount = 14;
-
-	static const struct { int x, y; } kPlayerMapEntryPositions[kMapLocationCount] = {
-		{280, 390},
-		{372, 338},
-		{414, 201},
-		{253, 387},
-		{72, 371},
-		{471, 340},
-		{70, 380},
-		{0, 0},
-		{85, 378},
-		{194, 347},
-		{73, 370},
-		{323, 386},
-		{43, 362},
-		{0, 0}
-	};
-
-	static const int kMapLocationRoomNumbers[kMapLocationCount] = {
-		12, 28, 11, 41, 17, 51, 43, 15, 27, 85, 32, 37, 26, 33
-	};
-
-	static const struct { int x, y, spriteIndex; } kDrawMapLocationsInfos[kMapLocationCount] = {
-		{259, 98, 0},
-		{487, 297, 1},
-		{272, 491, 2},
-		{323, 658, 3},
-		{466, 115, 4},
-		{333, 150, 5},
-		{42, 106, 6},
-		{28, 449, 7},
-		{49, 727, 8},
-		{390, 380, 9},
-		{152, 282, 10},
-		{179, 25, 11},
-		{114, 193, 12},
-		{201, 242, 13}
-	};
-
-	SpriteResource *locationIcons;
-	StringResource *locationNames;
-
-	int selectedLocationNum = -1, locationNum = -1;
-	bool needRedraw = true, needFadeIn = true;
-
-	setMouseCursor(0);
-	_player.disabled = true;
-	_stiletto.disabled = true;
-
-	_res->load(_scene, "map.ap", 0);
-	
-	_sceneCenterX = 0;
-	_sceneCenterY = 0;
-	// TODO: Restore current map position
-	_cameraX = 0;
-	_cameraY = 0;
-
-	locationIcons = new SpriteResource();
-	_res->load(locationIcons, "map.ap", 1);
-
-	locationNames = new StringResource();
-	_res->load(locationNames, GID_NOCTROPOLIS, kResStringTable, 2);
-
-	fadeToBlack();
-	clearVgaScreen();
-
-	startPaletteCycle(181, 190, 5, 6);
-
-	while (selectedLocationNum == -1) {
-	
-		if (needRedraw) {
-			copySceneBackgroundToWorkScreen();
-			for (int i = 0; i < kMapLocationCount; i++) {
-				_workScreen->drawSprite(locationIcons, kDrawMapLocationsInfos[i].spriteIndex,
-					kDrawMapLocationsInfos[i].x - _cameraX, kDrawMapLocationsInfos[i].y - _cameraY);
-			}
-			copyWorkScreenToVgaScreen();
-			if (needFadeIn) {
-				memcpy(_mainPalette, _scene->getPalette(), 768);
-				copySystemPalette();
-				fadeToPalette();
-				needFadeIn = false;
-			}
-		}
-
-		updatePaletteCycle();
-
-		int hoveredLocationNum = _scene->findHotspotAt(_cameraX + _mouseX, _cameraY + _mouseY);
-		//debug("hoveredLocationNum = %d", hoveredLocationNum);
-
-		// TODO: location available?
-		
-		if (locationNum != hoveredLocationNum) {
-			locationNum = hoveredLocationNum;
-			_vgaScreen->lock();
-			_vgaScreen->fillRect(220, 380, 220 + 300, 380 + 16, 246);
-			if (locationNum != -1)
-				_vgaScreen->drawText(_fonts[3], locationNames->getString(locationNum), 220, 380, 181, 0, kFontBackground);
-			_vgaScreen->unlock();
-		}
-
-		if (leftMouseButton() && locationNum != -1) {
-			selectedLocationNum = locationNum;
-		}
-		
-		if ((_mouseWheelDelta < 0 || _mouseY < 32) && _cameraY > 0) {
-			scrollCameraUp(8);
-			needRedraw = true;
-		} else if ((_mouseWheelDelta > 0 || _mouseY > 368) && _cameraY < _scene->getHeight() - _scene->getDisplayHeight()) {
-			scrollCameraDown(8);
-			needRedraw = true;
-		}
-
-		_timer->update();	
-		updateEvents();
-		updateScreen();
-
-		// TODO: Change to getMillis scrolling time delta
-		_system->delayMillis(50);
-
-	}
-
-	delete locationIcons;
-	delete locationNames;
-
-	if (selectedLocationNum >= 0) {
-		waitUntilLeftButtonIsReleased();
-		_currSceneNum = kMapLocationRoomNumbers[selectedLocationNum];
-		debug("_currSceneNum = %d", _currSceneNum);
-		// TODO: Save current map position
-		// TODO: Restore timer 18
-		_player.x1 = _player.x2 = kPlayerMapEntryPositions[selectedLocationNum].x;
-		_player.y1 = _player.y2 = kPlayerMapEntryPositions[selectedLocationNum].y;
-		// TODO: initStilettoPosition();
-		_gameState = AccessEngine_Noctropolis::GS_CHANGE_SCENE;
-	}
-
-}
-
-}
diff --git a/engines/access/noctropolis/noctropolis_special_comic.cpp b/engines/access/noctropolis/noctropolis_special_comic.cpp
index 7393c9a78c4..a1b352c57bf 100644
--- a/engines/access/noctropolis/noctropolis_special_comic.cpp
+++ b/engines/access/noctropolis/noctropolis_special_comic.cpp
@@ -1,3 +1,24 @@
+/* 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/>.
+ *
+ */
+
 /* Comic Data From Noctropolis Macos, offset 0x99960 */
 
 #include "noctropolis_comicviewer.h"
@@ -8,443 +29,443 @@ namespace Access {
 namespace Noctropolis {
 
 static const struct Polygon poly_p1_b0 = { {
-    { 376, 89 },
-    { 427, 104 },
-    { 450, 145 },
-    { 422, 191 },
-    { 377, 203 },
-    { 320, 182 },
-    { 305, 145 },
-    { 328, 104 },
+	{ 376, 89 },
+	{ 427, 104 },
+	{ 450, 145 },
+	{ 422, 191 },
+	{ 377, 203 },
+	{ 320, 182 },
+	{ 305, 145 },
+	{ 328, 104 },
 } };
 
 static const struct ComicBox block_p1_b0_boxes[] = {
-    { 3, 244, 453, 88, "     ...SLOW DISSECTION...\n  LIVING AUTOPSY! NO TOOLS...\nRIP HIS HEART FROM ITS PLACE! OH,\n THE PAIN... THE IMMACULATE PAIN!!", "     ...UNE LENTE DISSECTION...\n     UNE AUTOPSIE VIVANTE! PAS\nD'INSTRUMENTS... LUI ARRACHER LE\nCOEUR! OH, QUELLE DOULEUR... UNE\n        DOULEUR IMMACULEE!!", "     ...LO DISECARIA...\n LE HARIA LA AUTOPSIA VIVO...\n SIN INSTRUMENTOS. LE SACARIA\n EL CORAZON... LO HARIA GRITAR!!", "     ... LANGSAM ZERTEILEN...\n  VIVISEKTION. NICHT SCHNEIDEN...\n    REI\xe1""EN! OH, DER SCHMERZ..." },
+	{ 3, 244, 453, 88, "     ...SLOW DISSECTION...\n  LIVING AUTOPSY! NO TOOLS...\nRIP HIS HEART FROM ITS PLACE! OH,\n THE PAIN... THE IMMACULATE PAIN!!", "     ...UNE LENTE DISSECTION...\n     UNE AUTOPSIE VIVANTE! PAS\nD'INSTRUMENTS... LUI ARRACHER LE\nCOEUR! OH, QUELLE DOULEUR... UNE\n        DOULEUR IMMACULEE!!", "     ...LO DISECARIA...\n LE HARIA LA AUTOPSIA VIVO...\n SIN INSTRUMENTOS. LE SACARIA\n EL CORAZON... LO HARIA GRITAR!!", "     ... LANGSAM ZERTEILEN...\n  VIVISEKTION. NICHT SCHNEIDEN...\n    REI\xe1""EN! OH, DER SCHMERZ..." },
 };
 
 static const struct ComicBlock block_p1_0 = { &poly_p1_b0, -1, -1, block_p1_b0_boxes, 1 };
 
 static const struct Polygon poly_p1_b1 = { {
-    { 187, 0 },
-    { 451, 0 },
-    { 451, 95 },
-    { 187, 95 },
+	{ 187, 0 },
+	{ 451, 0 },
+	{ 451, 95 },
+	{ 187, 95 },
 } };
 
 static const struct ComicBox block_p1_b1_boxes[] = {
-    { 0, 246, 200, 73, "NOCTROPOLIS CITY PENITENTIARY.", "PENITENCIER MUNICIPAL DE NOCTROPOLIS", "PRISION DE NOCTROPOLIS.", "ST\x8e""DTISCHES GEF\x8e""NGNIS NOCTROPOLIS." },
+	{ 0, 246, 200, 73, "NOCTROPOLIS CITY PENITENTIARY.", "PENITENCIER MUNICIPAL DE NOCTROPOLIS", "PRISION DE NOCTROPOLIS.", "ST\x8e""DTISCHES GEF\x8e""NGNIS NOCTROPOLIS." },
 };
 
 static const struct ComicBlock block_p1_1 = { &poly_p1_b1, -1, -1, block_p1_b1_boxes, 1 };
 
 static const struct Polygon poly_p1_b2 = { {
-    { 187, 95 },
-    { 451, 95 },
-    { 451, 210 },
-    { 187, 210 },
+	{ 187, 95 },
+	{ 451, 95 },
+	{ 451, 210 },
+	{ 187, 210 },
 } };
 
 static const struct ComicBox block_p1_b2_boxes[] = {
-    { 0, 246, 207, 187, "CELL 427-JJ, MAXIMUM SECURITY WING. CURRENT\nINMATE: DR. WILLIAM BLISH, A.K.A. MASTER\nMACABRE (ARCH CRIMINAL)", "CELLULE 427-JJ, QUARTIER DE HAUTE SECURITE.\nDETENU ACTUEL: DR. WILLIAM BLISH, ALIAS\nMAITRE MACABRE (GRAND CRIMINEL)", "CELDA 427-JJ DE MAXIMA SEGURIDAD. OCUPANTE\nACTUAL: DR. WILLIAM BLISH, ALIAS MAESTRO\nMACABRO (ARCHICRIMINAL)", "ZELLE 427-JJ DES HOCHSICHERHEITSTRAKTES.\nDERZEITIGER INSASSE: DR. WILLIAM BLISH, ALIAS\nDOKTOR MAKABER (ERZSCHURKE)" },
-    { 3, 244, 334, 108, "    ...INTOLERABLE! MY TALENTS\n ARE WASTING BEHIND THESE BLOODY\nBARS. BLOOD! THAT'S THE ANSWER.\n   OH, TO HAVE DARKSHEER AT\n          MY MERCY...", "    ... C'EST INTOLERABLE! MES\n  TALENTS GACHES DERRIERE CES\n  BARREAUX! DU SANG! VOILA LA\n   REPONSE. OH... AVOIR DARKSHEER\n            A MA MERCI...", "    ...INTOLERABLE! MI TALENTO\n DESPERDICIADO TRAS ESTAS REJAS.\n SI PUDIERA PONER MIS MANOS\n    SOBRE TENEBROSO...", "      ... UNERTR\x8e""GLICH! MEINE\n     TALENTE VERGEUDET HINTER\n  GITTERN, WIE BEI EINEM BLUTIGEN\n ANF\x8e""NGER. BLUT! DAS IST DIE ANTWORT.\n   OH, WENN ICH DOCH NUR DARKSHEER\n      IN MEINER GEWALT H\x8e""TTE..." },
+	{ 0, 246, 207, 187, "CELL 427-JJ, MAXIMUM SECURITY WING. CURRENT\nINMATE: DR. WILLIAM BLISH, A.K.A. MASTER\nMACABRE (ARCH CRIMINAL)", "CELLULE 427-JJ, QUARTIER DE HAUTE SECURITE.\nDETENU ACTUEL: DR. WILLIAM BLISH, ALIAS\nMAITRE MACABRE (GRAND CRIMINEL)", "CELDA 427-JJ DE MAXIMA SEGURIDAD. OCUPANTE\nACTUAL: DR. WILLIAM BLISH, ALIAS MAESTRO\nMACABRO (ARCHICRIMINAL)", "ZELLE 427-JJ DES HOCHSICHERHEITSTRAKTES.\nDERZEITIGER INSASSE: DR. WILLIAM BLISH, ALIAS\nDOKTOR MAKABER (ERZSCHURKE)" },
+	{ 3, 244, 334, 108, "    ...INTOLERABLE! MY TALENTS\n ARE WASTING BEHIND THESE BLOODY\nBARS. BLOOD! THAT'S THE ANSWER.\n   OH, TO HAVE DARKSHEER AT\n          MY MERCY...", "    ... C'EST INTOLERABLE! MES\n  TALENTS GACHES DERRIERE CES\n  BARREAUX! DU SANG! VOILA LA\n   REPONSE. OH... AVOIR DARKSHEER\n            A MA MERCI...", "    ...INTOLERABLE! MI TALENTO\n DESPERDICIADO TRAS ESTAS REJAS.\n SI PUDIERA PONER MIS MANOS\n    SOBRE TENEBROSO...", "      ... UNERTR\x8e""GLICH! MEINE\n     TALENTE VERGEUDET HINTER\n  GITTERN, WIE BEI EINEM BLUTIGEN\n ANF\x8e""NGER. BLUT! DAS IST DIE ANTWORT.\n   OH, WENN ICH DOCH NUR DARKSHEER\n      IN MEINER GEWALT H\x8e""TTE..." },
 };
 
 static const struct ComicBlock block_p1_2 = { &poly_p1_b2, -1, -1, block_p1_b2_boxes, 2 };
 
 static const struct Polygon poly_p1_b3 = { {
-    { 187, 210 },
-    { 283, 210 },
-    { 283, 312 },
-    { 233, 337 },
-    { 187, 314 },
+	{ 187, 210 },
+	{ 283, 210 },
+	{ 283, 312 },
+	{ 233, 337 },
+	{ 187, 314 },
 } };
 
 static const struct ComicBox block_p1_b3_boxes[] = {
-    { 3, 246, 308, 181, "      IT IS ALWAYS REFRESHING\n   TO ENCOUNTER THOSE WHO\nAPPRECIATE THE AESTHETICS OF\n  PROPER PAIN DISPENSATION.", "        C'EST TOUJOURS\n  RAFRAICHISSANT DE RENCONTRER\n   CEUX QUI SAVENT APPRECIER\n      L'ESTHETIQUE DE LA DOULEUR\n             BIEN INFLIGEE.", "  SIEMPRE ES AGRADABLE\n  ESCUCHAR A UN\n  PROFESIONAL DEL DOLOR.", "            ES IST IMMER\n      ERFRISCHEND, JEMANDEN\n    KENNENZULERNEN, DER DIE\n  \x8e""STHETIK DER SCHMERZVERTEILUNG\n         ZU W\x9a""RDIGEN WEI\xe1""." },
-    { 4, 244, 5, 173, "            WHO...?", "\n          QUI...?", "     QUIEN ERES?", "\n               WER...?" },
+	{ 3, 246, 308, 181, "      IT IS ALWAYS REFRESHING\n   TO ENCOUNTER THOSE WHO\nAPPRECIATE THE AESTHETICS OF\n  PROPER PAIN DISPENSATION.", "        C'EST TOUJOURS\n  RAFRAICHISSANT DE RENCONTRER\n   CEUX QUI SAVENT APPRECIER\n      L'ESTHETIQUE DE LA DOULEUR\n             BIEN INFLIGEE.", "  SIEMPRE ES AGRADABLE\n  ESCUCHAR A UN\n  PROFESIONAL DEL DOLOR.", "            ES IST IMMER\n      ERFRISCHEND, JEMANDEN\n    KENNENZULERNEN, DER DIE\n  \x8e""STHETIK DER SCHMERZVERTEILUNG\n         ZU W\x9a""RDIGEN WEI\xe1""." },
+	{ 4, 244, 5, 173, "            WHO...?", "\n          QUI...?", "     QUIEN ERES?", "\n               WER...?" },
 };
 
 static const struct ComicBlock block_p1_3 = { &poly_p1_b3, -1, -1, block_p1_b3_boxes, 2 };
 
 static const struct Polygon poly_p1_b4 = { {
-    { 187, 314 },
-    { 233, 337 },
-    { 283, 312 },
-    { 283, 399 },
-    { 187, 399 },
+	{ 187, 314 },
+	{ 233, 337 },
+	{ 283, 312 },
+	{ 283, 399 },
+	{ 187, 399 },
 } };
 
 static const struct ComicBox block_p1_b4_boxes[] = {
-    { 3, 246, 297, 300, "      I AM FLUX. I HAVE COME\n  TO OFFER YOU A PROPOSITION.\n   BUT I FIND THIS BARRIER\n  BOTHERSOME. COME, JOIN ME\n        IN THE CORRIDOR.", "\n      JE M'APPELLE FLUX. JE\n    SUIS VENU VOUS FAIRE UNE\nPROPOSITION. MAIS JE TROUVE\n CETTE BARRIERE GENANTE. VENEZ,\n     REJOIGNEZ-MOI DANS\n         LE COULOIR.", "    SOY FLUX Y VENGO A\n  HACERTE UNA PROPOSICION.\n  PERO ESTOS BARROTES SON\n  MOLESTOS. POR QUE NO SALES\n    AL CORREDOR?", "          NENNEN SIE MICH\n    EINFACH FLUX. ICH BIN GEKOMMEN,\n     UM IHNEN EINEN VORSCHLAG ZU\n  UNTERBREITEN. ABER ICH FINDE DIESE\n   BARRIERE SEHR ST\x99""REND. KOMMEN\n     SIE DOCH ZU MIR HERAUS\n           AUF DEN FLUR." },
+	{ 3, 246, 297, 300, "      I AM FLUX. I HAVE COME\n  TO OFFER YOU A PROPOSITION.\n   BUT I FIND THIS BARRIER\n  BOTHERSOME. COME, JOIN ME\n        IN THE CORRIDOR.", "\n      JE M'APPELLE FLUX. JE\n    SUIS VENU VOUS FAIRE UNE\nPROPOSITION. MAIS JE TROUVE\n CETTE BARRIERE GENANTE. VENEZ,\n     REJOIGNEZ-MOI DANS\n         LE COULOIR.", "    SOY FLUX Y VENGO A\n  HACERTE UNA PROPOSICION.\n  PERO ESTOS BARROTES SON\n  MOLESTOS. POR QUE NO SALES\n    AL CORREDOR?", "          NENNEN SIE MICH\n    EINFACH FLUX. ICH BIN GEKOMMEN,\n     UM IHNEN EINEN VORSCHLAG ZU\n  UNTERBREITEN. ABER ICH FINDE DIESE\n   BARRIERE SEHR ST\x99""REND. KOMMEN\n     SIE DOCH ZU MIR HERAUS\n           AUF DEN FLUR." },
 };
 
 static const struct ComicBlock block_p1_4 = { &poly_p1_b4, -1, -1, block_p1_b4_boxes, 1 };
 
 static const struct Polygon poly_p1_b5 = { {
-    { 283, 210 },
-    { 451, 210 },
-    { 451, 399 },
-    { 283, 399 },
+	{ 283, 210 },
+	{ 451, 210 },
+	{ 451, 399 },
+	{ 283, 399 },
 } };
 
 static const struct ComicBox block_p1_b5_boxes[] = {
-    { 3, 244, 392, 184, "        THE GUARDS...", "\n        LES GARDES...", "        LOS GUARDIAS...", "        ABER DIE WACHEN..." },
-    { 4, 246, 144, 248, "     HAVE BEEN... RELIEVED. I\n SHARE YOUR VIEWPOINT, MACABRE,\n  YOUR GIFTS ARE BEING WASTED\n           HERE...", "      ONT ETE... RELEVES. JE\n  PARTAGE VOTRE POINT DE VUE,\n  MACABRE, VOTRE TALENT N'EST\n        PAS EXPLOITE ICI...", "   HAN IDO A... DESCANSAR.\n ESTOY DE ACUERDO, MACABRO.\n TU TALENTO SE DESPERDICIA\n           AQUI...", "      WURDEN...ABGEL\x99""ST. ICH\n   TEILE IHRE ANSICHT, MAKABER,\n   DA\xe1"" IHRE TALENTE HIER NUR\n        VERGEUDET WERDEN." },
+	{ 3, 244, 392, 184, "        THE GUARDS...", "\n        LES GARDES...", "        LOS GUARDIAS...", "        ABER DIE WACHEN..." },
+	{ 4, 246, 144, 248, "     HAVE BEEN... RELIEVED. I\n SHARE YOUR VIEWPOINT, MACABRE,\n  YOUR GIFTS ARE BEING WASTED\n           HERE...", "      ONT ETE... RELEVES. JE\n  PARTAGE VOTRE POINT DE VUE,\n  MACABRE, VOTRE TALENT N'EST\n        PAS EXPLOITE ICI...", "   HAN IDO A... DESCANSAR.\n ESTOY DE ACUERDO, MACABRO.\n TU TALENTO SE DESPERDICIA\n           AQUI...", "      WURDEN...ABGEL\x99""ST. ICH\n   TEILE IHRE ANSICHT, MAKABER,\n   DA\xe1"" IHRE TALENTE HIER NUR\n        VERGEUDET WERDEN." },
 };
 
 static const struct ComicBlock block_p1_5 = { &poly_p1_b5, -1, -1, block_p1_b5_boxes, 2 };
 
 static const struct ComicBlock page_1_blocks[] = {
-    block_p1_0,
-    block_p1_1,
-    block_p1_2,
-    block_p1_3,
-    block_p1_4,
-    block_p1_5,
+	block_p1_0,
+	block_p1_1,
+	block_p1_2,
+	block_p1_3,
+	block_p1_4,
+	block_p1_5,
 };
 
 static struct ComicPage page_1 = { "DARK/COMDATA/SEPG01.SCN", 98, 55, 1, 0, page_1_blocks, 6 };
 
 static const struct Polygon poly_p2_b0 = { {
-    { 369, 36 },
-    { 450, 36 },
-    { 450, 150 },
-    { 369, 150 },
+	{ 369, 36 },
+	{ 450, 36 },
+	{ 450, 150 },
+	{ 369, 150 },
 } };
 
 static const struct ComicBox block_p2_b0_boxes[] = {
-    { 2, 244, 158, 132, "     OF COURSE, FLUX, YOU'RE\nTHE BOSS... NOW TELL ME MORE\n      ABOUT DARKSHEER!", "     BIEN SUR, FLUX... C'EST\nVOUS LE BOSS... MAIS DITES M'EN\n UN PEU PLUS SUR CE DARKSHEER!", "  POR SUPUESTO, FLUX. ERES\nEL JEFE... AHORA HABLAME\n      DE TENEBROSO!", "     SELBSTVERST\x8e""NDLICH, FLUX,\nSIE SIND DER BOSS...ERZ\x8e""HLEN\n   SIE MIR MEHR \x9a""BER DARKSHEER!" },
+	{ 2, 244, 158, 132, "     OF COURSE, FLUX, YOU'RE\nTHE BOSS... NOW TELL ME MORE\n      ABOUT DARKSHEER!", "     BIEN SUR, FLUX... C'EST\nVOUS LE BOSS... MAIS DITES M'EN\n UN PEU PLUS SUR CE DARKSHEER!", "  POR SUPUESTO, FLUX. ERES\nEL JEFE... AHORA HABLAME\n      DE TENEBROSO!", "     SELBSTVERST\x8e""NDLICH, FLUX,\nSIE SIND DER BOSS...ERZ\x8e""HLEN\n   SIE MIR MEHR \x9a""BER DARKSHEER!" },
 };
 
 static const struct ComicBlock block_p2_0 = { &poly_p2_b0, -1, -1, block_p2_b0_boxes, 1 };
 
 static const struct Polygon poly_p2_b1 = { {
-    { 187, 0 },
-    { 450, 0 },
-    { 450, 217 },
-    { 187, 217 },
+	{ 187, 0 },
+	{ 450, 0 },
+	{ 450, 217 },
+	{ 187, 217 },
 } };
 
 static const struct ComicBox block_p2_b1_boxes[] = {
-    { 2, 246, 68, 68, "    ...I OFFER YOU FREEDOM. A\n  CHANCE TO REALIZE YOUR DREAM\nOF RIPPING DARKSHEER'S HEART TO\n BLOODY SHREDS! IN EXCHANGE, I\n    DEMAND YOUR ALLEGIANCE.", "\n    ...JE VOUS OFFRE LA LIBERTE.\n   UNE CHANCE DE REALISER VOTRE\nREVE EN ARRACHANT LE COEUR DE\n  DARKSHEER POUR LE REDUIRE EN\n   LAMBEAUX SANGLANTS! EN ECHANGE,\n       JE VOUS DEMANDE VOTRE\n             FIDELITE", "    ...TE OFREZCO LA LIBERTAD\n Y UNA OPORTUNIDAD DE REALIZAR\n TUS DESEOS DE DESTROZAR A\n TENEBROSO. A CAMBIO, SOLO PIDO\n QUE TE SUBORDINES A MI.", "      ...ICH BIETE IHNEN DIE\n    FREIHEIT, DAZU EINE CHANCE,\n IHREN TRAUM ZU VERWIRKLICHEN UND\n       DARKSHEER DAS HERZ\n   RAUSZUREI\xe1""EN. DAF\x9a""R\n     VERLANGE ICH GEHORSAM." },
+	{ 2, 246, 68, 68, "    ...I OFFER YOU FREEDOM. A\n  CHANCE TO REALIZE YOUR DREAM\nOF RIPPING DARKSHEER'S HEART TO\n BLOODY SHREDS! IN EXCHANGE, I\n    DEMAND YOUR ALLEGIANCE.", "\n    ...JE VOUS OFFRE LA LIBERTE.\n   UNE CHANCE DE REALISER VOTRE\nREVE EN ARRACHANT LE COEUR DE\n  DARKSHEER POUR LE REDUIRE EN\n   LAMBEAUX SANGLANTS! EN ECHANGE,\n       JE VOUS DEMANDE VOTRE\n             FIDELITE", "    ...TE OFREZCO LA LIBERTAD\n Y UNA OPORTUNIDAD DE REALIZAR\n TUS DESEOS DE DESTROZAR A\n TENEBROSO. A CAMBIO, SOLO PIDO\n QUE TE SUBORDINES A MI.", "      ...ICH BIETE IHNEN DIE\n    FREIHEIT, DAZU EINE CHANCE,\n IHREN TRAUM ZU VERWIRKLICHEN UND\n       DARKSHEER DAS HERZ\n   RAUSZUREI\xe1""EN. DAF\x9a""R\n     VERLANGE ICH GEHORSAM." },
 };
 
 static const struct ComicBlock block_p2_1 = { &poly_p2_b1, -1, -1, block_p2_b1_boxes, 1 };
 
 static const struct Polygon poly_p2_b2 = { {
-    { 187, 150 },
-    { 285, 217 },
-    { 322, 399 },
-    { 187, 399 },
+	{ 187, 150 },
+	{ 285, 217 },
+	{ 322, 399 },
+	{ 187, 399 },
 } };
 
 static const struct ComicBox block_p2_b2_boxes[] = {
-    { 3, 246, 296, 212, "     LATER. THE OTHERS AWAIT\n        OUR ARRIVAL.", "     PLUS TARD. LES AUTRES\n        NOUS ATTENDENT.", "  MAS TARDE. LOS DEMAS\n        NOS ESPERAN.", "       SP\x8e""TER. DIE ANDEREN\n         WARTEN AUF UNS." },
-    { 3, 244, 346, 258, "     OTHERS?", "\n        LES AUTRES?", "   LOS DEMAS?", "\n           ANDEREN?" },
-    { 3, 246, 296, 212, "       TOPHAT, DREALMER,\n  GREENTHUMB AND THE SUCCUBUS\nHAVE ALSO ACCEPTED ME AS THEIR\n LEADER. TOGETHER, WE WILL BRING\n   NOCTROPOLIS TO ITS KNEES!", "       TOPHAT, DREALMER,\n  MAINVERTE ET LA SUCCUBE ONT\n EGALEMENT ACCEPTE DE M'OBEIR.\n  ENSEMBLE, NOUS ALLONS METTRE\n     NOCTROPOLIS A GENOUX!", "   LA DIVA, MORFEICO,\n  DEDOVERDE Y LA SUCCUBUS\n TAMBIEN ME HAN ACEPTADO COMO\n LIDER. JUNTOS, PONDREMOS A\n   NOCTROPOLIS DE RODILLAS!", "         MISS ZYLINDERCHEN,\n    TR\x8e""UMLER, GR\x9a""ND\x8e""UMLING UND\n  SUCCUBUS HABEN MICH EBENFALLS\n    ALS ANF\x9a""HRER AKZEPTIERT.\n     GEMEINSAM WERDEN WIR\n       NOCTROPOLIS IN DIE\n          KNIE ZWINGEN!" },
+	{ 3, 246, 296, 212, "     LATER. THE OTHERS AWAIT\n        OUR ARRIVAL.", "     PLUS TARD. LES AUTRES\n        NOUS ATTENDENT.", "  MAS TARDE. LOS DEMAS\n        NOS ESPERAN.", "       SP\x8e""TER. DIE ANDEREN\n         WARTEN AUF UNS." },
+	{ 3, 244, 346, 258, "     OTHERS?", "\n        LES AUTRES?", "   LOS DEMAS?", "\n           ANDEREN?" },
+	{ 3, 246, 296, 212, "       TOPHAT, DREALMER,\n  GREENTHUMB AND THE SUCCUBUS\nHAVE ALSO ACCEPTED ME AS THEIR\n LEADER. TOGETHER, WE WILL BRING\n   NOCTROPOLIS TO ITS KNEES!", "       TOPHAT, DREALMER,\n  MAINVERTE ET LA SUCCUBE ONT\n EGALEMENT ACCEPTE DE M'OBEIR.\n  ENSEMBLE, NOUS ALLONS METTRE\n     NOCTROPOLIS A GENOUX!", "   LA DIVA, MORFEICO,\n  DEDOVERDE Y LA SUCCUBUS\n TAMBIEN ME HAN ACEPTADO COMO\n LIDER. JUNTOS, PONDREMOS A\n   NOCTROPOLIS DE RODILLAS!", "         MISS ZYLINDERCHEN,\n    TR\x8e""UMLER, GR\x9a""ND\x8e""UMLING UND\n  SUCCUBUS HABEN MICH EBENFALLS\n    ALS ANF\x9a""HRER AKZEPTIERT.\n     GEMEINSAM WERDEN WIR\n       NOCTROPOLIS IN DIE\n          KNIE ZWINGEN!" },
 };
 
 static const struct ComicBlock block_p2_2 = { &poly_p2_b2, -1, -1, block_p2_b2_boxes, 3 };
 
 static const struct Polygon poly_p2_b3 = { {
-    { 285, 217 },
-    { 450, 217 },
-    { 450, 296 },
-    { 302, 296 },
+	{ 285, 217 },
+	{ 450, 217 },
+	{ 450, 296 },
+	{ 302, 296 },
 } };
 
 static const struct ComicBox block_p2_b3_boxes[] = {
-    { 4, 244, 115, 196, "     AH, FLUX, I LIKE YOUR\n             STYLE!", "     AH, FLUX, J'AIME BIEN\n         VOTRE STYLE!", "     ME GUSTA TU\n       ESTILO, FLUX!", "         HMM, FLUX, IHR STIL\n            GEF\x8e""LLT MIR." },
+	{ 4, 244, 115, 196, "     AH, FLUX, I LIKE YOUR\n             STYLE!", "     AH, FLUX, J'AIME BIEN\n         VOTRE STYLE!", "     ME GUSTA TU\n       ESTILO, FLUX!", "         HMM, FLUX, IHR STIL\n            GEF\x8e""LLT MIR." },
 };
 
 static const struct ComicBlock block_p2_3 = { &poly_p2_b3, -1, -1, block_p2_b3_boxes, 1 };
 
 static const struct Polygon poly_p2_b4 = { {
-    { 302, 296 },
-    { 450, 296 },
-    { 450, 399 },
-    { 322, 399 },
+	{ 302, 296 },
+	{ 450, 296 },
+	{ 450, 399 },
+	{ 322, 399 },
 } };
 
 static const struct ComicBox block_p2_b4_boxes[] = {
-    { 4, 246, 145, 263, "     YES... I BELIEVE YOU'LL\nFIND THAT WE HAVE MUCH IN COMMON.", "\n     OUI... JE CROIS QUE VOUS\n VERREZ BIENTOT QUE NOUS AVONS\n       BEAUCOUP DE CHOSES\n           EN COMMUN...", "  SI... VERAS QUE TENEMOS\n MUCHO EN COMUN.", "       JA, ICH GLAUBE, SIE\nWERDEN FESTSTELLEN, DA\xe1"" WIR EINE\n      MENGE GEMEINSAM HABEN." },
+	{ 4, 246, 145, 263, "     YES... I BELIEVE YOU'LL\nFIND THAT WE HAVE MUCH IN COMMON.", "\n     OUI... JE CROIS QUE VOUS\n VERREZ BIENTOT QUE NOUS AVONS\n       BEAUCOUP DE CHOSES\n           EN COMMUN...", "  SI... VERAS QUE TENEMOS\n MUCHO EN COMUN.", "       JA, ICH GLAUBE, SIE\nWERDEN FESTSTELLEN, DA\xe1"" WIR EINE\n      MENGE GEMEINSAM HABEN." },
 };
 
 static const struct ComicBlock block_p2_4 = { &poly_p2_b4, -1, -1, block_p2_b4_boxes, 1 };
 
 static const struct ComicBlock page_2_blocks[] = {
-    block_p2_0,
-    block_p2_1,
-    block_p2_2,
-    block_p2_3,
-    block_p2_4,
+	block_p2_0,
+	block_p2_1,
+	block_p2_2,
+	block_p2_3,
+	block_p2_4,
 };
 
 static struct ComicPage page_2 = { "DARK/COMDATA/SEPG02.SCN", 98, 55, 1, 0, page_2_blocks, 5 };
 
 static const struct Polygon poly_p3_b0 = { {
-    { 187, 0 },
-    { 451, 0 },
-    { 451, 186 },
-    { 187, 186 },
+	{ 187, 0 },
+	{ 451, 0 },
+	{ 451, 186 },
+	{ 187, 186 },
 } };
 
 static const struct ComicBox block_p3_b0_boxes[] = {
-    { 2, 246, 98, 99, "       COLLECTIVELY, YOU ARE\n   ARMAGEDDON: A NIGHTMARE FOR\nTHE CITY OF NIGHT! GO NOW, EXPLORE\n EVERY PERVERSION. LET TERROR REIGN\n  IN THE STREETS AND CHAOS CONSUME\n           THE WHOLE!", "        ENSEMBLE, VOUS ETES\n    L'APOCALYPSE, UN CAUCHEMAR\n  POUR LA CITE DE LA NUIT! ALLEZ,\n   MAINTENANT. EXPLOREZ CHAQUE\n   PERVERSION. LAISSEZ LA TERREUR\n    REGNER DANS LES RUES, ET LE\n       CHAOS CONSUMERA TOUT!", "    JUNTOS SEREMOS EL\n   ARMAGEDON, UNA PESADILLA PARA\n LA CIUDAD DE LA NOCHE. DEDICAOS A\n CUANTA PERVERSION SE OS OCURRA.\n  SEMBRAD EL TERROR EN LAS CALLES!", "       GEMEINSAM SEID IHR DAS\n    ARMAGEDDON, DER ALPTRAUM F\x9a""R\n  DIE STADT DER NACHT! GEHT JETZT\n  UND LEBT EURE PERVERSIONEN AUS!\n   LA\xe1""T DEN TERROR IN DEN STRA\xe1""EN\n      REGIEREN UND DAS CHAOS\n        ALLES VERSCHLINGEN!" },
+	{ 2, 246, 98, 99, "       COLLECTIVELY, YOU ARE\n   ARMAGEDDON: A NIGHTMARE FOR\nTHE CITY OF NIGHT! GO NOW, EXPLORE\n EVERY PERVERSION. LET TERROR REIGN\n  IN THE STREETS AND CHAOS CONSUME\n           THE WHOLE!", "        ENSEMBLE, VOUS ETES\n    L'APOCALYPSE, UN CAUCHEMAR\n  POUR LA CITE DE LA NUIT! ALLEZ,\n   MAINTENANT. EXPLOREZ CHAQUE\n   PERVERSION. LAISSEZ LA TERREUR\n    REGNER DANS LES RUES, ET LE\n       CHAOS CONSUMERA TOUT!", "    JUNTOS SEREMOS EL\n   ARMAGEDON, UNA PESADILLA PARA\n LA CIUDAD DE LA NOCHE. DEDICAOS A\n CUANTA PERVERSION SE OS OCURRA.\n  SEMBRAD EL TERROR EN LAS CALLES!", "       GEMEINSAM SEID IHR DAS\n    ARMAGEDDON, DER ALPTRAUM F\x9a""R\n  DIE STADT DER NACHT! GEHT JETZT\n  UND LEBT EURE PERVERSIONEN AUS!\n   LA\xe1""T DEN TERROR IN DEN STRA\xe1""EN\n      REGIEREN UND DAS CHAOS\n        ALLES VERSCHLINGEN!" },
 };
 
 static const struct ComicBlock block_p3_0 = { &poly_p3_b0, -1, -1, block_p3_b0_boxes, 1 };
 
 static const struct Polygon poly_p3_b1 = { {
-    { 187, 186 },
-    { 451, 186 },
-    { 451, 399 },
-    { 187, 399 },
+	{ 187, 186 },
+	{ 451, 186 },
+	{ 451, 399 },
+	{ 187, 399 },
 } };
 
 static const struct ComicBox block_p3_b1_boxes[] = {
-    { 0, 246, 221, 318, "THE DREALMER.", "DREALMER.", "MORFEICO.", "TR\x8e""UMLER." },
-    { 0, 246, 270, 267, "TOPHAT.", "TOPHAT.", "LA DIVA.", "MISS ZYLINDERCHEN." },
-    { 0, 246, 327, 289, "MASTER MACABRE.", "MAITRE MACABRE.", "MACABRO.", "DOKTOR MAKABER." },
-    { 0, 246, 362, 251, "GREENTHUMB.", "MAINVERTE.", "DEDOVERDE.", "GR\x9a""ND\x8e""UMLING." },
-    { 0, 246, 419, 278, "THE SUCCUBUS.", "LA SUCCUBE.", "LA SUCCUBUS.", "SUCCUBUS." },
+	{ 0, 246, 221, 318, "THE DREALMER.", "DREALMER.", "MORFEICO.", "TR\x8e""UMLER." },
+	{ 0, 246, 270, 267, "TOPHAT.", "TOPHAT.", "LA DIVA.", "MISS ZYLINDERCHEN." },
+	{ 0, 246, 327, 289, "MASTER MACABRE.", "MAITRE MACABRE.", "MACABRO.", "DOKTOR MAKABER." },
+	{ 0, 246, 362, 251, "GREENTHUMB.", "MAINVERTE.", "DEDOVERDE.", "GR\x9a""ND\x8e""UMLING." },
+	{ 0, 246, 419, 278, "THE SUCCUBUS.", "LA SUCCUBE.", "LA SUCCUBUS.", "SUCCUBUS." },
 };
 
 static const struct ComicBlock block_p3_1 = { &poly_p3_b1, -1, -1, block_p3_b1_boxes, 5 };
 
 static const struct ComicBlock page_3_blocks[] = {
-    block_p3_0,
-    block_p3_1,
+	block_p3_0,
+	block_p3_1,
 };
 
 static struct ComicPage page_3 = { "DARK/COMDATA/SEPG03.SCN", 98, 56, 0, 0, page_3_blocks, 2 };
 
 static const struct Polygon poly_p4_b0 = { {
-    { 187, 0 },
-    { 451, 0 },
-    { 451, 399 },
-    { 187, 399 },
+	{ 187, 0 },
+	{ 451, 0 },
+	{ 451, 399 },
+	{ 187, 399 },
 } };
 
 static const struct ComicBox block_p4_b0_boxes[] = {
-    { 0, 246, 216, 189, "NOCTROPOLIS CITY STAGGERS UNDER THE VILLAINS'\nRUTHLESS ONSLAUGHT. WORKING IN CONCERT UNDER THE\nDIRECTION OF THE ENIGMATIC MASTERMIND, FLUX, THE\nINSIDIOUS QUINTET RELENTLESSLY DEVOUR THE CITY OF\nNIGHT A BITE AT A TIME....", "NOCTROPOLIS VACILLE SOUS LES ASSAUTS FAROUCHES\nDES MALEFIQUES. TRAVAILLANT DE CONCERT SOUS LA\nDIRECTION DE FLUX, LE MYSTERIEUX CERVEAU, LES\nCINQ EVADES DEVORENT SANS RELACHE LA CITE DE LA\nNUIT... BOUCHEE APRES BOUCHEE...", " NOCTROPOLIS SE ESTREMECE BAJO EL ASALTO DE\n LOS CRIMINALES. TRABAJANDO BAJO LA\n DIRECCION DEL MISTERIOSO FLUX, EL\n QUINTETO HACE CUNDIR EL PANICO EN LAS\n CALLES...", "NOCTROPOLIS ERBEBT UNTER DEM GNADENLOSEN ANSTURM\nDES B\x99""SEN. DANK DER KOORDINATION DES GEHEIMNISVOLLEN\nDRAHTZIEHERS FLUX VERSCHLINGT DAS QUINTETT DIE STADT\nDER NACHT BISSEN F\x9a""R BISSEN..." },
+	{ 0, 246, 216, 189, "NOCTROPOLIS CITY STAGGERS UNDER THE VILLAINS'\nRUTHLESS ONSLAUGHT. WORKING IN CONCERT UNDER THE\nDIRECTION OF THE ENIGMATIC MASTERMIND, FLUX, THE\nINSIDIOUS QUINTET RELENTLESSLY DEVOUR THE CITY OF\nNIGHT A BITE AT A TIME....", "NOCTROPOLIS VACILLE SOUS LES ASSAUTS FAROUCHES\nDES MALEFIQUES. TRAVAILLANT DE CONCERT SOUS LA\nDIRECTION DE FLUX, LE MYSTERIEUX CERVEAU, LES\nCINQ EVADES DEVORENT SANS RELACHE LA CITE DE LA\nNUIT... BOUCHEE APRES BOUCHEE...", " NOCTROPOLIS SE ESTREMECE BAJO EL ASALTO DE\n LOS CRIMINALES. TRABAJANDO BAJO LA\n DIRECCION DEL MISTERIOSO FLUX, EL\n QUINTETO HACE CUNDIR EL PANICO EN LAS\n CALLES...", "NOCTROPOLIS ERBEBT UNTER DEM GNADENLOSEN ANSTURM\nDES B\x99""SEN. DANK DER KOORDINATION DES GEHEIMNISVOLLEN\nDRAHTZIEHERS FLUX VERSCHLINGT DAS QUINTETT DIE STADT\nDER NACHT BISSEN F\x9a""R BISSEN..." },
 };
 
 static const struct ComicBlock block_p4_0 = { &poly_p4_b0, -1, -1, block_p4_b0_boxes, 1 };
 
 static const struct ComicBlock page_4_blocks[] = {
-    block_p4_0,
+	block_p4_0,
 };
 
 static struct ComicPage page_4 = { "DARK/COMDATA/SEPG04.SCN", 98, 57, 1, 0, page_4_blocks, 1 };
 
 static const struct Polygon poly_p5_b0 = { {
-    { 187, 0 },
-    { 451, 0 },
-    { 451, 78 },
-    { 187, 78 },
+	{ 187, 0 },
+	{ 451, 0 },
+	{ 451, 78 },
+	{ 187, 78 },
 } };
 
 static const struct ComicBox block_p5_b0_boxes[] = {
-    { 0, 246, 216, 43, "NOCTROPOLIS CITY CATHEDRAL.", "CATHEDRALE DE NOCTROPOLIS.", "CATEDRAL DE NOCTROPOLIS.", "DOM VON NOCTROPOLIS." },
+	{ 0, 246, 216, 43, "NOCTROPOLIS CITY CATHEDRAL.", "CATHEDRALE DE NOCTROPOLIS.", "CATEDRAL DE NOCTROPOLIS.", "DOM VON NOCTROPOLIS." },
 };
 
 static const struct ComicBlock block_p5_0 = { &poly_p5_b0, -1, -1, block_p5_b0_boxes, 1 };
 
 static const struct Polygon poly_p5_b1 = { {
-    { 187, 78 },
-    { 343, 78 },
-    { 343, 185 },
-    { 187, 185 },
+	{ 187, 78 },
+	{ 343, 78 },
+	{ 343, 185 },
+	{ 187, 185 },
 } };
 
 static const struct ComicBox block_p5_b1_boxes[] = {
-    { 4, 255, 29, 76, "      YO, FATHER, C'MON MAN,\n I KNOW THEY'RE TOUGH 'N ALL, BUT\nWE JUST GOTTA DO SOMETHIN'... THE\n     POLICE SURE AIN'T!", "      YO, PERE, ECOUTE, MEC.\n JE SAIS QUE C'EST DES DURS, TOUT\n  \x80""A... MAIS FAUT FAIRE QUELQUE\n   CHOSE... LA POLICE NE FAIT RIEN,\n           \x80""A C'EST SUR!", "    OIGA, PADRE, LA GENTE\n CREE QUE ESTO ES EL FIN, PERO\n NOSOTROS PODEMOS HACER ALGO...\n LA POLICIA ES INUTIL!", "      ALSO, VATER, KOMMEN SIE\n   SCHON, ICH WEI\xe1"", DA\xe1"" SIE EIN\n    HARTER BURSCHE SIND, ABER WIR\n M\x9a""SSEN WAS TUN, DENN DIE POLIZEI\n      TUT BESTIMMT NICHTS!" },
-    { 3, 255, 344, 87, "     YEAH, FATHER, JUST LET\n THE WARDS GIVE IT A TRY.", "     OUAIS, PERE, LAISSEZ\n     FAIRE LES PUPILLES!", "   SI, PADRE, DEJE QUE LOS\n GUARDIANES LO INTENTEMOS.", "     JAU, VATER, GEBEN SIE DER\n  WEHR DOCH EINMAL EINE CHANCE." },
+	{ 4, 255, 29, 76, "      YO, FATHER, C'MON MAN,\n I KNOW THEY'RE TOUGH 'N ALL, BUT\nWE JUST GOTTA DO SOMETHIN'... THE\n     POLICE SURE AIN'T!", "      YO, PERE, ECOUTE, MEC.\n JE SAIS QUE C'EST DES DURS, TOUT\n  \x80""A... MAIS FAUT FAIRE QUELQUE\n   CHOSE... LA POLICE NE FAIT RIEN,\n           \x80""A C'EST SUR!", "    OIGA, PADRE, LA GENTE\n CREE QUE ESTO ES EL FIN, PERO\n NOSOTROS PODEMOS HACER ALGO...\n LA POLICIA ES INUTIL!", "      ALSO, VATER, KOMMEN SIE\n   SCHON, ICH WEI\xe1"", DA\xe1"" SIE EIN\n    HARTER BURSCHE SIND, ABER WIR\n M\x9a""SSEN WAS TUN, DENN DIE POLIZEI\n      TUT BESTIMMT NICHTS!" },
+	{ 3, 255, 344, 87, "     YEAH, FATHER, JUST LET\n THE WARDS GIVE IT A TRY.", "     OUAIS, PERE, LAISSEZ\n     FAIRE LES PUPILLES!", "   SI, PADRE, DEJE QUE LOS\n GUARDIANES LO INTENTEMOS.", "     JAU, VATER, GEBEN SIE DER\n  WEHR DOCH EINMAL EINE CHANCE." },
 };
 
 static const struct ComicBlock block_p5_1 = { &poly_p5_b1, -1, -1, block_p5_b1_boxes, 2 };
 
 static const struct Polygon poly_p5_b2 = { {
-    { 343, 78 },
-    { 451, 78 },
-    { 451, 167 },
-    { 343, 167 },
+	{ 343, 78 },
+	{ 451, 78 },
+	{ 451, 167 },
+	{ 343, 167 },
 } };
 
 static const struct ComicBox block_p5_b2_boxes[] = {
-    { 4, 255, 189, 50, "     ABSOLUTELY NOT! ALL FIVE\n   OF THEM ARE TWISTED, COLD-\nBLOODED KILLERS, RICO... THEY'D EAT\n THE WARDS ALIVE! MAYBE... MAYBE\n      STILETTO CAN HELP US.", "\n     CERTAINEMENT PAS! CE SONT\n     CINQ DEMENTS QUI TUENT DE\n SANG-FROID, RICO... ILS NE FERAIENT\nQU'UNE BOUCHEE DE VOUS! PEUT-ETRE\n    QUE... PEUT-ETRE QUE STILETTO\n             PEUT NOUS AIDER.", "     DE ESO NADA! SE TRATA\n  DE CINCO CRIMINALES SIN\n PIEDAD QUE OS DEVORARIAN VIVOS!\n QUIZAS STILETTO PUEDA AYUDARNOS.", "\n     BESTIMMT NICHT! DAS SIND\n   ALLE F\x9a""NF GEST\x99""RTE, KALTBL\x9a""TIGE\nKILLER, RICO...DIE W\x9a""RDEN DIE WEHR\n LEBENDIG ZERFLEISCHEN. VIELLEICHT...\n   VIELLEICHT KANN UNS STILETTO\n              HELFEN." },
+	{ 4, 255, 189, 50, "     ABSOLUTELY NOT! ALL FIVE\n   OF THEM ARE TWISTED, COLD-\nBLOODED KILLERS, RICO... THEY'D EAT\n THE WARDS ALIVE! MAYBE... MAYBE\n      STILETTO CAN HELP US.", "\n     CERTAINEMENT PAS! CE SONT\n     CINQ DEMENTS QUI TUENT DE\n SANG-FROID, RICO... ILS NE FERAIENT\nQU'UNE BOUCHEE DE VOUS! PEUT-ETRE\n    QUE... PEUT-ETRE QUE STILETTO\n             PEUT NOUS AIDER.", "     DE ESO NADA! SE TRATA\n  DE CINCO CRIMINALES SIN\n PIEDAD QUE OS DEVORARIAN VIVOS!\n QUIZAS STILETTO PUEDA AYUDARNOS.", "\n     BESTIMMT NICHT! DAS SIND\n   ALLE F\x9a""NF GEST\x99""RTE, KALTBL\x9a""TIGE\nKILLER, RICO...DIE W\x9a""RDEN DIE WEHR\n LEBENDIG ZERFLEISCHEN. VIELLEICHT...\n   VIELLEICHT KANN UNS STILETTO\n              HELFEN." },
 };
 
 static const struct ComicBlock block_p5_2 = { &poly_p5_b2, -1, -1, block_p5_b2_boxes, 1 };
 
 static const struct Polygon poly_p5_b3 = { {
-    { 187, 185 },
-    { 333, 185 },
-    { 333, 399 },
-    { 187, 399 },
+	{ 187, 185 },
+	{ 333, 185 },
+	{ 333, 399 },
+	{ 187, 399 },
 } };
 
 static const struct ComicBox block_p5_b3_boxes[] = {
-    { 4, 255, 40, 250, "       IF STILETTO CAN'T HELP,\n  THEN IT'S OVER... ESPECIALLY FOR\n ME. THE SUCCUBUS HASN'T FORGOTTEN\n HER HATE, IT'S PROBABLY STRONGER\n    THAN EVER. GOD HELP ME WHEN\n            SHE COMES!", "         SI STILETTO NE PEUT\n    PAS NOUS AIDER, ALORS TOUT\n EST FINI... SURTOUT POUR MOI. LA\nSUCCUBE N'A PAS OUBLIE SA HAINE, ET\n  ELLE EST SUREMENT PLUS FORTE QUE\n   JAMAIS! QUE DIEU ME VIENNE EN\n      AIDE SI ELLE VIENT ICI!", "       SI STILETTO SE NIEGA, SE\n  ACABARA TODO... EN ESPECIAL\n PARA MI. LA SUCCUBUS NO OLVIDA.\n Y AHORA DEBE SER MAS FUERTE QUE\n NUNCA. QUE DIOS SE APIADE DE MI\n     SI ELLA VIENE!", "       WENN UNS STILETTO NICHT\n   HELFEN KANN, IST ALLES VORBEI...\n BESONDERS F\x9a""R MICH. SUCCUBUS HAT\n  IHREN HA\xe1"" BESTIMMT NICHT\n   VERGESSEN, WAHRSCHEINLICH\n    IST ER EHER NOCH GEWACHSEN.\n    GOTT STEH MIR BEI, WENN SIE\n               KOMMT!" },
+	{ 4, 255, 40, 250, "       IF STILETTO CAN'T HELP,\n  THEN IT'S OVER... ESPECIALLY FOR\n ME. THE SUCCUBUS HASN'T FORGOTTEN\n HER HATE, IT'S PROBABLY STRONGER\n    THAN EVER. GOD HELP ME WHEN\n            SHE COMES!", "         SI STILETTO NE PEUT\n    PAS NOUS AIDER, ALORS TOUT\n EST FINI... SURTOUT POUR MOI. LA\nSUCCUBE N'A PAS OUBLIE SA HAINE, ET\n  ELLE EST SUREMENT PLUS FORTE QUE\n   JAMAIS! QUE DIEU ME VIENNE EN\n      AIDE SI ELLE VIENT ICI!", "       SI STILETTO SE NIEGA, SE\n  ACABARA TODO... EN ESPECIAL\n PARA MI. LA SUCCUBUS NO OLVIDA.\n Y AHORA DEBE SER MAS FUERTE QUE\n NUNCA. QUE DIOS SE APIADE DE MI\n     SI ELLA VIENE!", "       WENN UNS STILETTO NICHT\n   HELFEN KANN, IST ALLES VORBEI...\n BESONDERS F\x9a""R MICH. SUCCUBUS HAT\n  IHREN HA\xe1"" BESTIMMT NICHT\n   VERGESSEN, WAHRSCHEINLICH\n    IST ER EHER NOCH GEWACHSEN.\n    GOTT STEH MIR BEI, WENN SIE\n               KOMMT!" },
 };
 
 static const struct ComicBlock block_p5_3 = { &poly_p5_b3, -1, -1, block_p5_b3_boxes, 1 };
 
 static const struct Polygon poly_p5_b4 = { {
-    { 333, 167 },
-    { 451, 167 },
-    { 451, 399 },
-    { 333, 399 },
+	{ 333, 167 },
+	{ 451, 167 },
+	{ 451, 399 },
+	{ 333, 399 },
 } };
 
 static const struct ComicBox block_p5_b4_boxes[] = {
-    { 4, 255, 211, 173, "      WELL IF IT AIN'T FATHER\n  DESMOND! COME TO GIVE POOR\nSTILETTO MORE ADVICE, PRIEST? NOW,\n           LET'S SEE...", "       MAIS C'EST LE PERE\n  DESMOND! ON EST VENU DONNER\n DES CONSEILS A STILETTO, CURE?\n          BON, VOYONS VOIR...", "   QUE SORPRESA, PADRE\n  DESMOND! VIENE A DAR CONSEJOS\n A LA POBRE STILETTO?", "\n      NA, WENN DAS NICHT VATER\n  DESMOND IST! VORBEIGEKOMMEN, UM\nDER ARMEN STILETTO NOCH EIN PAAR\n  RATSCHL\x8e""GE ZU GEBEN, PRIESTER?\n    NA, DANN SCHAUEN WIR DOCH MAL..." },
+	{ 4, 255, 211, 173, "      WELL IF IT AIN'T FATHER\n  DESMOND! COME TO GIVE POOR\nSTILETTO MORE ADVICE, PRIEST? NOW,\n           LET'S SEE...", "       MAIS C'EST LE PERE\n  DESMOND! ON EST VENU DONNER\n DES CONSEILS A STILETTO, CURE?\n          BON, VOYONS VOIR...", "   QUE SORPRESA, PADRE\n  DESMOND! VIENE A DAR CONSEJOS\n A LA POBRE STILETTO?", "\n      NA, WENN DAS NICHT VATER\n  DESMOND IST! VORBEIGEKOMMEN, UM\nDER ARMEN STILETTO NOCH EIN PAAR\n  RATSCHL\x8e""GE ZU GEBEN, PRIESTER?\n    NA, DANN SCHAUEN WIR DOCH MAL..." },
 };
 
 static const struct ComicBlock block_p5_4 = { &poly_p5_b4, -1, -1, block_p5_b4_boxes, 1 };
 
 static const struct ComicBlock page_5_blocks[] = {
-    block_p5_0,
-    block_p5_1,
-    block_p5_2,
-    block_p5_3,
-    block_p5_4,
+	block_p5_0,
+	block_p5_1,
+	block_p5_2,
+	block_p5_3,
+	block_p5_4,
 };
 
 static struct ComicPage page_5 = { "DARK/COMDATA/SEPG05.SCN", 98, 58, 1, 0, page_5_blocks, 5 };
 
 static const struct Polygon poly_p6_b0 = { {
-    { 188, 0 },
-    { 320, 0 },
-    { 320, 107 },
-    { 188, 107 },
+	{ 188, 0 },
+	{ 320, 0 },
+	{ 320, 107 },
+	{ 188, 107 },
 } };
 
 static const struct ComicBox block_p6_b0_boxes[] = {
-    { 1, 255, 292, 98, "    ...\"GOD WANTS ME TO BE\n  HAPPY\",... \"DARKSHEER WILL\nRETURN MY LOVE\". THAT'S WHAT\n  YOU TOLD ME...\n      WHAT A LOAD OF BULL!", "       ...\"DIEU VEUT QUE TU\n                 SOIS HEUREUSE,\"... \n   \"DARKSHEER TE RENDRA \n                    TON AMOUR...\" \n     C'EST CE QUE VOUS DISIEZ...\n     RIEN QUE DES CONNERIES!", "    ...DIOS QUIERE QUE\n SEAS FELIZ... TENEBROSO\n ENTENDERA TU AMOR... ESO ME\n DIJO, RECUERDA?", "       ...\"GOTT WILL, DA\xe1""\n               ICH GL\x9a""CKLICH BIN.\"\n...\"DARKSHEER WIRD MEINE\n                       LIEBE ERWIDERN\",\n    DAS WAR'S DOCH, WAS SIE MIR\n    ERZ\x8e""HLST HABEN...WAS F\x9a""R EINE\n               SCHEI\xe1""E!" },
+	{ 1, 255, 292, 98, "    ...\"GOD WANTS ME TO BE\n  HAPPY\",... \"DARKSHEER WILL\nRETURN MY LOVE\". THAT'S WHAT\n  YOU TOLD ME...\n      WHAT A LOAD OF BULL!", "       ...\"DIEU VEUT QUE TU\n                 SOIS HEUREUSE,\"... \n   \"DARKSHEER TE RENDRA \n                    TON AMOUR...\" \n     C'EST CE QUE VOUS DISIEZ...\n     RIEN QUE DES CONNERIES!", "    ...DIOS QUIERE QUE\n SEAS FELIZ... TENEBROSO\n ENTENDERA TU AMOR... ESO ME\n DIJO, RECUERDA?", "       ...\"GOTT WILL, DA\xe1""\n               ICH GL\x9a""CKLICH BIN.\"\n...\"DARKSHEER WIRD MEINE\n                       LIEBE ERWIDERN\",\n    DAS WAR'S DOCH, WAS SIE MIR\n    ERZ\x8e""HLST HABEN...WAS F\x9a""R EINE\n               SCHEI\xe1""E!" },
 };
 
 static const struct ComicBlock block_p6_0 = { &poly_p6_b0, -1, -1, block_p6_b0_boxes, 1 };
 
 static const struct Polygon poly_p6_b1 = { {
-    { 320, 0 },
-    { 451, 0 },
-    { 451, 107 },
-    { 320, 107 },
+	{ 320, 0 },
+	{ 451, 0 },
+	{ 451, 107 },
+	{ 320, 107 },
 } };
 
 static const struct ComicBox block_p6_b1_boxes[] = {
-    { 2, 255, 195, 91, "    STILETTO, I UNDERSTAND\nYOUR PAIN, BUT I'VE COME TO\n  DISCUSS URGENT MATTERS.", "      STILETTO, JE COMPRENDS\n  TA PEINE, MAIS JE SUIS VENU TE\n      PARLER D'UNE AFFAIRE\n           IMPORTANTE...", "    STILETTO, COMPRENDO TU\n DOLOR, PERO ME TRAEN\n ASUNTOS MUY URGENTES.", "      STILETTO, ICH VERSTEHE\n  JA DEINEN SCHMERZ, ABER ICH\n     MU\xe1"" WICHTIGE DINGE MIT DIR\n            BESPRECHEN." },
+	{ 2, 255, 195, 91, "    STILETTO, I UNDERSTAND\nYOUR PAIN, BUT I'VE COME TO\n  DISCUSS URGENT MATTERS.", "      STILETTO, JE COMPRENDS\n  TA PEINE, MAIS JE SUIS VENU TE\n      PARLER D'UNE AFFAIRE\n           IMPORTANTE...", "    STILETTO, COMPRENDO TU\n DOLOR, PERO ME TRAEN\n ASUNTOS MUY URGENTES.", "      STILETTO, ICH VERSTEHE\n  JA DEINEN SCHMERZ, ABER ICH\n     MU\xe1"" WICHTIGE DINGE MIT DIR\n            BESPRECHEN." },
 };
 
 static const struct ComicBlock block_p6_1 = { &poly_p6_b1, -1, -1, block_p6_b1_boxes, 1 };
 
 static const struct Polygon poly_p6_b2 = { {
-    { 188, 107 },
-    { 320, 107 },
-    { 320, 210 },
-    { 188, 210 },
+	{ 188, 107 },
+	{ 320, 107 },
+	{ 320, 210 },
+	{ 188, 210 },
 } };
 
 static const struct ComicBox block_p6_b2_boxes[] = {
-    { 3, 255, 330, 78, "      THE ARCHVILLAINS HAVE\n  ESCAPED FROM PRISON! THEY'RE\nTEARING THIS CITY APART! NOW,\n YOU'VE GOT TO PULL YOURSELF\n           TOGETHER.", "      LES ARCHI-CRIMINELS SE\n  SONT EVADES! ILS SONT EN TRAIN\n DE RUINER NOTRE VILLE! TU DOIS\n     ABSOLUMENT TE SECOUER,\n          MAINTENANT!", "    LOS ARCHIVILLANOS HAN\n  ESCAPADO DE PRISION Y SIEMBRAN\n EL TERROR! SOLO TU PUEDES\n ENFRENTARTE A ELLOS.", "      DIE ERZSCHURKEN SIND\n  AUS DEM GEF\x8e""NGNIS ENTKOMMEN!\nSIE REI\xe1""EN DIESE STADT IN ST\x9a""CKE!\n     DU MU\xe1""T DICH ZUSAMMENNEHMEN!" },
+	{ 3, 255, 330, 78, "      THE ARCHVILLAINS HAVE\n  ESCAPED FROM PRISON! THEY'RE\nTEARING THIS CITY APART! NOW,\n YOU'VE GOT TO PULL YOURSELF\n           TOGETHER.", "      LES ARCHI-CRIMINELS SE\n  SONT EVADES! ILS SONT EN TRAIN\n DE RUINER NOTRE VILLE! TU DOIS\n     ABSOLUMENT TE SECOUER,\n          MAINTENANT!", "    LOS ARCHIVILLANOS HAN\n  ESCAPADO DE PRISION Y SIEMBRAN\n EL TERROR! SOLO TU PUEDES\n ENFRENTARTE A ELLOS.", "      DIE ERZSCHURKEN SIND\n  AUS DEM GEF\x8e""NGNIS ENTKOMMEN!\nSIE REI\xe1""EN DIESE STADT IN ST\x9a""CKE!\n     DU MU\xe1""T DICH ZUSAMMENNEHMEN!" },
 };
 
 static const struct ComicBlock block_p6_2 = { &poly_p6_b2, -1, -1, block_p6_b2_boxes, 1 };
 
 static const struct Polygon poly_p6_b3 = { {
-    { 320, 107 },
-    { 451, 107 },
-    { 451, 210 },
-    { 320, 210 },
+	{ 320, 107 },
+	{ 451, 107 },
+	{ 451, 210 },
+	{ 320, 210 },
 } };
 
 static const struct ComicBox block_p6_b3_boxes[] = {
-    { 4, 255, 159, 77, "    WHO THE HELL DO YOU THINK\n  YOU ARE?! I DON'T HAVE TO DO\n A DAMN THING FOR YOU OR THIS\n             CITY!", "      MAIS VOUS VOUS PRENEZ\n  POUR QUI? JE NE SUIS PAS\n OBLIGEE DE FAIRE QUOIQUE CE SOIT,\n      NI POUR VOUS, NI POUR CETTE\n           FOUTUE VILLE!", "  QUIEN TE CREES QUE ERES?\n NO TE DEBO NADA NI A TI NI A\n ESTA MALDITA CIUDAD!", "      WER ZUR H\x99""LLE GLAUBEN\n  SIE, DA\xe1"" SIE SIND? ICH MU\xe1""\n\x9a""BERHAUPT NICHTS TUN, WEDER F\x9a""R\n      SIE NOCH F\x9a""R DIESE STADT!" },
+	{ 4, 255, 159, 77, "    WHO THE HELL DO YOU THINK\n  YOU ARE?! I DON'T HAVE TO DO\n A DAMN THING FOR YOU OR THIS\n             CITY!", "      MAIS VOUS VOUS PRENEZ\n  POUR QUI? JE NE SUIS PAS\n OBLIGEE DE FAIRE QUOIQUE CE SOIT,\n      NI POUR VOUS, NI POUR CETTE\n           FOUTUE VILLE!", "  QUIEN TE CREES QUE ERES?\n NO TE DEBO NADA NI A TI NI A\n ESTA MALDITA CIUDAD!", "      WER ZUR H\x99""LLE GLAUBEN\n  SIE, DA\xe1"" SIE SIND? ICH MU\xe1""\n\x9a""BERHAUPT NICHTS TUN, WEDER F\x9a""R\n      SIE NOCH F\x9a""R DIESE STADT!" },
 };
 
 static const struct ComicBlock block_p6_3 = { &poly_p6_b3, -1, -1, block_p6_b3_boxes, 1 };
 
 static const struct Polygon poly_p6_b4 = { {
-    { 188, 210 },
-    { 320, 210 },
-    { 320, 399 },
-    { 188, 399 },
+	{ 188, 210 },
+	{ 320, 210 },
+	{ 320, 399 },
+	{ 188, 399 },
 } };
 
 static const struct ComicBox block_p6_b4_boxes[] = {
-    { 3, 255, 314, 280, "       IF I WANT TO SIT ON MY\n   ASS 'N DRINK MYSELF BLIND, THEN\n THAT'S MY OWN BUSINESS! FIND\n  ANOTHER SHOULDER TO CRY ON\n          PRIEST...\n     I DON'T CARE ANYMORE.", "            SI JE PREFERE\n       RESTER ASSISE A M'IMBIBER\n   CONSCIENCIEUSEMENT, C'EST MON\nTROUVEZ UNE AUTRE EPAULE PROBLEME!\n     POUR PLEURER, CURE... JE M'EN\n          FOUS, MAINTENANT.", "    SI HE DECIDIDO SENTARME A\n  BEBER, ESO ES ASUNTO\n MIO. BUSCA OTRO HOMBRO SOBRE\n EL QUE LLORAR, SACERDOTE.\n A MI NO ME IMPORTA NADA.", "        WENN ICH AUF MEINEM\n    HINTERN SITZEN UND MICH BLIND\n SAUFEN M\x99""CHTE, DANN IST DAS ALLEIN\n MEINE ANGELEGENHEIT! SUCHEN SIE SICH EINE\n    ANDERE SCHULTER ZUM AUSHEULEN,\n    PRIESTER, MIR IST DAS ALLES EGAL!" },
+	{ 3, 255, 314, 280, "       IF I WANT TO SIT ON MY\n   ASS 'N DRINK MYSELF BLIND, THEN\n THAT'S MY OWN BUSINESS! FIND\n  ANOTHER SHOULDER TO CRY ON\n          PRIEST...\n     I DON'T CARE ANYMORE.", "            SI JE PREFERE\n       RESTER ASSISE A M'IMBIBER\n   CONSCIENCIEUSEMENT, C'EST MON\nTROUVEZ UNE AUTRE EPAULE PROBLEME!\n     POUR PLEURER, CURE... JE M'EN\n          FOUS, MAINTENANT.", "    SI HE DECIDIDO SENTARME A\n  BEBER, ESO ES ASUNTO\n MIO. BUSCA OTRO HOMBRO SOBRE\n EL QUE LLORAR, SACERDOTE.\n A MI NO ME IMPORTA NADA.", "        WENN ICH AUF MEINEM\n    HINTERN SITZEN UND MICH BLIND\n SAUFEN M\x99""CHTE, DANN IST DAS ALLEIN\n MEINE ANGELEGENHEIT! SUCHEN SIE SICH EINE\n    ANDERE SCHULTER ZUM AUSHEULEN,\n    PRIESTER, MIR IST DAS ALLES EGAL!" },
 };
 
 static const struct ComicBlock block_p6_4 = { &poly_p6_b4, -1, -1, block_p6_b4_boxes, 1 };
 
 static const struct Polygon poly_p6_b5 = { {
-    { 320, 210 },
-    { 451, 210 },
-    { 451, 399 },
-    { 320, 399 },
+	{ 320, 210 },
+	{ 451, 210 },
+	{ 451, 399 },
+	{ 320, 399 },
 } };
 
 static const struct ComicBox block_p6_b5_boxes[] = {
-    { 4, 255, 194, 272, "     GOOD-BYE, STILETTO....", "\n       AU REVOIR, STILETTO....", "     ADIOS, STILETTO....", "\n    AUF WIEDERSEHEN, STILETTO...." },
+	{ 4, 255, 194, 272, "     GOOD-BYE, STILETTO....", "\n       AU REVOIR, STILETTO....", "     ADIOS, STILETTO....", "\n    AUF WIEDERSEHEN, STILETTO...." },
 };
 
 static const struct ComicBlock block_p6_5 = { &poly_p6_b5, -1, -1, block_p6_b5_boxes, 1 };
 
 static const struct ComicBlock page_6_blocks[] = {
-    block_p6_0,
-    block_p6_1,
-    block_p6_2,
-    block_p6_3,
-    block_p6_4,
-    block_p6_5,
+	block_p6_0,
+	block_p6_1,
+	block_p6_2,
+	block_p6_3,
+	block_p6_4,
+	block_p6_5,
 };
 
 static struct ComicPage page_6 = { "DARK/COMDATA/SEPG06.SCN", 98, 58, 1, 0, page_6_blocks, 6 };
 
 static const struct Polygon poly_p7_b0 = { {
-    { 354, 4 },
-    { 441, 4 },
-    { 441, 123 },
-    { 354, 123 },
+	{ 354, 4 },
+	{ 441, 4 },
+	{ 441, 123 },
+	{ 354, 123 },
 } };
 
 static const struct ComicBox block_p7_b0_boxes[] = {
-    { 2, 255, 172, 71, "       I BESEECH THEE IN AN\n   HOUR OF GREAT NEED... SEND\nDARKSHEER BACK TO US... SEND\n         HIM BACK!", "       JE T'IMPLORE DANS UN\n     MOMENT DE GRAND BESOIN...\n  RAMENE DARKSHEER PARMI NOUS...\n    NOUS AVONS BESOIN DE LUI!", "    ACUDO A TI EN ESTA HORA\n  DE NECESIDAD... ENVIANOS\n A TENEBROSO... TRAELO\n   DE REGRESO!", "       ICH BESCHW\x99""RE DICH, IN\n   DIESER STUNDE DER NOT...SCHICKE\n   UNS DARKSHEER ZUR\x9a""CK...SCHICK'\n            IHN ZUR\x9a""CK!" },
+	{ 2, 255, 172, 71, "       I BESEECH THEE IN AN\n   HOUR OF GREAT NEED... SEND\nDARKSHEER BACK TO US... SEND\n         HIM BACK!", "       JE T'IMPLORE DANS UN\n     MOMENT DE GRAND BESOIN...\n  RAMENE DARKSHEER PARMI NOUS...\n    NOUS AVONS BESOIN DE LUI!", "    ACUDO A TI EN ESTA HORA\n  DE NECESIDAD... ENVIANOS\n A TENEBROSO... TRAELO\n   DE REGRESO!", "       ICH BESCHW\x99""RE DICH, IN\n   DIESER STUNDE DER NOT...SCHICKE\n   UNS DARKSHEER ZUR\x9a""CK...SCHICK'\n            IHN ZUR\x9a""CK!" },
 };
 
 static const struct ComicBlock block_p7_0 = { &poly_p7_b0, -1, -1, block_p7_b0_boxes, 1 };
 
 static const struct Polygon poly_p7_b1 = { {
-    { 187, 0 },
-    { 451, 0 },
-    { 451, 188 },
-    { 187, 188 },
+	{ 187, 0 },
+	{ 451, 0 },
+	{ 451, 188 },
+	{ 187, 188 },
 } };
 
 static const struct ComicBox block_p7_b1_boxes[] = {
-    { 4, 255, 61, 66, "     OH, GOD IN HEAVEN...", "\n         OH, DIEU DES CIEUX...", "     OH, DIOS MIO...", "\n       OH, GOTT IM HIMMEL..." },
+	{ 4, 255, 61, 66, "     OH, GOD IN HEAVEN...", "\n         OH, DIEU DES CIEUX...", "     OH, DIOS MIO...", "\n       OH, GOTT IM HIMMEL..." },
 };
 
 static const struct ComicBlock block_p7_1 = { &poly_p7_b1, -1, -1, block_p7_b1_boxes, 1 };
 
 static const struct ComicBlock page_7_blocks[] = {
-    block_p7_0,
-    block_p7_1,
+	block_p7_0,
+	block_p7_1,
 };
 
 static struct ComicPage page_7 = { "DARK/COMDATA/SEPG07.SCN", 98, 59, 1, 0, page_7_blocks, 2 };
 
 const struct ComicPage *SpecialComicPages[] = {
-    &page_1,
-    &page_2,
-    &page_3,
-    &page_4,
-    &page_5,
-    &page_6,
-    &page_7,
-    NULL
+	&page_1,
+	&page_2,
+	&page_3,
+	&page_4,
+	&page_5,
+	&page_6,
+	&page_7,
+	NULL
 };
 
 } // end namespace Noctropolis
diff --git a/engines/access/player.h b/engines/access/player.h
index f597b2e9130..cee2c1c6800 100644
--- a/engines/access/player.h
+++ b/engines/access/player.h
@@ -152,7 +152,7 @@ public:
 	void checkScroll();
 
 	void checkMove();
-	
+
 	virtual void updateTimers() {};
 
 	/**
diff --git a/engines/access/resources.cpp b/engines/access/resources.cpp
index 4c7dbaa60c4..d4a8f327e47 100644
--- a/engines/access/resources.cpp
+++ b/engines/access/resources.cpp
@@ -100,7 +100,7 @@ bool Resources::load(Common::U32String &errorMessage) {
 
 void Resources::load(Common::SeekableReadStream &s) {
 	uint count;
-	
+
 	assert(_vm->getGameID() != kGameNoctropolis);
 
 	// Get the offset of the data for the game
diff --git a/engines/access/room.h b/engines/access/room.h
index 61f2e1ccf1a..f165fc7ee1e 100644
--- a/engines/access/room.h
+++ b/engines/access/room.h
@@ -71,7 +71,7 @@ enum RoomFlag {
 class Room : public Manager {
 private:
 	void roomLoop();
-	
+
 	void cmdExitContinuance();
 	void roomLoopContinuance();
 


Commit: 4840b82578611cbb303a7ed1a956bc9a8c3b4c5f
    https://github.com/scummvm/scummvm/commit/4840b82578611cbb303a7ed1a956bc9a8c3b4c5f
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Remove unused _frameScale

Changed paths:
    engines/access/animation.cpp
    engines/access/animation.h


diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index c2922b6f701..ecbe53d6503 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -426,7 +426,6 @@ AnimationFramePart::AnimationFramePart(Common::SeekableReadStream *stream) {
 AnimationManager::AnimationManager(AccessEngine *vm) : Manager(vm) {
 	_animation = nullptr;
 	_animStart = nullptr;
-	//_frameScale = 0;
 }
 
 AnimationManager::~AnimationManager() {
@@ -474,7 +473,6 @@ Animation *AnimationManager::findAnimation(int animId) {
 
 void AnimationManager::animate(int animId) {
 	Animation *anim = findAnimation(animId);
-	//_frameScale = anim->_scaling;
 	anim->animate();
 }
 
diff --git a/engines/access/animation.h b/engines/access/animation.h
index 6af2371dc53..90fe83e7b47 100644
--- a/engines/access/animation.h
+++ b/engines/access/animation.h
@@ -42,7 +42,6 @@ private:
 public:
 	Animation *_animStart;
 	Common::Point _base;
-	//int _frameScale;
 public:
 	AnimationManager(AccessEngine *vm);
 	~AnimationManager();


Commit: 7c514ab5ce094108bcb07441e29728e5458f5115
    https://github.com/scummvm/scummvm/commit/7c514ab5ce094108bcb07441e29728e5458f5115
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Remove redundant comment

Changed paths:
    engines/access/polygon.cpp


diff --git a/engines/access/polygon.cpp b/engines/access/polygon.cpp
index 2d4712a4b4f..03dcb09b5ff 100644
--- a/engines/access/polygon.cpp
+++ b/engines/access/polygon.cpp
@@ -39,6 +39,4 @@ bool Polygon::pointInside(int16 x, int16 y) const {
 	return result;
 }
 
-// TODO: Add more functions here.
-
 } // end namespace Access


Commit: 7b7cc074bf31ad66e3282ef5e33f01ce5a29b2bf
    https://github.com/scummvm/scummvm/commit/7b7cc074bf31ad66e3282ef5e33f01ce5a29b2bf
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add support for Noctropolis demo and original release

This fixes up the path config in the detection a bit too. Will render
previously detected Noctropolis entries broken, but since it's not merged yet
this is fine.

Changed paths:
    engines/access/detection.cpp
    engines/access/detection_tables.h
    engines/access/noctropolis/noctropolis_comicviewer.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/noctropolis/noctropolis_last_comic.cpp
    engines/access/noctropolis/noctropolis_scripts.cpp
    engines/access/noctropolis/noctropolis_special_comic.cpp
    engines/access/scripts.cpp
    engines/access/sound.cpp
    engines/access/sound.h
    engines/access/video.cpp


diff --git a/engines/access/detection.cpp b/engines/access/detection.cpp
index caa4ba98768..9de6d795476 100644
--- a/engines/access/detection.cpp
+++ b/engines/access/detection.cpp
@@ -44,6 +44,9 @@ static const DebugChannelDef debugFlagList[] = {
 class AccessMetaEngineDetection : public AdvancedMetaEngineDetection<Access::AccessGameDescription> {
 public:
 	AccessMetaEngineDetection() : AdvancedMetaEngineDetection(Access::gameDescriptions, AccessGames) {
+		static const char *const DIRECTORY_GLOBS[3] = { "dark", "demo", 0 };
+		_directoryGlobs = DIRECTORY_GLOBS;
+		_flags = kADFlagMatchFullPaths;
 		_maxScanDepth = 3;
 	}
 
diff --git a/engines/access/detection_tables.h b/engines/access/detection_tables.h
index 270435bd981..b1ea7341ab2 100644
--- a/engines/access/detection_tables.h
+++ b/engines/access/detection_tables.h
@@ -130,12 +130,27 @@ static const AccessGameDescription gameDescriptions[] = {
 		0
 	},
 
+	{
+		// Noctropolis Demo
+		{
+			"noctropolis",
+			"Demo",
+			AD_ENTRY1s("demo/scene01.ap", "3a154bf58e10cd7ace14cab1bf5adf4a", 145796),
+			Common::EN_ANY,
+			Common::kPlatformWindows,
+			ADGF_UNSTABLE | ADGF_DEMO,
+			GUIO1(GUIO_NONE)
+		},
+		kGameNoctropolis,
+		0
+	},
+
 	{
 		// Noctropolis (Sum from GOG Windows and macOS versions)
 		{
 			"noctropolis",
 			nullptr,
-			AD_ENTRY1s("scene01.ap", "3a154bf58e10cd7ace14cab1bf5adf4a", 147954),
+			AD_ENTRY1s("dark/scene01.ap", "3a154bf58e10cd7ace14cab1bf5adf4a", 147954),
 			Common::EN_ANY,
 			Common::kPlatformWindows,
 			ADGF_UNSTABLE,
diff --git a/engines/access/noctropolis/noctropolis_comicviewer.cpp b/engines/access/noctropolis/noctropolis_comicviewer.cpp
index e6a6b264bc7..04a56ec345e 100644
--- a/engines/access/noctropolis/noctropolis_comicviewer.cpp
+++ b/engines/access/noctropolis/noctropolis_comicviewer.cpp
@@ -71,9 +71,9 @@ void ComicViewer::run(const ComicResource *comic) {
 PageResult ComicViewer::runPage(const ComicPage *page) {
 	PageResult result = kPageResultNone;
 
-	_vm->_files->loadScreen(Common::Path(page->filename.baseName()));
+	_vm->_files->loadScreen(Common::Path(page->filename));
 
-	Resource *bubbleData = _vm->_files->loadRawFile("comic.ap");
+	Resource *bubbleData = _vm->_files->loadRawFile("COMDATA/comic.ap");
 	_bubbleSprites = new SpriteResource(_vm, bubbleData);
 	delete bubbleData;
 
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index cae186e8ca6..7a51eb7f163 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -55,7 +55,6 @@ void NoctropolisEngine::initObjects() {
 	_stil = new NoctropolisPlayer(this, true);
 
 	const Common::FSNode gameDataDir(ConfMan.getPath("path"));
-	SearchMan.addSubDirectoryMatching(gameDataDir, "comdata");
 
 	// Current defaults to screen in Noctropolis.
 	_current = _screen;
@@ -187,8 +186,7 @@ Common::Error NoctropolisEngine::loadGameState(int slot) {
 void NoctropolisEngine::doFlashLogo() {
 	_events->hideCursor();
 
-	// TODO: should be "DARK/FLASH.SCN".
-	_files->loadScreen(Common::Path("FLASH.SCN"));
+	_files->loadScreen(Common::Path("DARK/FLASH.SCN"));
 	_screen->fadeIn();
 	if (shouldQuit())
 		return;
@@ -204,48 +202,83 @@ void NoctropolisEngine::doFlashLogo() {
 
 void NoctropolisEngine::doPublisherLogo() {
 	Common::File pngFile;
-	// TODO: should be "DARK/nds.png".
-	pngFile.open(Common::Path("nds.png"));
-
-	// TODO: Original has a movie here instead of PNG, will need an update.
-	// The version on GOG has PNG for both windows and mac.
-	Image::PNGDecoder decoder;
-	decoder.loadStream(pngFile);
-
-	// Find the best 8-bit palette for this logo as the png is 24-bit and we're
-	// not changing the output surface format for this one logo at the start!
-	Graphics::ColorQuantizer quant(256);
-	const Graphics::Surface *pngSurf = decoder.getSurface();
-	// The image comes in a bit big too
-	Graphics::Surface *scaledPng = pngSurf->scale(640, 360, true);
-	Graphics::PixelFormat format = scaledPng->format;
-	assert(format.bytesPerPixel == 3);
-	for (int y = 0; y < scaledPng->h; y++) {
-		for (int x = 0; x < scaledPng->w; x++) {
-			byte r,g,b;
-			format.colorToRGB(scaledPng->getPixel(x, y), r, g, b);
-			quant.addColor(r, g, b);
+	const Common::Path nightDive("DARK/nds.png");
+
+	if (pngFile.exists(nightDive)) {
+		// The nightdive re-release, show their logo.
+		pngFile.open(nightDive);
+
+		Image::PNGDecoder decoder;
+		decoder.loadStream(pngFile);
+
+		// Find the best 8-bit palette for this logo as the png is 24-bit and we're
+		// not changing the output surface format for this one logo at the start!
+		Graphics::ColorQuantizer quant(256);
+		const Graphics::Surface *pngSurf = decoder.getSurface();
+		// The image comes in a bit big too
+		Graphics::Surface *scaledPng = pngSurf->scale(640, 360, true);
+		Graphics::PixelFormat format = scaledPng->format;
+		assert(format.bytesPerPixel == 3);
+		for (int y = 0; y < scaledPng->h; y++) {
+			for (int x = 0; x < scaledPng->w; x++) {
+				byte r,g,b;
+				format.colorToRGB(scaledPng->getPixel(x, y), r, g, b);
+				quant.addColor(r, g, b);
+			}
 		}
-	}
-	Graphics::Palette *bestPal = quant.getPalette();
-	_screen->clearScreen();
-	_screen->setRawPalette(*bestPal);
-	_screen->setPalette();
-	for (int y = 0; y < MIN(scaledPng->h, _screen->h); y++) {
-		for (int x = 0; x < MIN(scaledPng->w, _screen->w); x++) {
-			byte r,g,b;
-			format.colorToRGB(scaledPng->getPixel(x, y), r, g, b);
-			byte col = bestPal->findBestColor(r, g, b);
-			_screen->setPixel(x, y, col);
+		Graphics::Palette *bestPal = quant.getPalette();
+		_screen->clearScreen();
+		_screen->setRawPalette(*bestPal);
+		_screen->setPalette();
+		for (int y = 0; y < MIN(scaledPng->h, _screen->h); y++) {
+			for (int x = 0; x < MIN(scaledPng->w, _screen->w); x++) {
+				byte r,g,b;
+				format.colorToRGB(scaledPng->getPixel(x, y), r, g, b);
+				byte col = bestPal->findBestColor(r, g, b);
+				_screen->setPixel(x, y, col);
+			}
 		}
+		delete bestPal;
+		_screen->fadeIn();
+
+		_events->_vbCount = 0x7e;
+		while (!shouldQuit() && (_events->_vbCount > 0) && !_events->isKeyActionMousePressed()) {
+			_events->pollEventsAndWait();
+		}
+		if (shouldQuit())
+			return;
+		_screen->fadeOut();
+
+	} else {
+		// The original EA release, show their logo.
+		//
+		// Interestingly, these files are availble even in the re-release.
+		// It would be possible to expose as an option, if anyone
+		// was particularly keen on restoring this publisher logo..
+		//
+		_screen->clearScreen();
+		int soundId = _sound->loadRawSound("AUD/EALOGO.WAV", 1);
+		_sound->playSound(soundId);
+		VideoPlayer_v2 vidPlayer(this, true);
+		// TODO: This video should really be played at double-size as it's 320x200
+		vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(160, 100), Common::Path("VID/EALOGO.VID"), 0);
+		vidPlayer.playToEnd();
+		// If the video is skipped the sfx isn't done yet.
+		if (_sound->isSFXPlaying())
+			_sound->stopSound();
 	}
-	delete bestPal;
+}
+
+void NoctropolisEngine::doUpsell() {
+	_files->loadScreen(Common::Path("TITLE.SCN"));
 	_screen->fadeIn();
+	if (shouldQuit())
+		return;
+
+	VideoPlayer_v2 vidPlayer(this, true);
+	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(110, 17), Common::Path("TITL.VID"), 0);
+	vidPlayer.playToEnd();
 
-	_events->_vbCount = 0x7e;
-	while (!shouldQuit() && (_events->_vbCount > 0) && !_events->isKeyActionMousePressed()) {
-		_events->pollEventsAndWait();
-	}
 	if (shouldQuit())
 		return;
 	_screen->fadeOut();
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index 6eee15a1b9e..5bfd5cb6c17 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -90,10 +90,12 @@ public:
 	void playSuccubusAttack();
 	void doLastComic();
 	void doSpecialComic();
+	void doUpsell();
 
 	/** Play SFX for item added to inv, debounced */
 	void playInventoryStinger();
 
+
 protected:
 	void setupGame() override;
 	void initObjects() override;
diff --git a/engines/access/noctropolis/noctropolis_last_comic.cpp b/engines/access/noctropolis/noctropolis_last_comic.cpp
index 77109c12ab1..4de88f173c4 100644
--- a/engines/access/noctropolis/noctropolis_last_comic.cpp
+++ b/engines/access/noctropolis/noctropolis_last_comic.cpp
@@ -60,7 +60,7 @@ static const struct ComicBlock page_1_blocks[] = {
 	block_p1_1,
 };
 
-static struct ComicPage page_1 = { "DARK/COMDATA/LEPG1_2.SCN", 98, 41, 1, 0, page_1_blocks, 2 };
+static struct ComicPage page_1 = { "COMDATA/LEPG1_2.SCN", 98, 41, 1, 0, page_1_blocks, 2 };
 
 static const struct Polygon poly_p2_b0 = { {
 	{ 106, 0 },
@@ -251,7 +251,7 @@ static const struct ComicBlock page_2_blocks[] = {
 	block_p2_12,
 };
 
-static struct ComicPage page_2 = { "DARK/COMDATA/LEPG3_4.SCN", 98, 42, 1, 0, page_2_blocks, 13 };
+static struct ComicPage page_2 = { "COMDATA/LEPG3_4.SCN", 98, 42, 1, 0, page_2_blocks, 13 };
 
 static const struct Polygon poly_p3_b0 = { {
 	{ 59, 265 },
@@ -359,7 +359,7 @@ static const struct ComicBlock page_3_blocks[] = {
 	block_p3_5,
 };
 
-static struct ComicPage page_3 = { "DARK/COMDATA/LEPG5_6.SCN", 98, 43, 0, 0, page_3_blocks, 6 };
+static struct ComicPage page_3 = { "COMDATA/LEPG5_6.SCN", 98, 43, 0, 0, page_3_blocks, 6 };
 
 static const struct Polygon poly_p4_b0 = { {
 	{ 62, 0 },
@@ -497,7 +497,7 @@ static const struct ComicBlock page_4_blocks[] = {
 	block_p4_8,
 };
 
-static struct ComicPage page_4 = { "DARK/COMDATA/LEPG7_8.SCN", 98, 44, 0, 0, page_4_blocks, 9 };
+static struct ComicPage page_4 = { "COMDATA/LEPG7_8.SCN", 98, 44, 0, 0, page_4_blocks, 9 };
 
 static const struct Polygon poly_p5_b0 = { {
 	{ 168, 83 },
@@ -709,7 +709,7 @@ static const struct ComicBlock page_5_blocks[] = {
 	block_p5_13,
 };
 
-static struct ComicPage page_5 = { "DARK/COMDATA/LEPG9_10.SCN", 98, 45, 0, 0, page_5_blocks, 14 };
+static struct ComicPage page_5 = { "COMDATA/LEPG9_10.SCN", 98, 45, 0, 0, page_5_blocks, 14 };
 
 static const struct Polygon poly_p6_b0 = { {
 	{ 255, 0 },
@@ -890,7 +890,7 @@ static const struct ComicBlock page_6_blocks[] = {
 	block_p6_10,
 };
 
-static struct ComicPage page_6 = { "DARK/COMDATA/LEPG1112.SCN", 98, 46, 0, 0, page_6_blocks, 11 };
+static struct ComicPage page_6 = { "COMDATA/LEPG1112.SCN", 98, 46, 0, 0, page_6_blocks, 11 };
 
 static const struct Polygon poly_p7_b0 = { {
 	{ 112, 50 },
@@ -1016,7 +1016,7 @@ static const struct ComicBlock page_7_blocks[] = {
 	block_p7_7,
 };
 
-static struct ComicPage page_7 = { "DARK/COMDATA/LEPG1314.SCN", 98, 47, 0, 0, page_7_blocks, 8 };
+static struct ComicPage page_7 = { "COMDATA/LEPG1314.SCN", 98, 47, 0, 0, page_7_blocks, 8 };
 
 static const struct Polygon poly_p8_b0 = { {
 	{ 59, 0 },
@@ -1185,7 +1185,7 @@ static const struct ComicBlock page_8_blocks[] = {
 	block_p8_10,
 };
 
-static struct ComicPage page_8 = { "DARK/COMDATA/LEPG1516.SCN", 98, 48, 1, 0, page_8_blocks, 11 };
+static struct ComicPage page_8 = { "COMDATA/LEPG1516.SCN", 98, 48, 1, 0, page_8_blocks, 11 };
 
 static const struct Polygon poly_p9_b0 = { {
 	{ 187, 0 },
@@ -1271,7 +1271,7 @@ static const struct ComicBlock page_9_blocks[] = {
 	block_p9_4,
 };
 
-static struct ComicPage page_9 = { "DARK/COMDATA/LEPG17.SCN", 98, 49, 1, 0, page_9_blocks, 5 };
+static struct ComicPage page_9 = { "COMDATA/LEPG17.SCN", 98, 49, 1, 0, page_9_blocks, 5 };
 
 static const struct Polygon poly_p10_b0 = { {
 	{ 59, 0 },
@@ -1443,7 +1443,7 @@ static const struct ComicBlock page_10_blocks[] = {
 	block_p10_9,
 };
 
-static struct ComicPage page_10 = { "DARK/COMDATA/LEPG1819.SCN", 98, 50, 1, 0, page_10_blocks, 10 };
+static struct ComicPage page_10 = { "COMDATA/LEPG1819.SCN", 98, 50, 1, 0, page_10_blocks, 10 };
 
 static const struct Polygon poly_p11_b0 = { {
 	{ 232, 82 },
@@ -1638,7 +1638,7 @@ static const struct ComicBlock page_11_blocks[] = {
 	block_p11_12,
 };
 
-static struct ComicPage page_11 = { "DARK/COMDATA/LEPG2021.SCN", 98, 15, 1, 0, page_11_blocks, 13 };
+static struct ComicPage page_11 = { "COMDATA/LEPG2021.SCN", 98, 15, 1, 0, page_11_blocks, 13 };
 
 static const struct Polygon poly_p12_b0 = { {
 	{ 186, 112 },
@@ -1809,7 +1809,7 @@ static const struct ComicBlock page_12_blocks[] = {
 	block_p12_10,
 };
 
-static struct ComicPage page_12 = { "DARK/COMDATA/LEPG2223.SCN", 98, 51, 1, 0, page_12_blocks, 11 };
+static struct ComicPage page_12 = { "COMDATA/LEPG2223.SCN", 98, 51, 1, 0, page_12_blocks, 11 };
 
 static const struct Polygon poly_p13_b0 = { {
 	{ 188, 0 },
@@ -1953,7 +1953,7 @@ static const struct ComicBlock page_13_blocks[] = {
 	block_p13_8,
 };
 
-static struct ComicPage page_13 = { "DARK/COMDATA/LEPG24.SCN", 98, 52, 1, 0, page_13_blocks, 9 };
+static struct ComicPage page_13 = { "COMDATA/LEPG24.SCN", 98, 52, 1, 0, page_13_blocks, 9 };
 
 static const struct Polygon poly_p14_b0 = { {
 	{ 323, 111 },
@@ -2029,7 +2029,7 @@ static const struct ComicBlock page_14_blocks[] = {
 	block_p14_4,
 };
 
-static struct ComicPage page_14 = { "DARK/COMDATA/LEPG2526.SCN", 98, 53, 1, 0, page_14_blocks, 5 };
+static struct ComicPage page_14 = { "COMDATA/LEPG2526.SCN", 98, 53, 1, 0, page_14_blocks, 5 };
 
 static const struct Polygon poly_p15_b0 = { {
 	{ 225, 22 },
@@ -2089,7 +2089,7 @@ static const struct ComicBlock page_15_blocks[] = {
 	block_p15_3,
 };
 
-static struct ComicPage page_15 = { "DARK/COMDATA/LEPG27.SCN", 98, 54, 0, 0, page_15_blocks, 4 };
+static struct ComicPage page_15 = { "COMDATA/LEPG27.SCN", 98, 54, 0, 0, page_15_blocks, 4 };
 
 const struct ComicPage *LastComicPages[] = {
 	&page_1,
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index 333ea136c14..5010d28b3e5 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -167,10 +167,15 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 		((VideoPlayer_v2 *)_vm->_video)->setVideoPalNow();
 		break;
 	case 17:
-		warning("TODO: Add Nightdive credits here if playing that edition?");
+		warning("TODO: End of game - add Nightdive credits here for that edition?");
 		// see NoctEndGame::drawer.
 		_vm->quitGame();
 		break;
+	case 18:
+		warning("TODO: End of demo - show upsell screen?");
+		vm->doUpsell();
+		_vm->quitGame();
+		break;
 	case 19:
 		warning("TODO: work our correct step on Special 19 (flashpalette)");
 		_vm->_screen->flashPalette(20);
diff --git a/engines/access/noctropolis/noctropolis_special_comic.cpp b/engines/access/noctropolis/noctropolis_special_comic.cpp
index a1b352c57bf..71bb4e4ad99 100644
--- a/engines/access/noctropolis/noctropolis_special_comic.cpp
+++ b/engines/access/noctropolis/noctropolis_special_comic.cpp
@@ -124,7 +124,7 @@ static const struct ComicBlock page_1_blocks[] = {
 	block_p1_5,
 };
 
-static struct ComicPage page_1 = { "DARK/COMDATA/SEPG01.SCN", 98, 55, 1, 0, page_1_blocks, 6 };
+static struct ComicPage page_1 = { "COMDATA/SEPG01.SCN", 98, 55, 1, 0, page_1_blocks, 6 };
 
 static const struct Polygon poly_p2_b0 = { {
 	{ 369, 36 },
@@ -201,7 +201,7 @@ static const struct ComicBlock page_2_blocks[] = {
 	block_p2_4,
 };
 
-static struct ComicPage page_2 = { "DARK/COMDATA/SEPG02.SCN", 98, 55, 1, 0, page_2_blocks, 5 };
+static struct ComicPage page_2 = { "COMDATA/SEPG02.SCN", 98, 55, 1, 0, page_2_blocks, 5 };
 
 static const struct Polygon poly_p3_b0 = { {
 	{ 187, 0 },
@@ -238,7 +238,7 @@ static const struct ComicBlock page_3_blocks[] = {
 	block_p3_1,
 };
 
-static struct ComicPage page_3 = { "DARK/COMDATA/SEPG03.SCN", 98, 56, 0, 0, page_3_blocks, 2 };
+static struct ComicPage page_3 = { "COMDATA/SEPG03.SCN", 98, 56, 0, 0, page_3_blocks, 2 };
 
 static const struct Polygon poly_p4_b0 = { {
 	{ 187, 0 },
@@ -257,7 +257,7 @@ static const struct ComicBlock page_4_blocks[] = {
 	block_p4_0,
 };
 
-static struct ComicPage page_4 = { "DARK/COMDATA/SEPG04.SCN", 98, 57, 1, 0, page_4_blocks, 1 };
+static struct ComicPage page_4 = { "COMDATA/SEPG04.SCN", 98, 57, 1, 0, page_4_blocks, 1 };
 
 static const struct Polygon poly_p5_b0 = { {
 	{ 187, 0 },
@@ -333,7 +333,7 @@ static const struct ComicBlock page_5_blocks[] = {
 	block_p5_4,
 };
 
-static struct ComicPage page_5 = { "DARK/COMDATA/SEPG05.SCN", 98, 58, 1, 0, page_5_blocks, 5 };
+static struct ComicPage page_5 = { "COMDATA/SEPG05.SCN", 98, 58, 1, 0, page_5_blocks, 5 };
 
 static const struct Polygon poly_p6_b0 = { {
 	{ 188, 0 },
@@ -422,7 +422,7 @@ static const struct ComicBlock page_6_blocks[] = {
 	block_p6_5,
 };
 
-static struct ComicPage page_6 = { "DARK/COMDATA/SEPG06.SCN", 98, 58, 1, 0, page_6_blocks, 6 };
+static struct ComicPage page_6 = { "COMDATA/SEPG06.SCN", 98, 58, 1, 0, page_6_blocks, 6 };
 
 static const struct Polygon poly_p7_b0 = { {
 	{ 354, 4 },
@@ -455,7 +455,7 @@ static const struct ComicBlock page_7_blocks[] = {
 	block_p7_1,
 };
 
-static struct ComicPage page_7 = { "DARK/COMDATA/SEPG07.SCN", 98, 59, 1, 0, page_7_blocks, 2 };
+static struct ComicPage page_7 = { "COMDATA/SEPG07.SCN", 98, 59, 1, 0, page_7_blocks, 2 };
 
 const struct ComicPage *SpecialComicPages[] = {
 	&page_1,
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index 7fb89f542c9..d5b8cf7b25a 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -910,8 +910,7 @@ void Scripts::cmdSetVideo_v3() {
 
 	debugC(1, kDebugScripts, "cmdSetVideo_v3(x=%d, y=%d, cellIndex=%d, noFrame=%d)", pt.x, pt.y, cellIndex, noFrame);
 
-	// Hack: Skip the "DARK/"
-	Common::Path vidpath(_vm->_extraCells[cellIndex]._vidFilename.substr(5));
+	Common::Path vidpath(_vm->_extraCells[cellIndex]._vidFilename);
 	_vm->_video->setVideo(_vm->_screen, pt, vidpath, 0);
 
 	if (noFrame == 0) {
diff --git a/engines/access/sound.cpp b/engines/access/sound.cpp
index 646723a871f..651bbfa3ff1 100644
--- a/engines/access/sound.cpp
+++ b/engines/access/sound.cpp
@@ -227,28 +227,28 @@ void SoundManager::loadSounds(const Common::Array<RoomInfo::SoundIdent> &sounds)
 	clearSounds();
 
 	for (const auto &sound : sounds) {
-		Resource *soundRes;
 		if (sound._soundFilename.empty()) {
 			loadAndAddSound(sound._fileNum, sound._subFile, sound._priority);
 		} else {
 			//
 			// In Noctropolis, sounds are defined by filenames, eg,
-			// DARK/AUD/FLUX01A.WAV
-			// TODO: Should probably be loading from DARK parent directory?
-			// Remove DARK/
+			// DARK/AUD/FLUX01A.WAV.
 			//
-			Common::Path origpath = Common::Path(sound._soundFilename);
-			Common::StringArray components = origpath.splitComponents();
-			assert(components.size() == 3);
-			Common::Path path (components[1]);
-			path.joinInPlace(components[2]);
-			debugC(1, kDebugSound, "loadRawSound(%s)", path.toString().c_str());
-			soundRes = _vm->_files->loadRawFile(path);
-			_soundTable.push_back(SoundEntry(soundRes, sound._priority));
+			// The original does not have the data in a DARK/ subdir,
+			// so trim it first.
+			//
+			loadRawSound(Common::Path(sound._soundFilename.substr(5)), sound._priority);
 		}
 	}
 }
 
+int SoundManager::loadRawSound(const Common::Path &path, int priority) {
+	debugC(1, kDebugSound, "loadRawSound(%s)", path.toString().c_str());
+	Resource *soundRes = _vm->_files->loadRawFile(path);
+	_soundTable.push_back(SoundEntry(soundRes, priority));
+	return _soundTable.size() - 1;
+}
+
 void SoundManager::stopSound() {
 	debugC(3, kDebugSound, "stopSound");
 
diff --git a/engines/access/sound.h b/engines/access/sound.h
index 747dcff4266..80e16fbb391 100644
--- a/engines/access/sound.h
+++ b/engines/access/sound.h
@@ -90,6 +90,7 @@ public:
 	bool isSFXPlaying();
 
 	void loadSounds(const Common::Array<RoomInfo::SoundIdent> &sounds);
+	int loadRawSound(const Common::Path &path, int priority);
 	void syncVolume();
 
 	void stopSound();
diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index e35a4262e52..b90af59bf73 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -453,6 +453,11 @@ void VideoPlayer_v2::handleSoundChunk(bool init) {
 
 	_videoData->_stream->read(soundData, soundSize);
 
+	if (!_audioStream) {
+		warning("Got sound block size %d before sound init! Skipping.", soundSize);
+		return;
+	}
+
 	_audioStream->queueBuffer(soundData, soundSize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
 
 	debugC(kDebugGraphics, "soundSize = %d", soundSize);


Commit: 3df694c6f3e87f566784c7e2160506f2f9da6564
    https://github.com/scummvm/scummvm/commit/3df694c6f3e87f566784c7e2160506f2f9da6564
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Cleanup redundant comments and warnings

Changed paths:
    engines/access/martian/martian_duct.cpp
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_room.cpp
    engines/access/noctropolis/noctropolis_scripts.cpp
    engines/access/sound.cpp


diff --git a/engines/access/martian/martian_duct.cpp b/engines/access/martian/martian_duct.cpp
index daafaed558a..c3833b1ba50 100644
--- a/engines/access/martian/martian_duct.cpp
+++ b/engines/access/martian/martian_duct.cpp
@@ -84,13 +84,6 @@ void MartianDuct::doDuct() {
 	drawArrowSprites2();
 	_vm->_room->_function = FN_NONE;
 
-	// FIXME: Quick HACK: skip this part
-	//g_system->displayMessageOnOSD(Common::U32String("Duct section not implemented yet!"));
-	//_vm->_flags[0x62] = 1;
-	//_vm->_flags[0x55] = 1;
-	//_vm->_room->_function = FN_CLEAR1;
-	// END HACK
-
 	while (!_vm->shouldQuit()) {
 		clearWorkScreenArea();
 		updateMatrix();
diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index 7a51eb7f163..b3da0e4ee90 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -418,9 +418,6 @@ void NoctropolisEngine::doTravel() {
 	_buffer2.clear();
 	_screen->clearScreen();
 	_room->loadPlayField(0, 0); // MAP.AP
-	// FIXME: This ignores window and probably is just plain wrong?
-	//_buffer1.copyFrom(*_screen);
-	//_buffer2.copyFrom(*_screen);
 	_screen->setPalette();
 	_screen->setIconPalette();
 	_scrollRow = _travScrollRow;
@@ -775,9 +772,6 @@ void NoctropolisEngine::playSuccubusSplit() {
 }
 
 void NoctropolisEngine::playSuccubusAttack() {
-	//warning("FIXME: NoctropolisEngine::playSuccubusAttack - skipping for testing.");
-	//return;
-
 	_midi->stopSong();
 	_midi->loadMusic(98, 4);
 	_midi->midiPlay();
diff --git a/engines/access/noctropolis/noctropolis_room.cpp b/engines/access/noctropolis/noctropolis_room.cpp
index 4cc0a03de4c..51f9b6ea759 100644
--- a/engines/access/noctropolis/noctropolis_room.cpp
+++ b/engines/access/noctropolis/noctropolis_room.cpp
@@ -226,7 +226,7 @@ void NoctropolisRoom::doCommands() {
 		if (_vm->_player->_roomNumber == 59 && _selectCommand == kNoctCmdGetTake && hotspotIndex == 3) {
 			_vm->_scripts->_continuenceFlag = true;
 			_vm->_scripts->_continuenceType = 3;
-			error("TODO: Implement room 59 hack from original?");
+			warning("TODO: Implement room 59 hack from original?");
 		}
 
 		if (hotspotIndex < 0) {
@@ -327,11 +327,6 @@ void NoctropolisRoom::mainAreaLClick() {
 	const Common::Point pt = _vm->_events->calcRawMouse();
 	const Screen &screen = *_vm->_screen;
 
-	// TODO: For now just add a move-to point for the player.
-	//Player &player = *_vm->_player;
-	//player._moveTo = pt;
-	//player._playerMove = true;
-
 	//if (_selectCommand == -1) {
 	//	player._moveTo = pt;
 	//	player._playerMove = true;
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index 5010d28b3e5..f12c2c6eadf 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -172,7 +172,7 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 		_vm->quitGame();
 		break;
 	case 18:
-		warning("TODO: End of demo - show upsell screen?");
+		// End of demo
 		vm->doUpsell();
 		_vm->quitGame();
 		break;
diff --git a/engines/access/sound.cpp b/engines/access/sound.cpp
index 651bbfa3ff1..30336f69359 100644
--- a/engines/access/sound.cpp
+++ b/engines/access/sound.cpp
@@ -398,7 +398,7 @@ void MusicManager::midiPlay() {
 		syncVolume();
 		_isPlaying = true;
 	} else {
-		warning("midiPlay() Unexpected signature 0x%08x, expected 'FORM'", magic);
+		warning("midiPlay() Unexpected signature 0x%08x, expected 'FORM', 'BEmd', or 'MThd'", magic);
 		_isPlaying = false;
 	}
 }


Commit: 2ccaf9caa372ca135225b30ab140b7681030a65d
    https://github.com/scummvm/scummvm/commit/2ccaf9caa372ca135225b30ab140b7681030a65d
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix delay in some Noct special functions

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index b3da0e4ee90..dc42389add2 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -729,7 +729,10 @@ void NoctropolisEngine::shotoMeanwhile() {
 	_fonts._fonts[3]->drawString(_screen, meanwhileTxt, Common::Point(100, 200));
 	_screen->fadeIn();
 	_system->updateScreen();
-	_system->delayMillis(180 * 17);
+	_events->_vbCount = 180;
+	while (!shouldQuit() && (_events->_vbCount > 0) && !_events->isKeyActionMousePressed()) {
+		_events->pollEventsAndWait();
+	}
 	_screen->fadeOut();
 	_screen->clearScreen();
 	_screen->_printOrg = _screen->_printStart = Common::Point(300, 300);
@@ -754,7 +757,10 @@ void NoctropolisEngine::showComicCover() {
 	_files->loadScreen(Common::Path("comic93.scn"));
 	_screen->setPalette();
 	_system->updateScreen();
-	_system->delayMillis(300 * 17);
+	_events->_vbCount = 300;
+	while (!shouldQuit() && (_events->_vbCount > 0) && !_events->isKeyActionMousePressed()) {
+		_events->pollEventsAndWait();
+	}
 	_midi->stopSong();
 	_screen->fadeOutThenClearAndSetPal();
 }
@@ -778,7 +784,11 @@ void NoctropolisEngine::playSuccubusAttack() {
 	_files->loadScreen(Common::Path("scene06.scn")); // "DARK/SCENE06.SCN"
 	_screen->fadeIn();
 	_system->updateScreen();
-	_system->delayMillis(60 * 17);
+	_events->_vbCount = 60;
+	while (!shouldQuit() && (_events->_vbCount > 0) && !_events->isKeyActionMousePressed()) {
+		_events->pollEventsAndWait();
+	}
+
 	VideoPlayer_v2 vidPlayer(this);
 
 	vidPlayer.VideoPlayer::setVideo(_screen, Common::Point(118, 118), Common::Path("VID1/SUCATT1.VID"), 0);


Commit: 6f52ecaaa14b32e04bc23c8217abcd6f40468fab
    https://github.com/scummvm/scummvm/commit/6f52ecaaa14b32e04bc23c8217abcd6f40468fab
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix debugger for Noctropolis

Changed paths:
    engines/access/debugger.cpp


diff --git a/engines/access/debugger.cpp b/engines/access/debugger.cpp
index 539a76ecd0b..e063f780be9 100644
--- a/engines/access/debugger.cpp
+++ b/engines/access/debugger.cpp
@@ -23,6 +23,7 @@
 #include "access/access.h"
 #include "access/debugger.h"
 #include "access/amazon/amazon_game.h"
+#include "access/noctropolis/noctropolis_resources.h"
 
 namespace Access {
 
@@ -94,10 +95,10 @@ bool Debugger::Cmd_LoadScene(int argc, const char **argv) {
 	case 2: {
 		int newRoom = strToInt(argv[1]);
 		if (newRoom < 0 || newRoom >= (int)_vm->_res->ROOMTBL.size()) {
-			debugPrintf("Invalid Room Number\n");
+			debugPrintf("Invalid Room Number (only have %d)\n", (int)_vm->_res->ROOMTBL.size());
 			return true;
 		}
-		if (_vm->_res->ROOMTBL[newRoom]._desc.empty()) {
+		if (_vm->_res->ROOMTBL[newRoom]._data.empty()) {
 			debugPrintf("Unused Room Number\n");
 			return true;
 		}
@@ -241,9 +242,21 @@ bool Debugger::Cmd_Travel(int argc, const char **argv) {
 		debugPrintf("Travel table:\n");
 
 		for (int i = 0; i < ARRAYSIZE(_vm->_travel); ++i) {
-			if (!Martian::TRAVDATA[i])
-				break;
-			debugPrintf("%2d: %d (%s)\n", i, _vm->_travel[i], Martian::TRAVDATA[i]);
+			const char *label = "UNKNOWN";
+
+			if (_vm->getGameID() == kGameMartianMemorandum) {
+				if (!Martian::TRAVDATA[i])
+					break;
+			} else if (_vm->getGameID() == kGameNoctropolis) {
+				int j = 0;
+				while (Noctropolis::TRAV_ROOMS[j]) {
+					if (Noctropolis::TRAV_ROOMS[j] == i)
+						label = ((Noctropolis::NoctropolisResources *)_vm->_res)->getPlaceName(j);
+					j++;
+				}
+			}
+
+			debugPrintf("%2d: %d (%s)\n", i, _vm->_travel[i], label);
 		}
 
 		return true;


Commit: 4d7ec40e5c10af65f20ce1bb192087541cd97bb4
    https://github.com/scummvm/scummvm/commit/4d7ec40e5c10af65f20ce1bb192087541cd97bb4
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix Noctropolis end credits

Changed paths:
    engines/access/noctropolis/noctropolis_scripts.cpp
    engines/access/scripts.cpp
    engines/access/video.cpp
    engines/access/video.h


diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index f12c2c6eadf..443fdebf2ea 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -168,7 +168,24 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 		break;
 	case 17:
 		warning("TODO: End of game - add Nightdive credits here for that edition?");
-		// see NoctEndGame::drawer.
+		/*
+		// x, y, fontnum, ?, color
+		PrintStr("NIGHT DIVE STUDIOS IS:",0x15b,0x28,1,0,0xff);
+		PrintStr("EXECUTIVE PRODUCER-",0x15b,0x36,1,0,0xed);
+		PrintStr("STEPHEN KICK",0x1e3,0x44,1,0,0xee);
+		PrintStr("CHIEF ENGINEER-",0x15b,0x52,1,0,0xed);
+		PrintStr("JAMES HALEY",0x1e3,0x60,1,0,0xee);
+		PrintStr("KEX RENDERING TECH-",0x15b,0x6e,1,0,0xed);
+		PrintStr("SAMUEL VILLARREAL",0x1e3,0x7c,1,0,0xee);
+		PrintStr("VIDEO PLAYER-",0x15b,0x8a,1,0,0xed);
+		PrintStr("BRENT ERICKSON",0x1e3,0x98,1,0,0xee);
+		PrintStr("QA LEAD-",0x15b,0xa6,1,0,0xed);
+		PrintStr("DANIEL GRAYSHON",0x1e3,0xb4,1,0,0xee);
+		PrintStr("PLAYTESTING-",0x15b,0xc2,1,0,0xed);
+		PrintStr("SAMUEL VILLARREAL",0x1e3,0xd0,1,0,0xee);
+		PrintStr("TECHNICAL ADVISOR-",0x15b,0xde,1,0,0xed);
+		PrintStr("BRENT ERICKSON",0x1e3,0xec,1,0,0xee);
+		 */
 		_vm->quitGame();
 		break;
 	case 18:
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index d5b8cf7b25a..c3825ca7f43 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -913,11 +913,7 @@ void Scripts::cmdSetVideo_v3() {
 	Common::Path vidpath(_vm->_extraCells[cellIndex]._vidFilename);
 	_vm->_video->setVideo(_vm->_screen, pt, vidpath, 0);
 
-	if (noFrame == 0) {
-		_vm->_screen->BaseSurface::drawBox(pt.x - 1, pt.y - 1, pt.x + _vm->_video->getWidth(), pt.y + _vm->_video->getHeight(), 249);
-		_vm->_screen->BaseSurface::drawBox(pt.x - 2, pt.y - 2, pt.x + _vm->_video->getWidth() + 1, pt.y + _vm->_video->getHeight() + 1, 248);
-		_vm->_screen->BaseSurface::drawBox(pt.x - 3, pt.y - 3, pt.x + _vm->_video->getWidth() + 2, pt.y + _vm->_video->getHeight() + 2, 247);
-	}
+	((VideoPlayer_v2 *)_vm->_video)->setDrawBorder(noFrame == 0);
 
 	if (cellIndex == 1 && roomNum == 0x36)
 		_vm->_screen->setIconPalette();
@@ -1888,6 +1884,15 @@ void Scripts::cmdCopyScnBuf() {
 	debugC(1, kDebugScripts, "cmdCopyScnBuf()");
 
 	// Copy the screen to the buffer, applying windowing offsets
+
+	//
+	// WORKAROUND: This causes double-drawing in the noct credits?
+	// Just skip for now which causes a small graphical glitch after
+	// showing the colored bars video.
+	//
+	if (_vm->_player->_roomNumber == 0x61)
+		return;
+
 	Common::Rect src(_vm->_screen->w, _vm->_screen->h);
 	const Common::Rect screenSize = src;
 	src.translate(_vm->_screen->_windowXAdd, _vm->_screen->_windowYAdd + _vm->_screen->_screenYOff);
diff --git a/engines/access/video.cpp b/engines/access/video.cpp
index b90af59bf73..20e89093037 100644
--- a/engines/access/video.cpp
+++ b/engines/access/video.cpp
@@ -242,7 +242,7 @@ void VideoPlayer_v1::copyVideo() {
 //////////////////////////////////////////////////
 
 VideoPlayer_v2::VideoPlayer_v2(AccessEngine *vm, bool setPal) : VideoPlayer(vm), _audioStream(nullptr),
-_frame(nullptr), _nextFrameTime(0), _setPal(setPal), _startMs(0) {
+_frame(nullptr), _nextFrameTime(0), _setPal(setPal), _startMs(0), _drawBorder(false) {
 }
 
 void VideoPlayer_v2::setVideo(const Common::Point &pt) {
@@ -363,6 +363,14 @@ void VideoPlayer_v2::handleFrameChunk(bool delta, bool skipLines) {
 	debugC(kDebugGraphics, "frameDelay = %d", frameDelay);
 	calcNextFrameTime(frameDelay);
 
+	if (_drawBorder) {
+		Common::Point pt(_vidSurface->_orgX1, _vidSurface->_orgY1);
+		_vidSurface->BaseSurface::drawBox(pt.x - 1, pt.y - 1, pt.x + _vm->_video->getWidth(), pt.y + _vm->_video->getHeight(), 249);
+		_vidSurface->BaseSurface::drawBox(pt.x - 2, pt.y - 2, pt.x + _vm->_video->getWidth() + 1, pt.y + _vm->_video->getHeight() + 1, 248);
+		_vidSurface->BaseSurface::drawBox(pt.x - 3, pt.y - 3, pt.x + _vm->_video->getWidth() + 2, pt.y + _vm->_video->getHeight() + 2, 247);
+		_drawBorder = false;
+	}
+
 	const Common::Rect frameBounds(Common::Point(_vidSurface->_orgX1, _vidSurface->_orgY1), _frame->w, _frame->h);
 	if (_videoFrame == 0 && delta) {
 		// If it's the first frame, grab the background
diff --git a/engines/access/video.h b/engines/access/video.h
index a6f923c697b..11afc220fb4 100644
--- a/engines/access/video.h
+++ b/engines/access/video.h
@@ -136,6 +136,7 @@ private:
 	BaseSurface *_frame;
 	uint32 _nextFrameTime;
 	bool _setPal;
+	bool _drawBorder;
 	uint32 _startMs;
 	uint32 _delayTotal;
 
@@ -170,6 +171,8 @@ public:
 	int getHeight() override { return _header._height; }
 
 	void setVideoPalNow();
+
+	void setDrawBorder(bool drawBorder) { _drawBorder = drawBorder; }
 };
 
 


Commit: 2b5b953f4f4e5e77b8592683f70cf6b07039bd87
    https://github.com/scummvm/scummvm/commit/2b5b953f4f4e5e77b8592683f70cf6b07039bd87
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix Stiletto y offset in Noctropolis

Changed paths:
    engines/access/noctropolis/noctropolis_player.cpp


diff --git a/engines/access/noctropolis/noctropolis_player.cpp b/engines/access/noctropolis/noctropolis_player.cpp
index 1f93d57b90d..a511b61ef72 100644
--- a/engines/access/noctropolis/noctropolis_player.cpp
+++ b/engines/access/noctropolis/noctropolis_player.cpp
@@ -158,7 +158,7 @@ void NoctropolisPlayer::calcManScale1() {
 
 		_vm->_screen->setScaleTable(_vm->_scale);
 		_playerOffset.x = _vm->_screen->_scaleTable1[60];
-		_playerOffset.y = _vm->_screen->_scaleTable1[200];
+		_playerOffset.y = _vm->_screen->_scaleTable1[_isStil ? 180 : 200];
 	} else {
 		_vm->_screen->setScaleTable(_vm->_scale);
 		_playerOffset.x = _vm->_screen->_scaleTable1[6];


Commit: fc58b6862326188382c3b65f4ce20acaa89eaa2a
    https://github.com/scummvm/scummvm/commit/fc58b6862326188382c3b65f4ce20acaa89eaa2a
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix Noctropolis inv scrolling

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_inventory.cpp
    engines/access/noctropolis/noctropolis_inventory.h


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index dc42389add2..e62ac0390c8 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -837,6 +837,8 @@ void NoctropolisEngine::playInventoryStinger() {
 
 	// playSound will not add it to the queue if it's already there.
 	_sound->playSoundByIdent(stingerIdent);
+
+	((NoctropolisInventory *)_inventory)->_topItemIndex = 0;
 }
 
 Common::Error NoctropolisEngine::synchronize(Common::Serializer &s) {
@@ -857,8 +859,10 @@ Common::Error NoctropolisEngine::synchronize(Common::Serializer &s) {
 
 	_stil->synchronize(s);
 
-	if (s.isLoading()) // clear minigame state on load
+	if (s.isLoading()) { // clear minigame state on load
 		initMinigame();
+		((NoctropolisInventory *)_inventory)->_topItemIndex = 0;
+	}
 
 	return result;
 }
diff --git a/engines/access/noctropolis/noctropolis_inventory.cpp b/engines/access/noctropolis/noctropolis_inventory.cpp
index 746928bbfed..e4af7990a6f 100644
--- a/engines/access/noctropolis/noctropolis_inventory.cpp
+++ b/engines/access/noctropolis/noctropolis_inventory.cpp
@@ -94,7 +94,7 @@ int NoctropolisInventory::displayInv() {
 			upArrow = false;
 			downArrow = false;
 
-			if (_startInvItem > 0) {
+			if (_topItemIndex > 0) {
 				upArrow = true;
 				slotItems[slotIndex++] = kUpArrow;
 				slotCount--;
diff --git a/engines/access/noctropolis/noctropolis_inventory.h b/engines/access/noctropolis/noctropolis_inventory.h
index fe3fc3bd765..d0e42b58797 100644
--- a/engines/access/noctropolis/noctropolis_inventory.h
+++ b/engines/access/noctropolis/noctropolis_inventory.h
@@ -34,12 +34,12 @@ public:
 
 	int displayInv() override;
 
+	int _topItemIndex;
+
 private:
 	bool _keepInventoryPosition;
 
 	Common::Point _inventoryBase;
-
-	int _topItemIndex;
 };
 
 } // end namespace Noctropolis


Commit: 27d17566c83d7b695069e8066d9dfaae8df96632
    https://github.com/scummvm/scummvm/commit/27d17566c83d7b695069e8066d9dfaae8df96632
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Add Nightdive credits for Noctropolis

Use the presence of their logo png to decide if we are running that version.

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/noctropolis/noctropolis_game.h
    engines/access/noctropolis/noctropolis_scripts.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index e62ac0390c8..ce1949f41ac 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -841,6 +841,53 @@ void NoctropolisEngine::playInventoryStinger() {
 	((NoctropolisInventory *)_inventory)->_topItemIndex = 0;
 }
 
+void NoctropolisEngine::showNightdiveCredits() {
+	const Font *font = _fonts.getFont(1);
+
+	const Common::Path nightDive("DARK/nds.png");
+	if (!Common::File().exists(nightDive))
+		return;
+
+	_events->clearEvents();
+	_screen->fillRect(Common::Rect(345, 0, 640, 400), 0);
+
+	Font::_fontColors[1] = 0xff;
+	font->drawString(_screen, "NIGHT DIVE STUDIOS IS:", Common::Point(0x15b, 0x28));
+	Font::_fontColors[1] = 0xed;
+	font->drawString(_screen, "EXECUTIVE PRODUCER-", Common::Point(0x15b, 0x36));
+	Font::_fontColors[1] = 0xee;
+	font->drawString(_screen, "STEPHEN KICK", Common::Point(0x1e3, 0x44));
+	Font::_fontColors[1] = 0xed;
+	font->drawString(_screen, "CHIEF ENGINEER-", Common::Point(0x15b, 0x52));
+	Font::_fontColors[1] = 0xee;
+	font->drawString(_screen, "JAMES HALEY", Common::Point(0x1e3, 0x60));
+	Font::_fontColors[1] = 0xed;
+	font->drawString(_screen, "KEX RENDERING TECH-", Common::Point(0x15b, 0x6e));
+	Font::_fontColors[1] = 0xee;
+	font->drawString(_screen, "SAMUEL VILLARREAL", Common::Point(0x1e3, 0x7c));
+	Font::_fontColors[1] = 0xed;
+	font->drawString(_screen, "VIDEO PLAYER-", Common::Point(0x15b, 0x8a));
+	Font::_fontColors[1] = 0xee;
+	font->drawString(_screen, "BRENT ERICKSON", Common::Point(0x1e3, 0x98));
+	Font::_fontColors[1] = 0xed;
+	font->drawString(_screen, "QA LEAD-", Common::Point(0x15b, 0xa6));
+	Font::_fontColors[1] = 0xee;
+	font->drawString(_screen, "DANIEL GRAYSHON", Common::Point(0x1e3, 0xb4));
+	Font::_fontColors[1] = 0xed;
+	font->drawString(_screen, "PLAYTESTING-", Common::Point(0x15b, 0xc2));
+	Font::_fontColors[1] = 0xee;
+	font->drawString(_screen, "SAMUEL VILLARREAL", Common::Point(0x1e3, 0xd0));
+	Font::_fontColors[1] = 0xed;
+	font->drawString(_screen, "TECHNICAL ADVISOR-", Common::Point(0x15b, 0xde));
+	Font::_fontColors[1] = 0xee;
+	font->drawString(_screen, "BRENT ERICKSON", Common::Point(0x1e3, 0xec));
+
+	_events->_vbCount = 7200;
+	while (!shouldQuit() && (_events->_vbCount > 0) && !_events->isKeyActionMousePressed()) {
+		_events->pollEventsAndWait();
+	}
+}
+
 Common::Error NoctropolisEngine::synchronize(Common::Serializer &s) {
 	Common::Error result = AccessEngine::synchronize(s);
 
diff --git a/engines/access/noctropolis/noctropolis_game.h b/engines/access/noctropolis/noctropolis_game.h
index 5bfd5cb6c17..badb490bc83 100644
--- a/engines/access/noctropolis/noctropolis_game.h
+++ b/engines/access/noctropolis/noctropolis_game.h
@@ -91,6 +91,7 @@ public:
 	void doLastComic();
 	void doSpecialComic();
 	void doUpsell();
+	void showNightdiveCredits();
 
 	/** Play SFX for item added to inv, debounced */
 	void playInventoryStinger();
diff --git a/engines/access/noctropolis/noctropolis_scripts.cpp b/engines/access/noctropolis/noctropolis_scripts.cpp
index 443fdebf2ea..0b49f02ea04 100644
--- a/engines/access/noctropolis/noctropolis_scripts.cpp
+++ b/engines/access/noctropolis/noctropolis_scripts.cpp
@@ -167,26 +167,8 @@ bool NoctropolisScripts::executeSpecial(int commandIndex, int param1, int param2
 		((VideoPlayer_v2 *)_vm->_video)->setVideoPalNow();
 		break;
 	case 17:
-		warning("TODO: End of game - add Nightdive credits here for that edition?");
-		/*
-		// x, y, fontnum, ?, color
-		PrintStr("NIGHT DIVE STUDIOS IS:",0x15b,0x28,1,0,0xff);
-		PrintStr("EXECUTIVE PRODUCER-",0x15b,0x36,1,0,0xed);
-		PrintStr("STEPHEN KICK",0x1e3,0x44,1,0,0xee);
-		PrintStr("CHIEF ENGINEER-",0x15b,0x52,1,0,0xed);
-		PrintStr("JAMES HALEY",0x1e3,0x60,1,0,0xee);
-		PrintStr("KEX RENDERING TECH-",0x15b,0x6e,1,0,0xed);
-		PrintStr("SAMUEL VILLARREAL",0x1e3,0x7c,1,0,0xee);
-		PrintStr("VIDEO PLAYER-",0x15b,0x8a,1,0,0xed);
-		PrintStr("BRENT ERICKSON",0x1e3,0x98,1,0,0xee);
-		PrintStr("QA LEAD-",0x15b,0xa6,1,0,0xed);
-		PrintStr("DANIEL GRAYSHON",0x1e3,0xb4,1,0,0xee);
-		PrintStr("PLAYTESTING-",0x15b,0xc2,1,0,0xed);
-		PrintStr("SAMUEL VILLARREAL",0x1e3,0xd0,1,0,0xee);
-		PrintStr("TECHNICAL ADVISOR-",0x15b,0xde,1,0,0xed);
-		PrintStr("BRENT ERICKSON",0x1e3,0xec,1,0,0xee);
-		 */
-		_vm->quitGame();
+		vm->showNightdiveCredits();
+		_vm->_restartFl = true;
 		break;
 	case 18:
 		// End of demo


Commit: 3018522b20e517a03db37fa7566d906af45514c8
    https://github.com/scummvm/scummvm/commit/3018522b20e517a03db37fa7566d906af45514c8
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2026-05-23T15:21:13+10:00

Commit Message:
ACCESS: Fix paths for Noctropolis demo

Changed paths:
    engines/access/noctropolis/noctropolis_game.cpp
    engines/access/scripts.cpp


diff --git a/engines/access/noctropolis/noctropolis_game.cpp b/engines/access/noctropolis/noctropolis_game.cpp
index ce1949f41ac..4c9d6f1eb79 100644
--- a/engines/access/noctropolis/noctropolis_game.cpp
+++ b/engines/access/noctropolis/noctropolis_game.cpp
@@ -186,7 +186,7 @@ Common::Error NoctropolisEngine::loadGameState(int slot) {
 void NoctropolisEngine::doFlashLogo() {
 	_events->hideCursor();
 
-	_files->loadScreen(Common::Path("DARK/FLASH.SCN"));
+	_files->loadScreen(Common::Path("FLASH.SCN"));
 	_screen->fadeIn();
 	if (shouldQuit())
 		return;
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index c3825ca7f43..047c60b242b 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -911,6 +911,12 @@ void Scripts::cmdSetVideo_v3() {
 	debugC(1, kDebugScripts, "cmdSetVideo_v3(x=%d, y=%d, cellIndex=%d, noFrame=%d)", pt.x, pt.y, cellIndex, noFrame);
 
 	Common::Path vidpath(_vm->_extraCells[cellIndex]._vidFilename);
+	if (!_vm->_files->existFile(vidpath)) {
+		// Try removing "DARK/" from video file names -
+		// for the demo the are in DEMO/
+		Common::StringArray parts = vidpath.splitComponents();
+		vidpath = Common::Path::joinComponents(parts.begin() + 1, parts.end());
+	}
 	_vm->_video->setVideo(_vm->_screen, pt, vidpath, 0);
 
 	((VideoPlayer_v2 *)_vm->_video)->setDrawBorder(noFrame == 0);




More information about the Scummvm-git-logs mailing list