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

sev- noreply at scummvm.org
Sun Sep 29 21:57:07 UTC 2024


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

Summary:
15ec51401f Darkseed: Added tostext. starting on Img file loading.
c0003007cc Darkseed: More work on title sequence
a005efba6b DARKSEED: Added support for loading PIC files
41ca7522fb DARKSEED: Added support for loading NSP files
82e4d5f2d9 DARKSEED: Added basic room and cursor support
416f1050ff DARKSEED: Change rooms by left clicking while in pointer mode.
bfec4f80c8 DARKSEED: Add logic for determining walkable locations in each room
1e658f7ef0 DARKSEED: Add start of in-game text console.
86dc3f5b60 DARKSEED: Started work on animations. Added start of Player class.
f0ce43dec1 DARKSEED: Work on player animations. Added initial bed wake animation.
78739f4563 DARKSEED: Work on logic to handle player direction changes
d3eb5abf3c DARKSEED: Work on player movement logic.
dc7d9c5bf5 DARKSEED: Continuing with player movement logic.
3d92aeb93f DARKSEED: Working on room transition animations
a41b814468 DARKSEED: Added basic support for sprite scaling.
a355322e62 DARKSEED: Player walking around.
2f390ada9a DARKSEED: More progress on player walking.
3eaca56265 DARKSEED: Started adding support for CD versions
a031bf341b DARKSEED: Added `dt` debug command. Print day and time.
1cc274a3a3 DARKSEED: Adding console support.
ed2647fd78 DARKSEED: fixing build config
ae283b9e74 DARKSEED: Started to add object and invetory logic.
5ff6bf8d27 DARKSEED: Lock game logic to 10fps
802526b304 DARKSEED: Cursor hotspot updates
3bd3f14916 DARKSEED: Work on non-pointer cursor logic.
b62b638f90 DARKSEED: Added basic support for look code.
cc96f636de DARKSEED: More work on player pathfinding.
7f5cf5527f DARKSEED: Fixed spinning in a circle bug.
b1798d9b1b DARKSEED: Working on pathfinding
d131a15c29 DARKSEED: Fix pathfinder closest connector logic
a0f47c00d3 DARKSEED: debug added enablePathfinderOverlay to toggle the pathfinder debug overlay.
5d2fc92702 DARKSEED: Handle unreachable walk target
3fd44bdcb5 DARKSEED: Adding more room exit animations.
699e7f5878 DARKSEED: Finished adding room exit animations.
19650c0f5a DARKSEED: More animations added.
98fe3b9753 DARKSEED: Climb ladder to attic.
0a5a2ef7a8 DARKSEED: Added more look code.
549fcb67a5 DARKSEED: Working on displaying inventory icon bar
b1838a2888 DARKSEED: Inventory look code.
1a54d467c3 DARKSEED: Inventory holding objects.
d550896b31 DARKSEED: more useCode. phones.
c295f3822e DARKSEED: more useCode.
c876cb3711 DARKSEED: more useCode.
91fdc1d241 DARKSEED: more useCode.
018631b46f DARKSEED: Added trunk push logic
c655cb8afa DARKSEED: Work on room object sprites.
47bddde6d7 DARKSEED: Work on room object sprites.
b9dd57b0a8 DARKSEED: Open/close cupboards and oven.
b3965fd5e3 DARKSEED: Room entry animations.
6bd58ba338 DARKSEED: Update engine to latest master
edb1e15c89 DARKSEED: Update engine to latest master
6a28ff5244 DARKSEED: Added load/save support.
abd1c13893 DARKSEED: Fixups for sprite display ordering
d88e8fde66 DARKSEED: Fixed gloves showing when glovebox is closed
493040388b DARKSEED: Fixed bug which blocked picking up moveable objects
c0ad8d5639 DARKSEED: Added player animation 11 descending left ladder
464fba54fe DARKSEED: Remove picked up inventory from room when loading. Added inventory debug commands. Use money, use gloves, use 
e591f3a018 DARKSEED: Added more animation display logic
86c595b997 DARKSEED: Fixed ability to walk out onto balcony from attic after moving trunk.
d29bc6ba97 DARKSEED: Added more room loading code.
d5f539e68f DARKSEED: Fix palette on fullscreen pictures.
2e06803206 DARKSEED: print headache strings. Added day change logic.
ca96c7688f DARKSEED: start updating game time.
09d06fc879 DARKSEED: Darken sky. Close shops. Jail logic.
94cbe6334e DARKSEED: More usecode logic.
366112c6a4 DARKSEED: Started on runObjects()
4b973da7c8 DARKSEED: More work on delbert shop scene
0430f35a0a DARKSEED: Added speech. More work on delbert shop scene.
806f46025b DARKSEED: Added more logic to runObjects()
0b8d8c4e0c DARKSEED: Added changeDay debug command
62b63d0f83 DARKSEED: Delbert stick throwing logic.
82944a78bd DARKSEED: Cop outside house logic
b67718dcc0 DARKSEED: Added phone ring logic
7b4816b7c0 DARKSEED: Package delivery logic.
9ece6e77b1 DARKSEED: Move usecode logic into UseCode class.
37d64ef80f DARKSEED: Moved usecode tos lookup tables into seperate header file. Added usecode for newspaper (unused) and library ca
d3f80d0a02 DARKSEED: Add librarian sequence
6c4649fc13 DARKSEED: Add bobbypin, keys, mirrorShard, binoculars and shovel usecode
4119841620 DARKSEED: Add grave dig animation
7211faddaf DARKSEED: Add delberts card usecode
ecadd5963c DARKSEED: Add stick usecode. Mike throws stick
e0cd7f0d1d DARKSEED: Add remaining usecode functions.
29ce8a33d0 DARKSEED: Smash mirror
63556af54c DARKSEED: power nexus animation, assemble special hammer
57ff313e96 DARKSEED: Fix climbing up rope.
ad5871a5ee DARKSEED: Fix leaving car and bookshelf rooms
c008ca5410 DARKSEED: Replace hex values
9f6a545b1e DARKSEED: Walk to bed logic
c5ff265a18 DARKSEED: Don't allow input while walking to bed
d785239f9a DARKSEED: Cleaned up todo comments. Added look generic call.
febbea2f38 DARKSEED: Generic response logic
204cfef580 DARKSEED: Work on human world jail logic
6b80d4fedb DARKSEED: Replaced isAnimFinished_maybe with _ObjRestarted now shared with location sprites.
81882bddae DARKSEED: Replaced animFrameChanged with _FrameAdvanced. Clipped stair walking animation.
85e165b43b DARKSEED: Added dirty draw support for inventory.
6078023b07 DARKSEED: Get out of jail. Room palette updates.
28adeda3ef DARKSEED: Hack to show tin cup in jail cell.
9fe3f9c398 DARKSEED: Palette swap fixes.
e5eeffe8e0 DARKSEED: Add keeper, sargo and dcop anim sequences.
031c077331 DARKSEED: Add room change to exit dark world after ship has left.
514c9d4fe9 DARKSEED: redraw inventory when item removed.
2f77fedad0 DARKSEED: Move cutscene logic into own class.
ed39fa92bb DARKSEED: Title sequence cutscene.
f65e04332c DARKSEED: Title sequence animation + credits
e12f67ab1a DARKSEED: Title sequence animation + credits
7a161b08c9 DARKSEED: Title sequence animation embryo insertion
7d6104d0f9 DARKSEED: Ship launch sequence
336bb12700 DARKSEED: Alien born sequence
c0431bae72 DARKSEED: Fix path on engine include files
2c713eb41c DARKSEED: CHORE: Fix namespace for math
83ed789d39 DARKSEED: Whitespace fixes
96f0240835 DARKSEED: Add missing newline at end of files
d52cb0514e DARKSEED: Fix Signed vs. Unsigned Comparison GCC Compiler Warnings
362b01e1b0 DARKSEED: Fix class variable naming
6383e97ae0 DARKSEED: Use Common::StringArray
fd18088186 DARKSEED: Fix capitalisation on class variable names
0b6ce225a1 DARKSEED: Fix compiler warnings
9e4e320412 DARKSEED: Mark engine as highres
9eb352867c DARKSEED: Fix namespace scope for cpp files
5eb4d27120 DARKSEED: Formatting
769d965979 DARKSEED: Move core animation logic into its own class
fb2238ecd9 DARKSEED: Move fullscreen animations into Animation class
b8e571a0ea DARKSEED: Fix whitespace in some case statements.
4f55a0a223 DARKSEED: Fix array formatting, clean up some types. Added better implementation of array reverse.
7082c41de3 DARKSEED: Fix naming for style guide
f3ec14a93f DARKSEED: Sort module.mk alphabetically
49b69cd5b1 DARKSEED: Rename ActionMode values to respect style convention. Remove unnecessary includes. Use typedefs
a91b50f4f7 DARKSEED: Change GameFont to extend Graphics::Font
1608d38018 DARKSEED: Add early returns to input logic to simplify conditional nesting.
d764ca35f5 DARKSEED: Whitespace fixes


Commit: 15ec51401f24f86d689a4d845b86db98a7a88a24
    https://github.com/scummvm/scummvm/commit/15ec51401f24f86d689a4d845b86db98a7a88a24
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
Darkseed: Added tostext. starting on Img file loading.

Changed paths:
  A engines/darkseed/POTFILES
  A engines/darkseed/configure.engine
  A engines/darkseed/console.cpp
  A engines/darkseed/console.h
  A engines/darkseed/credits.pl
  A engines/darkseed/darkseed.cpp
  A engines/darkseed/darkseed.h
  A engines/darkseed/detection.cpp
  A engines/darkseed/detection.h
  A engines/darkseed/detection_tables.h
  A engines/darkseed/img.cpp
  A engines/darkseed/img.h
  A engines/darkseed/metaengine.cpp
  A engines/darkseed/metaengine.h
  A engines/darkseed/module.mk
  A engines/darkseed/tostext.cpp
  A engines/darkseed/tostext.h


diff --git a/engines/darkseed/POTFILES b/engines/darkseed/POTFILES
new file mode 100644
index 00000000000..a6633d68eee
--- /dev/null
+++ b/engines/darkseed/POTFILES
@@ -0,0 +1 @@
+engines/darkseed/metaengine.cpp
diff --git a/engines/darkseed/configure.engine b/engines/darkseed/configure.engine
new file mode 100644
index 00000000000..eb577f095c0
--- /dev/null
+++ b/engines/darkseed/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine darkseed "Darkseed" no "" "" ""
diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
new file mode 100644
index 00000000000..3b461625697
--- /dev/null
+++ b/engines/darkseed/console.cpp
@@ -0,0 +1,48 @@
+/* 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 "darkseed/console.h"
+
+namespace Darkseed {
+
+Console::Console(TosText *tosText) : GUI::Debugger(), tosText(tosText) {
+	registerCmd("tostext",   WRAP_METHOD(Console, Cmd_tostext));
+}
+
+Console::~Console() {
+}
+
+bool Console::Cmd_tostext(int argc, const char **argv) {
+	if (argc != 2) {
+		debugPrintf("Usage: tostext <index>\n");
+		return true;
+	}
+
+	uint16 textIdx = atoi(argv[1]);
+	if (textIdx < tosText->getNumEntries()) {
+		debugPrintf("%s\n", tosText->getText(textIdx).c_str());
+	} else {
+		debugPrintf("index too large!\n");
+	}
+	return true;
+}
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
new file mode 100644
index 00000000000..59134f1ded9
--- /dev/null
+++ b/engines/darkseed/console.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 DARKSEED_CONSOLE_H
+#define DARKSEED_CONSOLE_H
+
+#include "gui/debugger.h"
+#include "tostext.h"
+
+namespace Darkseed {
+
+class Console : public GUI::Debugger {
+private:
+	TosText *tosText;
+private:
+	bool Cmd_tostext(int argc, const char **argv);
+public:
+	Console(TosText *tostext);
+	~Console() override;
+};
+
+} // End of namespace Darkseed
+
+#endif // DARKSEED_CONSOLE_H
diff --git a/engines/darkseed/credits.pl b/engines/darkseed/credits.pl
new file mode 100644
index 00000000000..d87b4ed20e0
--- /dev/null
+++ b/engines/darkseed/credits.pl
@@ -0,0 +1,3 @@
+begin_section("Darkseed");
+	add_person("Eric Fry", "Yuv422", "");
+end_section();
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
new file mode 100644
index 00000000000..b76b35a8c33
--- /dev/null
+++ b/engines/darkseed/darkseed.cpp
@@ -0,0 +1,112 @@
+/* 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 "darkseed/darkseed.h"
+#include "common/config-manager.h"
+#include "common/debug-channels.h"
+#include "common/events.h"
+#include "common/scummsys.h"
+#include "common/system.h"
+#include "darkseed/console.h"
+#include "darkseed/detection.h"
+#include "engines/util.h"
+#include "graphics/palette.h"
+#include "img.h"
+
+namespace Darkseed {
+
+DarkseedEngine *g_engine;
+
+DarkseedEngine::DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engine(syst),
+	_gameDescription(gameDesc), _randomSource("Darkseed") {
+	g_engine = this;
+}
+
+DarkseedEngine::~DarkseedEngine() {
+	delete _screen;
+}
+
+uint32 DarkseedEngine::getFeatures() const {
+	return _gameDescription->flags;
+}
+
+Common::String DarkseedEngine::getGameId() const {
+	return _gameDescription->gameId;
+}
+
+Common::Error DarkseedEngine::run() {
+	// Initialize 320x200 paletted graphics mode
+	initGraphics(640, 350);
+	_screen = new Graphics::Screen();
+	_tosText = new TosText();
+	_tosText->load();
+	Img img;
+	img.load("art/left00.img");
+
+	// Set the engine's debugger console
+	setDebugger(new Console(_tosText));
+
+	// If a savegame was selected from the launcher, load it
+	int saveSlot = ConfMan.getInt("save_slot");
+	if (saveSlot != -1)
+		(void)loadGameState(saveSlot);
+
+	// Draw a series of boxes on screen as a sample
+	for (int i = 0; i < 100; ++i)
+		_screen->frameRect(Common::Rect(i, i, 320 - i, 200 - i), i);
+	_screen->update();
+
+	// Simple event handling loop
+	byte pal[256 * 3] = { 0 };
+	Common::Event e;
+	int offset = 0;
+
+	while (!shouldQuit()) {
+		while (g_system->getEventManager()->pollEvent(e)) {
+		}
+
+		// Cycle through a simple palette
+		++offset;
+		for (int i = 0; i < 256; ++i)
+			pal[i * 3 + 1] = (i + offset) % 256;
+		g_system->getPaletteManager()->setPalette(pal, 0, 256);
+		_screen->update();
+
+		// Delay for a bit. All events loops should have a delay
+		// to prevent the system being unduly loaded
+		g_system->delayMillis(10);
+	}
+
+	return Common::kNoError;
+}
+
+Common::Error DarkseedEngine::syncGame(Common::Serializer &s) {
+	// The Serializer has methods isLoading() and isSaving()
+	// if you need to specific steps; for example setting
+	// an array size after reading it's length, whereas
+	// for saving it would write the existing array's length
+	int dummy = 0;
+	s.syncAsUint32LE(dummy);
+
+	return Common::kNoError;
+}
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
new file mode 100644
index 00000000000..ad8cc1cf649
--- /dev/null
+++ b/engines/darkseed/darkseed.h
@@ -0,0 +1,107 @@
+/* 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 DARKSEED_H
+#define DARKSEED_H
+
+#include "common/scummsys.h"
+#include "common/system.h"
+#include "common/error.h"
+#include "common/fs.h"
+#include "common/hash-str.h"
+#include "common/random.h"
+#include "common/serializer.h"
+#include "common/util.h"
+#include "engines/engine.h"
+#include "engines/savestate.h"
+#include "graphics/screen.h"
+
+#include "darkseed/detection.h"
+#include "tostext.h"
+
+namespace Darkseed {
+
+struct DarkseedGameDescription;
+
+class DarkseedEngine : public Engine {
+private:
+	const ADGameDescription *_gameDescription;
+	Common::RandomSource _randomSource;
+protected:
+	// Engine APIs
+	Common::Error run() override;
+public:
+	Graphics::Screen *_screen = nullptr;
+	TosText *_tosText = nullptr;
+public:
+	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
+	~DarkseedEngine() override;
+
+	uint32 getFeatures() const;
+
+	/**
+	 * Returns the game Id
+	 */
+	Common::String getGameId() const;
+
+	/**
+	 * Gets a random number
+	 */
+	uint32 getRandomNumber(uint maxNum) {
+		return _randomSource.getRandomNumber(maxNum);
+	}
+
+	bool hasFeature(EngineFeature f) const override {
+		return
+		    (f == kSupportsLoadingDuringRuntime) ||
+		    (f == kSupportsSavingDuringRuntime) ||
+		    (f == kSupportsReturnToLauncher);
+	};
+
+	bool canLoadGameStateCurrently() override {
+		return true;
+	}
+	bool canSaveGameStateCurrently() override {
+		return true;
+	}
+
+	/**
+	 * Uses a serializer to allow implementing savegame
+	 * loading and saving using a single method
+	 */
+	Common::Error syncGame(Common::Serializer &s);
+
+	Common::Error saveGameStream(Common::WriteStream *stream, bool isAutosave = false) override {
+		Common::Serializer s(nullptr, stream);
+		return syncGame(s);
+	}
+	Common::Error loadGameStream(Common::SeekableReadStream *stream) override {
+		Common::Serializer s(stream, nullptr);
+		return syncGame(s);
+	}
+};
+
+extern DarkseedEngine *g_engine;
+#define SHOULD_QUIT ::Darkseed::g_engine->shouldQuit()
+
+} // End of namespace Darkseed
+
+#endif // DARKSEED_H
diff --git a/engines/darkseed/detection.cpp b/engines/darkseed/detection.cpp
new file mode 100644
index 00000000000..c7231b07a0b
--- /dev/null
+++ b/engines/darkseed/detection.cpp
@@ -0,0 +1,45 @@
+/* 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 "base/plugins.h"
+#include "common/config-manager.h"
+#include "common/file.h"
+#include "common/md5.h"
+#include "common/str-array.h"
+#include "common/translation.h"
+#include "common/util.h"
+#include "darkseed/detection.h"
+#include "darkseed/detection_tables.h"
+
+const DebugChannelDef DarkseedMetaEngineDetection::debugFlagList[] = {
+	{ Darkseed::kDebugGraphics, "Graphics", "Graphics debug level" },
+	{ Darkseed::kDebugPath, "Path", "Pathfinding debug level" },
+	{ Darkseed::kDebugFilePath, "FilePath", "File path debug level" },
+	{ Darkseed::kDebugScan, "Scan", "Scan for unrecognised games" },
+	{ Darkseed::kDebugScript, "Script", "Enable debug script dump" },
+	DEBUG_CHANNEL_END
+};
+
+DarkseedMetaEngineDetection::DarkseedMetaEngineDetection() : AdvancedMetaEngineDetection(Darkseed::gameDescriptions,
+	sizeof(ADGameDescription), Darkseed::darkseedGames) {
+}
+
+REGISTER_PLUGIN_STATIC(DARKSEED_DETECTION, PLUGIN_TYPE_ENGINE_DETECTION, DarkseedMetaEngineDetection);
diff --git a/engines/darkseed/detection.h b/engines/darkseed/detection.h
new file mode 100644
index 00000000000..16d77abdb30
--- /dev/null
+++ b/engines/darkseed/detection.h
@@ -0,0 +1,69 @@
+/* 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 DARKSEED_DETECTION_H
+#define DARKSEED_DETECTION_H
+
+#include "engines/advancedDetector.h"
+
+namespace Darkseed {
+
+enum DarkseedDebugChannels {
+	kDebugGraphics = 1 << 0,
+	kDebugPath     = 1 << 1,
+	kDebugScan     = 1 << 2,
+	kDebugFilePath = 1 << 3,
+	kDebugScript   = 1 << 4,
+};
+
+extern const PlainGameDescriptor darkseedGames[];
+
+extern const ADGameDescription gameDescriptions[];
+
+#define GAMEOPTION_ORIGINAL_SAVELOAD GUIO_GAMEOPTIONS1
+
+} // End of namespace Darkseed
+
+class DarkseedMetaEngineDetection : public AdvancedMetaEngineDetection {
+	static const DebugChannelDef debugFlagList[];
+
+public:
+	DarkseedMetaEngineDetection();
+	~DarkseedMetaEngineDetection() override {}
+
+	const char *getName() const override {
+		return "darkseed";
+	}
+
+	const char *getEngineName() const override {
+		return "Darkseed";
+	}
+
+	const char *getOriginalCopyright() const override {
+		return "(C) 1992 CYBERDREAMS, INC.";
+	}
+
+	const DebugChannelDef *getDebugChannels() const override {
+		return debugFlagList;
+	}
+};
+
+#endif // DARKSEED_DETECTION_H
diff --git a/engines/darkseed/detection_tables.h b/engines/darkseed/detection_tables.h
new file mode 100644
index 00000000000..15d37fa10ef
--- /dev/null
+++ b/engines/darkseed/detection_tables.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/>.
+ *
+ */
+
+namespace Darkseed {
+
+const PlainGameDescriptor darkseedGames[] = {
+	{ "darkseed", "Darkseed" },
+	{ 0, 0 }
+};
+
+const ADGameDescription gameDescriptions[] = {
+	{
+		"darkseed",
+		nullptr,
+		AD_ENTRY1s("TOS.EXE", "e20ca609f2acb623e0076ef2288673b2", 147016),
+		Common::EN_ANY,
+		Common::kPlatformDOS,
+		ADGF_UNSTABLE,
+		GUIO1(GUIO_NONE)
+	},
+
+	AD_TABLE_END_MARKER
+};
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/img.cpp b/engines/darkseed/img.cpp
new file mode 100644
index 00000000000..291b99f1eb8
--- /dev/null
+++ b/engines/darkseed/img.cpp
@@ -0,0 +1,63 @@
+/* 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 "img.h"
+#include "common/file.h"
+
+namespace Darkseed {
+
+bool Img::load(const Common::String &filename) {
+	Common::File file;
+	if(!file.open(filename)) {
+		return false;
+	}
+	int fIdx = 0;
+	uint16 size = file.readUint16LE();
+	fIdx += 2;
+	uint16 idx = 0;
+	pixels.resize(size+1);
+
+	while (idx <= size) {
+		uint8 byte = file.readByte();
+		assert(!file.err());
+		fIdx++;
+		if (byte & 0x80) {
+			uint8 count = byte & 0x7f;
+			count++;
+			byte = file.readByte();
+			fIdx++;
+			for (int i = 0; i < count; i++) {
+				pixels[idx + i] = byte;
+			}
+			idx += count;
+		} else {
+			uint8 count = byte + 1;
+			for (int i = 0; i < count; i++) {
+				pixels[idx + i] = file.readByte();
+				fIdx++;
+			}
+			idx += count;
+		}
+	}
+	return true;
+}
+
+} // namespace Darkseed
\ No newline at end of file
diff --git a/engines/darkseed/img.h b/engines/darkseed/img.h
new file mode 100644
index 00000000000..117703581d5
--- /dev/null
+++ b/engines/darkseed/img.h
@@ -0,0 +1,38 @@
+/* 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 DARKSEED_IMG_H
+#define DARKSEED_IMG_H
+
+#include "common/array.h"
+#include "common/scummsys.h"
+namespace Darkseed {
+
+class Img {
+private:
+	Common::Array<uint8> pixels;
+public:
+	bool load(const Common::String &filename);
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_IMG_H
diff --git a/engines/darkseed/metaengine.cpp b/engines/darkseed/metaengine.cpp
new file mode 100644
index 00000000000..38951c71bb2
--- /dev/null
+++ b/engines/darkseed/metaengine.cpp
@@ -0,0 +1,69 @@
+/* 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/translation.h"
+
+#include "darkseed/metaengine.h"
+#include "darkseed/detection.h"
+#include "darkseed/darkseed.h"
+
+namespace Darkseed {
+
+static const ADExtraGuiOptionsMap optionsList[] = {
+	{
+		GAMEOPTION_ORIGINAL_SAVELOAD,
+		{
+			_s("Use original save/load screens"),
+			_s("Use the original save/load screens instead of the ScummVM ones"),
+			"original_menus",
+			false,
+			0,
+			0
+		}
+	},
+	AD_EXTRA_GUI_OPTIONS_TERMINATOR
+};
+
+} // End of namespace Darkseed
+
+const char *DarkseedMetaEngine::getName() const {
+	return "darkseed";
+}
+
+const ADExtraGuiOptionsMap *DarkseedMetaEngine::getAdvancedExtraGuiOptions() const {
+	return Darkseed::optionsList;
+}
+
+Common::Error DarkseedMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
+	*engine = new Darkseed::DarkseedEngine(syst, desc);
+	return Common::kNoError;
+}
+
+bool DarkseedMetaEngine::hasFeature(MetaEngineFeature f) const {
+	return checkExtendedSaves(f) ||
+		(f == kSupportsLoadingDuringStartup);
+}
+
+#if PLUGIN_ENABLED_DYNAMIC(DARKSEED)
+REGISTER_PLUGIN_DYNAMIC(DARKSEED, PLUGIN_TYPE_ENGINE, DarkseedMetaEngine);
+#else
+REGISTER_PLUGIN_STATIC(DARKSEED, PLUGIN_TYPE_ENGINE, DarkseedMetaEngine);
+#endif
diff --git a/engines/darkseed/metaengine.h b/engines/darkseed/metaengine.h
new file mode 100644
index 00000000000..05a22abbb60
--- /dev/null
+++ b/engines/darkseed/metaengine.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 DARKSEED_METAENGINE_H
+#define DARKSEED_METAENGINE_H
+
+#include "engines/advancedDetector.h"
+
+class DarkseedMetaEngine : public AdvancedMetaEngine {
+public:
+	const char *getName() const override;
+
+	Common::Error createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const override;
+
+	/**
+	 * Determine whether the engine supports the specified MetaEngine feature.
+	 *
+	 * Used by e.g. the launcher to determine whether to enable the Load button.
+	 */
+	bool hasFeature(MetaEngineFeature f) const override;
+
+	const ADExtraGuiOptionsMap *getAdvancedExtraGuiOptions() const override;
+};
+
+#endif // DARKSEED_METAENGINE_H
diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
new file mode 100644
index 00000000000..2fe690db580
--- /dev/null
+++ b/engines/darkseed/module.mk
@@ -0,0 +1,17 @@
+MODULE := engines/darkseed
+
+MODULE_OBJS = \
+	darkseed.o \
+	console.o \
+	metaengine.o
+
+# This module can be built as a plugin
+ifeq ($(ENABLE_DARKSEED), DYNAMIC_PLUGIN)
+PLUGIN := 1
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk
+
+# Detection objects
+DETECT_OBJS += $(MODULE)/detection.o
diff --git a/engines/darkseed/tostext.cpp b/engines/darkseed/tostext.cpp
new file mode 100644
index 00000000000..a8e6a742d49
--- /dev/null
+++ b/engines/darkseed/tostext.cpp
@@ -0,0 +1,65 @@
+
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 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 "tostext.h"
+#include "common/file.h"
+
+namespace Darkseed {
+
+bool TosText::load() {
+	Common::File tostextFile;
+	if(!tostextFile.open("tostext.bin")) {
+		return false;
+	}
+	numEntries = tostextFile.readUint16LE() / 2;
+	textArray.resize(numEntries);
+
+	for (int i = 0; i < numEntries; i++) {
+		textArray[i] = loadString(tostextFile, i);
+	}
+	return true;
+}
+
+const Common::String &TosText::getText(uint16 textIndex) {
+	assert(textIndex < numEntries);
+	return textArray[textIndex];
+}
+
+Common::String TosText::loadString(Common::File &file, uint16 index) const {
+	Common::String str;
+	file.seek(index * 2, SEEK_SET);
+	auto startOffset = file.readUint16LE();
+	uint16 strLen = index == numEntries - 1
+						? file.size() - startOffset
+						: file.readUint16LE() - startOffset;
+	file.seek(startOffset, SEEK_SET);
+	for (int i = 0; i < strLen; i++) {
+		str += (char)file.readByte();
+	}
+	return str;
+}
+
+uint16 TosText::getNumEntries() const {
+	return numEntries;
+}
+
+} // namespace Darkseed
\ No newline at end of file
diff --git a/engines/darkseed/tostext.h b/engines/darkseed/tostext.h
new file mode 100644
index 00000000000..17f31a2e835
--- /dev/null
+++ b/engines/darkseed/tostext.h
@@ -0,0 +1,49 @@
+
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 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 DARKSEED_TOSTEXT_H
+#define DARKSEED_TOSTEXT_H
+
+#include "common/array.h"
+#include "common/file.h"
+#include "common/str.h"
+
+namespace Darkseed {
+
+class TosText {
+private:
+	Common::Array<Common::String> textArray;
+	uint16 numEntries = 0;
+
+public:
+	bool load();
+
+	uint16 getNumEntries() const;
+	const Common::String &getText(uint16 textIndex);
+
+private:
+	Common::String loadString(Common::File &file, uint16 index) const;
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_TOSTEXT_H


Commit: c0003007cc80a9a2fc899d67b6b6ea398e6fd337
    https://github.com/scummvm/scummvm/commit/c0003007cc80a9a2fc899d67b6b6ea398e6fd337
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
Darkseed: More work on title sequence

Changed paths:
  A engines/darkseed/anm.cpp
  A engines/darkseed/anm.h
  A engines/darkseed/pal.cpp
  A engines/darkseed/pal.h
  A engines/darkseed/titlefont.cpp
  A engines/darkseed/titlefont.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/img.cpp
    engines/darkseed/img.h


diff --git a/engines/darkseed/anm.cpp b/engines/darkseed/anm.cpp
new file mode 100644
index 00000000000..80d157a41a6
--- /dev/null
+++ b/engines/darkseed/anm.cpp
@@ -0,0 +1,45 @@
+/* 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 "anm.h"
+#include "common/debug.h"
+
+namespace Darkseed {
+bool Anm::load(const Common::String &filename) {
+	if(!file.open(filename)) {
+		return false;
+	}
+	numRecords = file.readUint16LE();
+	assetOffset = file.readUint16LE();
+
+	return true;
+}
+
+bool Anm::getImg(uint16 index, Img &img) {
+	file.seek(4 + index * 2);
+	int offset = file.readUint16LE();
+	file.seek((offset*16) + (4 + numRecords * 2));
+	img.loadWithoutPosition(file);
+	debug("Loaded %d (%d,%d) (%d,%d) %x", index, img.getX(), img.getY(), img.getWidth(), img.getHeight(), 0);
+
+	return false;
+}
+} // namespace Darkseed
\ No newline at end of file
diff --git a/engines/darkseed/anm.h b/engines/darkseed/anm.h
new file mode 100644
index 00000000000..5f127ee185b
--- /dev/null
+++ b/engines/darkseed/anm.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 DARKSEED_ANM_H
+#define DARKSEED_ANM_H
+
+#include "common/array.h"
+#include "img.h"
+namespace Darkseed {
+
+class Anm {
+private:
+//	Common::Array<Img> frames;
+	Common::File file;
+	uint16 numRecords = 0;
+	uint16 assetOffset = 0;
+
+public:
+	bool load(const Common::String &filename);
+	bool getImg(uint16 index, Img &img);
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_ANM_H
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index b76b35a8c33..15276ead452 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "darkseed/darkseed.h"
+#include "anm.h"
 #include "common/config-manager.h"
 #include "common/debug-channels.h"
 #include "common/events.h"
@@ -30,6 +31,8 @@
 #include "engines/util.h"
 #include "graphics/palette.h"
 #include "img.h"
+#include "pal.h"
+#include "titlefont.h"
 
 namespace Darkseed {
 
@@ -53,13 +56,21 @@ Common::String DarkseedEngine::getGameId() const {
 }
 
 Common::Error DarkseedEngine::run() {
-	// Initialize 320x200 paletted graphics mode
 	initGraphics(640, 350);
 	_screen = new Graphics::Screen();
 	_tosText = new TosText();
 	_tosText->load();
-	Img img;
-	img.load("art/left00.img");
+	Img left00Img;
+	left00Img.load("art/left00.img");
+	Img left01Img;
+	left01Img.load("art/left01.img");
+
+	Anm lettersAnm;
+	lettersAnm.load("art/letters.anm");
+	Img letterD;
+	lettersAnm.getImg(6, letterD);
+	Img letterD1;
+	lettersAnm.getImg(7, letterD1);
 
 	// Set the engine's debugger console
 	setDebugger(new Console(_tosText));
@@ -70,10 +81,22 @@ Common::Error DarkseedEngine::run() {
 		(void)loadGameState(saveSlot);
 
 	// Draw a series of boxes on screen as a sample
-	for (int i = 0; i < 100; ++i)
-		_screen->frameRect(Common::Rect(i, i, 320 - i, 200 - i), i);
+//	for (int i = 0; i < 100; ++i)
+//		_screen->frameRect(Common::Rect(i, i, 320 - i, 200 - i), i);
+//	Pal::load("art/ship.pal");
+//	_screen->copyRectToSurface(left00Img.getPixels().data(), left00Img.getWidth(), left00Img.getX(), left00Img.getY(), left00Img.getWidth(), left00Img.getHeight());
+//	_screen->copyRectToSurface(left01Img.getPixels().data(), left01Img.getWidth(), left01Img.getX(), left01Img.getY(), left01Img.getWidth(), left01Img.getHeight());
+
+	Pal housePalette;
+	housePalette.load("art/house.pal");
+	TitleFont titleFont;
+	titleFont.displayString(0x44, 0xa0, "DEVELOPING NEW WAYS TO AMAZE");
+	Img house;
+//	house.load("art/bdoll0.img");
+//		_screen->copyRectToSurface(house.getPixels().data(), house.getWidth(), house.getX(), house.getY(), house.getWidth(), house.getHeight());
+//	_screen->copyRectToSurfaceWithKey(letterD.getPixels().data(), letterD.getWidth(), 24, 24, letterD.getWidth(), letterD.getHeight(), 0);
+//	_screen->copyRectToSurfaceWithKey(letterD1.getPixels().data(), letterD1.getWidth(), 24+1, 24, letterD1.getWidth(), letterD1.getHeight(), 0);
 	_screen->update();
-
 	// Simple event handling loop
 	byte pal[256 * 3] = { 0 };
 	Common::Event e;
@@ -84,10 +107,10 @@ Common::Error DarkseedEngine::run() {
 		}
 
 		// Cycle through a simple palette
-		++offset;
-		for (int i = 0; i < 256; ++i)
-			pal[i * 3 + 1] = (i + offset) % 256;
-		g_system->getPaletteManager()->setPalette(pal, 0, 256);
+//		++offset;
+//		for (int i = 0; i < 256; ++i)
+//			pal[i * 3 + 1] = (i + offset) % 256;
+//		g_system->getPaletteManager()->setPalette(pal, 0, 256);
 		_screen->update();
 
 		// Delay for a bit. All events loops should have a delay
@@ -108,5 +131,15 @@ Common::Error DarkseedEngine::syncGame(Common::Serializer &s) {
 
 	return Common::kNoError;
 }
+void DarkseedEngine::fadeOut() {
+}
+
+void DarkseedEngine::fadeIn() {
+
+}
+
+void DarkseedEngine::fadeInner(int startValue, int endValue, int increment) {
+
+}
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index ad8cc1cf649..b072d8d6f2a 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -97,6 +97,12 @@ public:
 		Common::Serializer s(stream, nullptr);
 		return syncGame(s);
 	}
+
+	void fadeIn();
+	void fadeOut();
+private:
+	void fadeInner(int startValue, int endValue, int increment);
+
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/img.cpp b/engines/darkseed/img.cpp
index 291b99f1eb8..038f3a451ea 100644
--- a/engines/darkseed/img.cpp
+++ b/engines/darkseed/img.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "img.h"
+#include "common/debug.h"
 #include "common/file.h"
 
 namespace Darkseed {
@@ -29,35 +30,80 @@ bool Img::load(const Common::String &filename) {
 	if(!file.open(filename)) {
 		return false;
 	}
-	int fIdx = 0;
-	uint16 size = file.readUint16LE();
-	fIdx += 2;
+	bool ret = load(file);
+	file.close();
+	if (ret) {
+		debug("Loaded %s (%d,%d) (%d,%d) %x", filename.c_str(), x, y, width, height, mode);
+	}
+	return ret;
+}
+
+bool Img::load(Common::SeekableReadStream &readStream) {
+	Common::Array<uint8> unpackedData;
+	unpackRLE(readStream, unpackedData);
+	x = READ_UINT16(&unpackedData.data()[0]);
+	y = READ_UINT16(&unpackedData.data()[2]);
+	unpackPlanarData(unpackedData, 4);
+	return true;
+}
+
+bool Img::loadWithoutPosition(Common::SeekableReadStream &readStream) {
+	Common::Array<uint8> unpackedData;
+	unpackRLE(readStream, unpackedData);
+	x = 0;
+	y = 0;
+	unpackPlanarData(unpackedData, 0);
+	return false;
+}
+
+bool Img::unpackRLE(Common::SeekableReadStream &readStream, Common::Array<byte> &buf) {
+	uint16 size = readStream.readUint16LE();
 	uint16 idx = 0;
-	pixels.resize(size+1);
+	buf.resize(size+1);
 
 	while (idx <= size) {
-		uint8 byte = file.readByte();
-		assert(!file.err());
-		fIdx++;
+		uint8 byte = readStream.readByte();
+		assert(!readStream.err());
 		if (byte & 0x80) {
 			uint8 count = byte & 0x7f;
 			count++;
-			byte = file.readByte();
-			fIdx++;
+			byte = readStream.readByte();
 			for (int i = 0; i < count; i++) {
-				pixels[idx + i] = byte;
+				buf[idx + i] = byte;
 			}
 			idx += count;
 		} else {
 			uint8 count = byte + 1;
 			for (int i = 0; i < count; i++) {
-				pixels[idx + i] = file.readByte();
-				fIdx++;
+				buf[idx + i] = readStream.readByte();
 			}
 			idx += count;
 		}
 	}
+
 	return true;
 }
 
+void Img::unpackPlanarData(Common::Array<uint8> &planarData, uint16 headerOffset) {
+	height = READ_UINT16(&planarData.data()[headerOffset]);
+	width = READ_UINT16(&planarData.data()[headerOffset + 2]) * 8;
+	mode = planarData.data()[headerOffset + 4];
+//	assert(mode == 0xff);
+	pixels.resize(width * height, 0);
+	for (int py=0; py < height; py++) {
+		for (int plane = 0; plane < 4; plane++) {
+			for (int px=0; px < width; px++) {
+				int bitPos = (7 - (px % 8));
+				int planeBit = (planarData[(headerOffset + 5) + (px/8) + (width/8)*plane + py * (width/8)*4] & (1 << bitPos)) >> bitPos;
+				pixels[px + py * width] |= planeBit << (3 - plane);
+			}
+		}
+	}
+}
+
+Common::Array<uint8> &Img::getPixels() {
+	return pixels;
+}
+
+
 } // namespace Darkseed
\ No newline at end of file
diff --git a/engines/darkseed/img.h b/engines/darkseed/img.h
index 117703581d5..d8696edc3d8 100644
--- a/engines/darkseed/img.h
+++ b/engines/darkseed/img.h
@@ -24,13 +24,39 @@
 
 #include "common/array.h"
 #include "common/scummsys.h"
+#include "common/file.h"
 namespace Darkseed {
 
 class Img {
 private:
+	uint16 x;
+	uint16 y;
+	uint16 width;
+	uint16 height;
+	byte mode;
 	Common::Array<uint8> pixels;
 public:
 	bool load(const Common::String &filename);
+	bool load(Common::SeekableReadStream &readStream);
+	bool loadWithoutPosition(Common::SeekableReadStream &readStream);
+
+	Common::Array<uint8> &getPixels();
+	uint16 getX() const {
+		return x;
+	}
+	uint16 getY() const {
+		return y;
+	}
+	uint16 getWidth() const {
+		return width;
+	}
+	uint16 getHeight() const {
+		return height;
+	}
+
+private:
+	bool unpackRLE(Common::SeekableReadStream &readStream, Common::Array<uint8> &buf);
+	void unpackPlanarData(Common::Array<uint8> &planarData, uint16 headerOffset);
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/pal.cpp b/engines/darkseed/pal.cpp
new file mode 100644
index 00000000000..6ccbb84f8e0
--- /dev/null
+++ b/engines/darkseed/pal.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 "pal.h"
+#include "darkseed.h"
+#include "graphics/palette.h"
+
+namespace Darkseed {
+
+#define DARKSEED_NUM_PAL_ENTRIES 16
+#define DARKSEED_PAL_SIZE DARKSEED_NUM_PAL_ENTRIES * 3
+bool Pal::load(const Common::String &filename) {
+	Common::File file;
+	file.open(filename);
+	uint32 bytesRead = file.read(palData, DARKSEED_PAL_SIZE);
+	assert(bytesRead == DARKSEED_PAL_SIZE);
+
+	for (int i=0; i < DARKSEED_PAL_SIZE; i++) {
+		palData[i] = palData[i] << 2;
+	}
+	g_system->getPaletteManager()->setPalette(palData, 0, DARKSEED_NUM_PAL_ENTRIES);
+
+	return false;
+}
+
+} // namespace Darkseed
\ No newline at end of file
diff --git a/engines/darkseed/pal.h b/engines/darkseed/pal.h
new file mode 100644
index 00000000000..f88432b16e6
--- /dev/null
+++ b/engines/darkseed/pal.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 DARKSEED_PAL_H
+#define DARKSEED_PAL_H
+
+#include "common/str.h"
+namespace Darkseed {
+
+#define DARKSEED_NUM_PAL_ENTRIES 16
+#define DARKSEED_PAL_SIZE DARKSEED_NUM_PAL_ENTRIES * 3
+
+
+class Pal {
+public:
+	byte palData[DARKSEED_PAL_SIZE];
+
+public:
+	bool load(const Common::String &filename);
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_PAL_H
diff --git a/engines/darkseed/titlefont.cpp b/engines/darkseed/titlefont.cpp
new file mode 100644
index 00000000000..5f90ab63d92
--- /dev/null
+++ b/engines/darkseed/titlefont.cpp
@@ -0,0 +1,77 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 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 "titlefont.h"
+#include "darkseed.h"
+#include "graphics/screen.h"
+
+namespace Darkseed {
+extern DarkseedEngine *g_engine;
+
+TitleFont::TitleFont() {
+	letters.load("art/letters.anm");
+}
+
+int letterIndexLookupTbl[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+							  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+							  0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04,
+							  0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12,
+							  0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x00,
+							  0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c,
+							  0x2e, 0x30 };
+
+int16 letterWidthLookupTbl[] = {
+ 0x12,  0x12,    0x12,    0x12,
+ 0x12,  0x12,    0x12,    0x12,
+ 0xA,  0xC,    0x10,    0x12,
+ 0x14,  0x14,    0x12,    0x12,
+ 0x12,  0x12,    0x12,    0x12,
+ 0x12,  0x14,    0x14,    0x12,
+ 0x14,  0x12,    0xA,    0x0,
+ 0x0,  -1,    0x0,    0x0,
+ 0x0,  0x0,    0x0,    0x0,
+ 0x0,  0x0,    0x0,    0x0,
+ 0x0,  0x0,    0x0,    0x0,
+ 0x0,  0x0,    0x0,    0x0,
+ 0x0,  0x0,    0x0,    0x0,
+ 0x0,  0x0
+};
+
+void TitleFont::displayString(uint16 x, uint16 y, const Common::String &text) {
+	for (int i = 0; i < text.size(); i++) {
+		if (text[i] == ' ') {
+			x += 0x12;
+			continue;
+		}
+		Img letterShadow;
+		Img letter;
+		int letterId = letterIndexLookupTbl[text[i] - 0x2f];
+		letters.getImg(letterId, letterShadow);
+		letters.getImg(letterId+1, letter);
+
+		g_engine->_screen->copyRectToSurfaceWithKey(letterShadow.getPixels().data(), letterShadow.getWidth(), x, y, letterShadow.getWidth(), letterShadow.getHeight(), 0xf);
+		g_engine->_screen->copyRectToSurfaceWithKey(letter.getPixels().data(), letter.getWidth(), x + 1, y, letter.getWidth(), letter.getHeight(), 0);
+		debug("%c %d %d", text[i], letterWidthLookupTbl[text[i] - 0x41], letter.getWidth());
+		x += letterWidthLookupTbl[text[i] - 0x41]; //letter.getWidth();
+	}
+}
+
+} // namespace Darkseed
\ No newline at end of file
diff --git a/engines/darkseed/titlefont.h b/engines/darkseed/titlefont.h
new file mode 100644
index 00000000000..8b731804303
--- /dev/null
+++ b/engines/darkseed/titlefont.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 DARKSEED_TITLEFONT_H
+#define DARKSEED_TITLEFONT_H
+
+#include "anm.h"
+namespace Darkseed {
+
+class TitleFont {
+private:
+	Anm letters;
+
+public:
+	TitleFont();
+	void displayString(uint16 x, uint16 y, const Common::String &text);
+
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_TITLEFONT_H


Commit: a005efba6b54b198ca8afe3ee6abfe5285b4f0ef
    https://github.com/scummvm/scummvm/commit/a005efba6b54b198ca8afe3ee6abfe5285b4f0ef
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added support for loading PIC files

Changed paths:
  A engines/darkseed/pic.cpp
  A engines/darkseed/pic.h
    engines/darkseed/darkseed.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 15276ead452..6d69b4dd162 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -32,6 +32,7 @@
 #include "graphics/palette.h"
 #include "img.h"
 #include "pal.h"
+#include "pic.h"
 #include "titlefont.h"
 
 namespace Darkseed {
@@ -96,6 +97,18 @@ Common::Error DarkseedEngine::run() {
 //		_screen->copyRectToSurface(house.getPixels().data(), house.getWidth(), house.getX(), house.getY(), house.getWidth(), house.getHeight());
 //	_screen->copyRectToSurfaceWithKey(letterD.getPixels().data(), letterD.getWidth(), 24, 24, letterD.getWidth(), letterD.getHeight(), 0);
 //	_screen->copyRectToSurfaceWithKey(letterD1.getPixels().data(), letterD1.getWidth(), 24+1, 24, letterD1.getWidth(), letterD1.getHeight(), 0);
+
+	Pic frame;
+	frame.load("cframe.pic");
+	_screen->copyRectToSurface(frame.getPixels().data(), frame.getWidth(), 0, 0, frame.getWidth(), frame.getHeight());
+
+	Pic room;
+	room.load("bed1a.pic");
+	_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
+
+	Pal roomPal;
+	roomPal.load("room0.pal");
+
 	_screen->update();
 	// Simple event handling loop
 	byte pal[256 * 3] = { 0 };
diff --git a/engines/darkseed/pic.cpp b/engines/darkseed/pic.cpp
new file mode 100644
index 00000000000..d10a602a2d3
--- /dev/null
+++ b/engines/darkseed/pic.cpp
@@ -0,0 +1,87 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 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/debug.h"
+#include "pic.h"
+
+bool Darkseed::Pic::load(const Common::String &filename) {
+	Common::File file;
+	if(!file.open(filename)) {
+		return false;
+	}
+	bool ret = load(file);
+	file.close();
+	if (ret) {
+		debug("Loaded %s (%d,%d)", filename.c_str(), width, height);
+	}
+	return ret;
+}
+
+bool Darkseed::Pic::load(Common::SeekableReadStream &readStream) {
+	width = readStream.readUint16BE();
+	height = readStream.readUint16BE();
+	pixels.resize(width * (height+1), 0);
+
+	int curX = 0;
+	int curY = 0;
+	while(curY < height) {
+		int rleCommand = readNextNibble(readStream);
+
+		if (rleCommand < 8) {
+			// read nibble count of nibbles pixels
+			for (int i = 0; i < rleCommand + 1; i++) {
+				byte pixel = readNextNibble(readStream);
+				pixels[curX + curY * width] = pixel;
+				curX++;
+				if (curX == width) {
+					curX = 0;
+					curY++;
+				}
+			}
+		} else {
+			// fetch next nibble and repeat if n times.
+			byte pixel = readNextNibble(readStream);
+			for (int i = 16; i >= rleCommand; i--) {
+				pixels[curX + curY * width] = pixel;
+				curX++;
+				if (curX == width) {
+					curX = 0;
+					curY++;
+				}
+			}
+		}
+	}
+	return true;
+}
+
+byte Darkseed::Pic::readNextNibble(Common::SeekableReadStream &readStream) {
+	if (!hasReadByte) {
+		currentDataByte = readStream.readByte();
+		if (readStream.eos()) {
+			debug("Argh!");
+		}
+		hasReadByte = true;
+		return currentDataByte >> 4;
+	} else {
+		hasReadByte = false;
+		return currentDataByte & 0xf;
+	}
+}
diff --git a/engines/darkseed/pic.h b/engines/darkseed/pic.h
new file mode 100644
index 00000000000..80f90daafe3
--- /dev/null
+++ b/engines/darkseed/pic.h
@@ -0,0 +1,61 @@
+/* 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 DARKSEED_PIC_H
+#define DARKSEED_PIC_H
+
+#include "common/array.h"
+#include "common/scummsys.h"
+#include "common/file.h"
+
+namespace Darkseed {
+
+class Pic {
+private:
+	uint16 width;
+	uint16 height;
+	Common::Array<uint8> pixels;
+
+	bool hasReadByte = false;
+	byte currentDataByte = 0;
+
+public:
+	bool load(const Common::String &filename);
+	Common::Array<uint8> &getPixels() {
+		return pixels;
+	}
+
+	uint16 getWidth() const {
+		return width;
+	}
+	uint16 getHeight() const {
+		return height;
+	}
+
+private:
+	bool load(Common::SeekableReadStream &readStream);
+
+	byte readNextNibble(Common::SeekableReadStream &readStream);
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_PIC_H


Commit: 41ca7522fb123077dc9c1e8538c27f9fb602c5db
    https://github.com/scummvm/scummvm/commit/41ca7522fb123077dc9c1e8538c27f9fb602c5db
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added support for loading NSP files

Changed paths:
  A engines/darkseed/nsp.cpp
  A engines/darkseed/nsp.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/module.mk


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 6d69b4dd162..db557d7a342 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -31,6 +31,7 @@
 #include "engines/util.h"
 #include "graphics/palette.h"
 #include "img.h"
+#include "nsp.h"
 #include "pal.h"
 #include "pic.h"
 #include "titlefont.h"
@@ -109,16 +110,32 @@ Common::Error DarkseedEngine::run() {
 	Pal roomPal;
 	roomPal.load("room0.pal");
 
+	Nsp playerNsp;
+	playerNsp.load("tosfont.nsp"); //"cplayer.nsp");
+//	const Sprite &s = playerNsp.getSpriteAt(11);
+//
+//	_screen->copyRectToSurfaceWithKey(s.pixels.data(), s.width, 0x45 + 220, 0x28 + 40, s.width, s.height, 0xf);
+
 	_screen->update();
 	// Simple event handling loop
 	byte pal[256 * 3] = { 0 };
 	Common::Event e;
 	int offset = 0;
-
+	int sIdx = 0;
 	while (!shouldQuit()) {
 		while (g_system->getEventManager()->pollEvent(e)) {
+			if(e.type == Common::EVENT_KEYDOWN) {
+				sIdx++;
+				if (sIdx >= 96) {
+					sIdx = 0;
+				}
+				const Sprite &s = playerNsp.getSpriteAt(sIdx);
+				_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
+				_screen->copyRectToSurfaceWithKey(s.pixels.data(), s.width, 0x45 + 220, 0x28 + 40, s.width, s.height, 0xf);
+				_screen->makeAllDirty();
+			}
 		}
-
+//		_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
 		// Cycle through a simple palette
 //		++offset;
 //		for (int i = 0; i < 256; ++i)
diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
index 2fe690db580..ea116fe8290 100644
--- a/engines/darkseed/module.mk
+++ b/engines/darkseed/module.mk
@@ -3,6 +3,13 @@ MODULE := engines/darkseed
 MODULE_OBJS = \
 	darkseed.o \
 	console.o \
+	anm.o \
+	img.o \
+	nsp.o \
+	pic.o \
+	pal.o \
+	titlefont.o \
+	tostext.o \
 	metaengine.o
 
 # This module can be built as a plugin
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
new file mode 100644
index 00000000000..1eda23091ae
--- /dev/null
+++ b/engines/darkseed/nsp.cpp
@@ -0,0 +1,86 @@
+/* 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/debug.h"
+#include "nsp.h"
+
+Darkseed::Sprite::Sprite(uint16 width, uint16 height) : width(width), height(height) {
+	pixels.resize(width * height, 0);
+}
+
+bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
+	if (width == 1 && height == 1) {
+		byte b = readStream.readByte();
+		pixels[0] = b >> 4;
+	} else {
+		bool hasReadByte = false;
+		int currentDataByte = 0;
+		for (int i = 0; i < width * height; i++) {
+			if (!hasReadByte) {
+				currentDataByte = readStream.readByte();
+				if (readStream.eos()) {
+					debug("Argh!");
+					return false;
+				}
+				hasReadByte = true;
+				 pixels[i] = currentDataByte >> 4;
+			} else {
+				hasReadByte = false;
+				pixels[i] =  currentDataByte & 0xf;
+			}
+		}
+	}
+	return true;
+}
+
+bool Darkseed::Nsp::load(const Common::String &filename) {
+	Common::File file;
+	if(!file.open(filename)) {
+		return false;
+	}
+	bool ret = load(file);
+	file.close();
+	if (ret) {
+		debug("Loaded %s", filename.c_str());
+	}
+	return ret;
+}
+
+bool Darkseed::Nsp::load(Common::SeekableReadStream &readStream) {
+	for (int i = 0; i < 96; i++) {
+		int w = readStream.readByte();
+		int h = readStream.readByte();
+		w = w + (w & 1);
+		frames.push_back(Sprite(w, h));
+	}
+
+	for (int i = 0; i < 96; i++) {
+		if(!frames[i].loadData(readStream)) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+const Darkseed::Sprite &Darkseed::Nsp::getSpriteAt(int index) {
+	return frames[index];
+}
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
new file mode 100644
index 00000000000..8306f2fad38
--- /dev/null
+++ b/engines/darkseed/nsp.h
@@ -0,0 +1,56 @@
+/* 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 DARKSEED_NSP_H
+#define DARKSEED_NSP_H
+
+#include "common/array.h"
+#include "common/scummsys.h"
+#include "common/file.h"
+
+namespace Darkseed {
+
+class Sprite {
+public:
+	uint16 width;
+	uint16 height;
+	Common::Array<uint8> pixels;
+
+public:
+	Sprite(uint16 width, uint16 height);
+	bool loadData(Common::SeekableReadStream &readStream);
+};
+
+class Nsp {
+private:
+	Common::Array<Sprite> frames;
+
+public:
+	bool load(const Common::String &filename);
+	const Sprite &getSpriteAt(int index);
+
+private:
+	bool load(Common::SeekableReadStream &readStream);
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_NSP_H


Commit: 82e4d5f2d942b36d983b5eeeef27ceb7aa4781a0
    https://github.com/scummvm/scummvm/commit/82e4d5f2d942b36d983b5eeeef27ceb7aa4781a0
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added basic room and cursor support

Changed paths:
  A engines/darkseed/cursor.cpp
  A engines/darkseed/cursor.h
  A engines/darkseed/room.cpp
  A engines/darkseed/room.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/module.mk
    engines/darkseed/nsp.cpp
    engines/darkseed/nsp.h
    engines/darkseed/pal.cpp
    engines/darkseed/pic.cpp
    engines/darkseed/pic.h


diff --git a/engines/darkseed/cursor.cpp b/engines/darkseed/cursor.cpp
new file mode 100644
index 00000000000..943d26609f0
--- /dev/null
+++ b/engines/darkseed/cursor.cpp
@@ -0,0 +1,70 @@
+/* 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 "cursor.h"
+#include "darkseed.h"
+
+void Darkseed::Cursor::setCursorType(enum CursorType newType) {
+	_currentCursorType = newType;
+}
+
+void Darkseed::Cursor::updatePosition(int x, int y) {
+	_x = x;
+	_y = y;
+	debug("mouse at (%d,%d)", _x, _y);
+}
+
+void Darkseed::Cursor::draw() {
+	const Sprite cursorSprite = g_engine->_baseSprites.getSpriteAt(_currentCursorType);
+	int drawX = _x;
+	if (drawX + cursorSprite.width > 640) {
+		drawX = 640 - cursorSprite.width;
+	}
+	if (drawX < 0) {
+		drawX = 0;
+	}
+
+	int drawY = _y;
+	if (drawY + cursorSprite.height > 350) {
+		drawY = 350 - cursorSprite.height;
+	}
+	if (drawY < 0) {
+		drawY = 0;
+	}
+
+	if (_currentCursorType == HourGlass) {
+		g_engine->_baseSprites.getSpriteAt(_currentCursorType).draw(310, 20);
+	} else {
+		g_engine->_baseSprites.getSpriteAt(_currentCursorType).draw(drawX, drawY);
+	}
+}
+
+int Darkseed::Cursor::getWidth() {
+	return g_engine->_baseSprites.getSpriteAt(_currentCursorType).width;
+}
+
+int Darkseed::Cursor::getHeight() {
+	return g_engine->_baseSprites.getSpriteAt(_currentCursorType).height;
+}
+
+const Darkseed::Sprite &Darkseed::Cursor::getSprite() {
+	return g_engine->_baseSprites.getSpriteAt(_currentCursorType);
+}
diff --git a/engines/darkseed/cursor.h b/engines/darkseed/cursor.h
new file mode 100644
index 00000000000..ade694ebd48
--- /dev/null
+++ b/engines/darkseed/cursor.h
@@ -0,0 +1,61 @@
+/* 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 DARKSEED_CURSOR_H
+#define DARKSEED_CURSOR_H
+
+#include "nsp.h"
+namespace Darkseed {
+
+enum CursorType {
+	Pointer = 0,
+	Hand = 2,
+	Look = 3,
+	HourGlass = 91,
+	ConnectorEntrance = 92,
+	HandPointing = 93,
+	ExclamationMark = 94,
+};
+
+class Cursor {
+private:
+	int _x = 0;
+	int _y = 0;
+	enum CursorType _currentCursorType = Pointer;
+
+public:
+
+	void setCursorType(enum CursorType newType);
+
+	int getX() { return _x; }
+	int getY() { return _y; }
+
+	int getWidth();
+	int getHeight();
+	const Sprite &getSprite();
+
+	void updatePosition(int x, int y);
+	void draw();
+};
+
+} // End of namespace Darkseed
+
+#endif // DARKSEED_CURSOR_H
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index db557d7a342..0c847e32180 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -34,6 +34,7 @@
 #include "nsp.h"
 #include "pal.h"
 #include "pic.h"
+#include "room.h"
 #include "titlefont.h"
 
 namespace Darkseed {
@@ -99,54 +100,67 @@ Common::Error DarkseedEngine::run() {
 //	_screen->copyRectToSurfaceWithKey(letterD.getPixels().data(), letterD.getWidth(), 24, 24, letterD.getWidth(), letterD.getHeight(), 0);
 //	_screen->copyRectToSurfaceWithKey(letterD1.getPixels().data(), letterD1.getWidth(), 24+1, 24, letterD1.getWidth(), letterD1.getHeight(), 0);
 
-	Pic frame;
-	frame.load("cframe.pic");
-	_screen->copyRectToSurface(frame.getPixels().data(), frame.getWidth(), 0, 0, frame.getWidth(), frame.getHeight());
+	_frame.load("cframe.pic");
+	_frame.draw();
 
-	Pic room;
-	room.load("bed1a.pic");
-	_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
+	_baseSprites.load("cbase.nsp");
 
-	Pal roomPal;
-	roomPal.load("room0.pal");
+	_cursor.updatePosition(0x140,0xaf);
+	_cursor.setCursorType(Pointer);
+
+//	Pic room;
+//	room.load("bed1a.pic");
+//	_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
+
+//	Pal roomPal;
+//	roomPal.load("room0.pal");
 
 	Nsp playerNsp;
-	playerNsp.load("tosfont.nsp"); //"cplayer.nsp");
+	playerNsp.load("cbase.nsp"); //"cplayer.nsp");
 //	const Sprite &s = playerNsp.getSpriteAt(11);
 //
 //	_screen->copyRectToSurfaceWithKey(s.pixels.data(), s.width, 0x45 + 220, 0x28 + 40, s.width, s.height, 0xf);
 
-	_screen->update();
+	_room = new Room(2);
+//	_room->draw();
+//	_cursor.draw();
+//	_screen->update();
 	// Simple event handling loop
-	byte pal[256 * 3] = { 0 };
-	Common::Event e;
+//	Common::Event e;
 	int offset = 0;
 	int sIdx = 0;
-	while (!shouldQuit()) {
-		while (g_system->getEventManager()->pollEvent(e)) {
-			if(e.type == Common::EVENT_KEYDOWN) {
-				sIdx++;
-				if (sIdx >= 96) {
-					sIdx = 0;
-				}
-				const Sprite &s = playerNsp.getSpriteAt(sIdx);
-				_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
-				_screen->copyRectToSurfaceWithKey(s.pixels.data(), s.width, 0x45 + 220, 0x28 + 40, s.width, s.height, 0xf);
-				_screen->makeAllDirty();
-			}
-		}
-//		_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
-		// Cycle through a simple palette
-//		++offset;
-//		for (int i = 0; i < 256; ++i)
-//			pal[i * 3 + 1] = (i + offset) % 256;
-//		g_system->getPaletteManager()->setPalette(pal, 0, 256);
-		_screen->update();
 
-		// Delay for a bit. All events loops should have a delay
-		// to prevent the system being unduly loaded
-		g_system->delayMillis(10);
-	}
+	gameloop();
+
+//	while (!shouldQuit()) {
+//		while (g_system->getEventManager()->pollEvent(e)) {
+//			if(e.type == Common::EVENT_KEYDOWN) {
+//				sIdx++;
+//				if (sIdx >= 96) {
+//					sIdx = 0;
+//				}
+//				const Sprite &s = playerNsp.getSpriteAt(sIdx);
+//				_room->draw();
+//				_cursor.draw();
+////				_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
+//				_screen->copyRectToSurfaceWithKey(s.pixels.data(), s.width, 0x45 + 220, 0x28 + 40, s.width, s.height, 0xf);
+//				_screen->makeAllDirty();
+//			}
+//		}
+////		_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
+//		// Cycle through a simple palette
+////		++offset;
+////		for (int i = 0; i < 256; ++i)
+////			pal[i * 3 + 1] = (i + offset) % 256;
+////		g_system->getPaletteManager()->setPalette(pal, 0, 256);
+//		_screen->update();
+//
+//		// Delay for a bit. All events loops should have a delay
+//		// to prevent the system being unduly loaded
+//		g_system->delayMillis(10);
+//	}
+
+	delete _room;
 
 	return Common::kNoError;
 }
@@ -172,4 +186,54 @@ void DarkseedEngine::fadeInner(int startValue, int endValue, int increment) {
 
 }
 
+void DarkseedEngine::gameloop() {
+	while (!shouldQuit()) {
+		updateEvents();
+		handleInput();
+		_room->update();
+		_frame.draw();
+		_room->draw();
+		_cursor.draw();
+		_screen->makeAllDirty();
+		_screen->update();
+		wait();
+	}
+}
+
+void DarkseedEngine::updateEvents() {
+	Common::Event event;
+	_isRightMouseClicked = false;
+	_isLeftMouseClicked = false;
+	while (g_system->getEventManager()->pollEvent(event)) {
+		switch (event.type) {
+		case Common::EVENT_MOUSEMOVE: _cursor.updatePosition(event.mouse.x, event.mouse.y); break;
+		case Common::EVENT_RBUTTONDOWN: _isRightMouseClicked = true; break;
+		case Common::EVENT_RBUTTONUP: _isRightMouseClicked = false; break;
+		case Common::EVENT_LBUTTONDOWN: _isLeftMouseClicked = true; break;
+		case Common::EVENT_LBUTTONUP: _isLeftMouseClicked = false; break;
+		default: break;
+		}
+	}
+}
+
+void DarkseedEngine::wait() {
+	g_system->delayMillis(10);
+}
+
+void DarkseedEngine::handleInput() {
+	if (_isRightMouseClicked) {
+		if (_actionMode == LookAction) {
+			_actionMode = PointerAction;
+		} else if (_actionMode == PointerAction) {
+			_actionMode = HandAction;
+		} else if (_actionMode == HandAction) {
+			_actionMode = LookAction;
+		}
+		_cursor.setCursorType((CursorType)_actionMode);
+	} else if (_isLeftMouseClicked) {
+		// TODO do actions here.
+
+	}
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index b072d8d6f2a..610f925c631 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -34,23 +34,42 @@
 #include "engines/savestate.h"
 #include "graphics/screen.h"
 
+#include "cursor.h"
 #include "darkseed/detection.h"
+#include "nsp.h"
+#include "room.h"
 #include "tostext.h"
 
 namespace Darkseed {
 
 struct DarkseedGameDescription;
 
+enum ActionMode {
+	PointerAction = 0,
+	HandAction = 2,
+	LookAction = 3
+};
+
 class DarkseedEngine : public Engine {
 private:
 	const ADGameDescription *_gameDescription;
 	Common::RandomSource _randomSource;
+	Pic _frame;
+
 protected:
 	// Engine APIs
 	Common::Error run() override;
 public:
+	bool _isRightMouseClicked = false;
+	bool _isLeftMouseClicked = false;
+
+	Nsp _baseSprites;
+	Cursor _cursor;
 	Graphics::Screen *_screen = nullptr;
 	TosText *_tosText = nullptr;
+	Room *_room = nullptr;
+	ActionMode _actionMode = PointerAction;
+
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	~DarkseedEngine() override;
@@ -102,7 +121,10 @@ public:
 	void fadeOut();
 private:
 	void fadeInner(int startValue, int endValue, int increment);
-
+	void gameloop();
+	void updateEvents();
+	void handleInput();
+	void wait();
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
index ea116fe8290..f102adb6eb4 100644
--- a/engines/darkseed/module.mk
+++ b/engines/darkseed/module.mk
@@ -10,7 +10,9 @@ MODULE_OBJS = \
 	pal.o \
 	titlefont.o \
 	tostext.o \
-	metaengine.o
+	metaengine.o \
+	room.o \
+	cursor.o
 
 # This module can be built as a plugin
 ifeq ($(ENABLE_DARKSEED), DYNAMIC_PLUGIN)
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index 1eda23091ae..75dcef59cfe 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -19,8 +19,9 @@
 *
 */
 
-#include "common/debug.h"
 #include "nsp.h"
+#include "common/debug.h"
+#include "darkseed.h"
 
 Darkseed::Sprite::Sprite(uint16 width, uint16 height) : width(width), height(height) {
 	pixels.resize(width * height, 0);
@@ -51,6 +52,10 @@ bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
 	return true;
 }
 
+void Darkseed::Sprite::draw(int x, int y) const {
+	g_engine->_screen->copyRectToSurfaceWithKey(pixels.data(), width, x, y, width, height, 0xf);
+}
+
 bool Darkseed::Nsp::load(const Common::String &filename) {
 	Common::File file;
 	if(!file.open(filename)) {
@@ -65,6 +70,7 @@ bool Darkseed::Nsp::load(const Common::String &filename) {
 }
 
 bool Darkseed::Nsp::load(Common::SeekableReadStream &readStream) {
+	frames.clear();
 	for (int i = 0; i < 96; i++) {
 		int w = readStream.readByte();
 		int h = readStream.readByte();
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
index 8306f2fad38..1840dd7af87 100644
--- a/engines/darkseed/nsp.h
+++ b/engines/darkseed/nsp.h
@@ -37,6 +37,7 @@ public:
 public:
 	Sprite(uint16 width, uint16 height);
 	bool loadData(Common::SeekableReadStream &readStream);
+	void draw(int x, int y) const;
 };
 
 class Nsp {
diff --git a/engines/darkseed/pal.cpp b/engines/darkseed/pal.cpp
index 6ccbb84f8e0..230a035e6c8 100644
--- a/engines/darkseed/pal.cpp
+++ b/engines/darkseed/pal.cpp
@@ -29,7 +29,9 @@ namespace Darkseed {
 #define DARKSEED_PAL_SIZE DARKSEED_NUM_PAL_ENTRIES * 3
 bool Pal::load(const Common::String &filename) {
 	Common::File file;
-	file.open(filename);
+	if(!file.open(filename)) {
+		return false;
+	}
 	uint32 bytesRead = file.read(palData, DARKSEED_PAL_SIZE);
 	assert(bytesRead == DARKSEED_PAL_SIZE);
 
@@ -38,7 +40,7 @@ bool Pal::load(const Common::String &filename) {
 	}
 	g_system->getPaletteManager()->setPalette(palData, 0, DARKSEED_NUM_PAL_ENTRIES);
 
-	return false;
+	return true;
 }
 
 } // namespace Darkseed
\ No newline at end of file
diff --git a/engines/darkseed/pic.cpp b/engines/darkseed/pic.cpp
index d10a602a2d3..c5c68c136c6 100644
--- a/engines/darkseed/pic.cpp
+++ b/engines/darkseed/pic.cpp
@@ -19,8 +19,9 @@
 *
 */
 
-#include "common/debug.h"
 #include "pic.h"
+#include "common/debug.h"
+#include "darkseed.h"
 
 bool Darkseed::Pic::load(const Common::String &filename) {
 	Common::File file;
@@ -85,3 +86,11 @@ byte Darkseed::Pic::readNextNibble(Common::SeekableReadStream &readStream) {
 		return currentDataByte & 0xf;
 	}
 }
+
+void Darkseed::Pic::draw() {
+	draw(0, 0);
+}
+
+void Darkseed::Pic::draw(int xOffset, int yOffset) {
+	g_engine->_screen->copyRectToSurface(getPixels().data(), getWidth(), xOffset, yOffset, getWidth(), getHeight());
+}
diff --git a/engines/darkseed/pic.h b/engines/darkseed/pic.h
index 80f90daafe3..7318f1ec43c 100644
--- a/engines/darkseed/pic.h
+++ b/engines/darkseed/pic.h
@@ -50,6 +50,8 @@ public:
 		return height;
 	}
 
+	void draw();
+	void draw(int xOffset, int yOffset);
 private:
 	bool load(Common::SeekableReadStream &readStream);
 
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
new file mode 100644
index 00000000000..b0caa2dff04
--- /dev/null
+++ b/engines/darkseed/room.cpp
@@ -0,0 +1,193 @@
+/* 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 "room.h"
+#include "darkseed.h"
+
+Darkseed::Room::Room(int roomNumber) : roomNumber(roomNumber) {
+	room1.resize(8);
+	room2.resize(16);
+	room3.resize(30);
+
+	if(!load()) {
+		error("Failed to load room %d", roomNumber);
+	}
+}
+
+bool Darkseed::Room::load() {
+	Common::String filename;
+	Common::File file;
+	filename = Common::String::format("room%d.rom", roomNumber);
+	if(!file.open(filename)) {
+		return false;
+	}
+
+	Common::String nspFilename = stripSpaces(file.readString());
+	file.seek(0xd);
+	Common::String picFilename = stripSpaces(file.readString());
+	file.seek(0x1a);
+	Common::String palFilename = stripSpaces(file.readString());
+	file.seek(0x27);
+
+	for (int i = 0; i < 8; i++) {
+		room1[i].unk0 = file.readUint16BE();
+		room1[i].unk2 = file.readUint16BE();
+		if (room1[i].unk2 > 233) {
+			room1[i].unk2 = 233;
+		}
+		room1[i].unk4 = file.readUint16BE();
+		room1[i].unk6 = file.readUint16BE();
+		room1[i].unk8 = file.readUint16BE();
+		room1[i].unka = file.readByte();
+	}
+
+	for (int i = 0; i < 16; i++) {
+		file.read(room2[i].strip, 40);
+	}
+
+	for (int i = 0; i < 30; i++) {
+		room3[i].unk0 = file.readUint16BE();
+		room3[i].unk2 = file.readUint16BE();
+		room3[i].xOffset = file.readUint16BE();
+		room3[i].yOffset = file.readUint16BE();
+		room3[i].width = file.readUint16BE();
+		room3[i].height = file.readUint16BE();
+		room3[i].unkc = file.readByte();
+		room3[i].unkd = file.readByte();
+
+		if (room3[i].unkd >= 0x29 && room3[i].unk0 != 0 && room3[i].unk0 != 1000) {
+			room3[i].height = 0x14;
+			room3[i].width = 0x14;
+			room3[i].unk0 = 0;
+		}
+
+		if (room3[i].unk2 == 0 && room3[i].unk0 == 1) {
+			if (connectors.size() == 0xc) {
+				error("Too many connectors in this room, max of %", 0xc);
+			}
+			RoomConnector connector;
+			connector.x = room3[i].xOffset;
+			connector.y = room3[i].yOffset;
+
+			if (connector.x > 565) {
+				connector.x = 565;
+			}
+			if (connector.x < 75) {
+				connector.x = 75;
+			}
+			if (connector.y > 235) {
+				connector.y = 235;
+			}
+			if (connector.y < 45) {
+				connector.y = 45;
+			}
+
+			debug("Room Connector: %d %d", connector.x, connector.y);
+			connectors.push_back(connector);
+			room3[i].unk0 = 0xff;
+		}
+	}
+
+	file.close();
+
+	if(!pic.load(picFilename)) {
+		return false;
+	}
+
+	_pal.load(Common::String::format("room%d.pal", roomNumber));
+
+	return true;
+}
+
+Common::String Darkseed::Room::stripSpaces(Common::String source) {
+	Common::String out;
+	const char *src = source.c_str();
+	for (int i = 0; i < source.size(); i++) {
+		if (src[i] != ' ') {
+			out += src[i];
+		}
+	}
+	return out;
+}
+
+void Darkseed::Room::draw() {
+	pic.draw(0x45, 0x28);
+	for (int i = 0; i < connectors.size(); i++) {
+		g_engine->_screen->drawLine(connectors[i].x, connectors[i].y, connectors[i].x + 7, connectors[i].y + 13, 2);
+	}
+}
+
+int Darkseed::Room::getObjectAtPoint(int x, int y) {
+	const Sprite &cursorSprite = g_engine->_cursor.getSprite();
+	ActionMode actionMode = g_engine->_actionMode;
+	bool hasObject = false;
+	for (int i = 0; i < room3.size(); i++) {
+		if (room3[i].unk0 == 0
+			&& room3[i].xOffset <= cursorSprite.width + g_engine->_cursor.getX()
+			&& g_engine->_cursor.getX() <= room3[i].width + room3[i].xOffset
+			&& room3[i].yOffset <= cursorSprite.height + g_engine->_cursor.getY()
+			&& g_engine->_cursor.getY() <= room3[i].height + room3[i].yOffset
+		) {
+			if (actionMode != PointerAction && room3[i].unk2 >= 5) {
+				hasObject = true;
+			}
+
+			if (actionMode == PointerAction && room3[i].unk2 < 6) {
+				hasObject = true;
+			}
+
+			if (room3[i].unk2 == 0x3b || room3[i].unk2 == 0x4e) {
+				// TODO
+//				if (DAT_2c85_8186 == 1) {
+//					hasObject = true;
+//				}
+//				else {
+//					hasObject = false;
+//				}
+			}
+
+			if (room3[i].unk2 == 0x19 && hasObject) {
+//				if (DAT_2c85_81e2 < 2) {
+//					hasObject = false;
+//				}
+//				else {
+//					hasObject = true;
+//				}
+			}
+
+			if (room3[i].unk2 == 0x74 && hasObject && (int)actionMode != 0x13) {
+				hasObject = false;
+			}
+
+			if (hasObject) {
+				return i;
+			}
+		}
+	}
+	return -1;
+}
+
+void Darkseed::Room::update() {
+	int objectUnderCursor = getObjectAtPoint(g_engine->_cursor.getX(), g_engine->_cursor.getY());
+	if (g_engine->_actionMode == PointerAction) {
+		g_engine->_cursor.setCursorType(objectUnderCursor != -1 ? ConnectorEntrance : Pointer);
+	}
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
new file mode 100644
index 00000000000..1587a28d4a2
--- /dev/null
+++ b/engines/darkseed/room.h
@@ -0,0 +1,85 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 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 DARKSEED_ROOM_H
+#define DARKSEED_ROOM_H
+
+#include "pal.h"
+#include "pic.h"
+
+namespace Darkseed {
+
+struct RoomStruct1 {
+	uint16 unk0 = 0;
+	uint16 unk2 = 0;
+	uint16 unk4 = 0;
+	uint16 unk6 = 0;
+	uint16 unk8 = 0;
+	uint8 unka = 0;
+};
+
+struct RoomStruct2 {
+	uint8 strip[40];
+};
+
+struct RoomStruct3 {
+	uint16 unk0 = 0;
+	uint16 unk2 = 0;
+	uint16 xOffset = 0;
+	uint16 yOffset = 0;
+	uint16 width = 0;
+	uint16 height = 0;
+	uint8 unkc = 0;
+	uint8 unkd = 0;
+};
+
+struct RoomConnector {
+	uint16 x = 0;
+	uint16 y = 0;
+};
+
+class Room {
+public:
+	int roomNumber;
+	Pic pic;
+	Pal _pal;
+
+	Common::Array<RoomStruct1> room1;
+	Common::Array<RoomStruct2> room2;
+	Common::Array<RoomStruct3> room3;
+	Common::Array<RoomConnector> connectors;
+
+public:
+	explicit Room(int roomNumber);
+
+	void draw();
+
+	void update();
+
+	int getObjectAtPoint(int x, int y);
+private:
+	bool load();
+	static Common::String stripSpaces(Common::String source);
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_ROOM_H


Commit: 416f1050ff1e0cf72cdba491d32b617ae7a07692
    https://github.com/scummvm/scummvm/commit/416f1050ff1e0cf72cdba491d32b617ae7a07692
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Change rooms by left clicking while in pointer mode.

Changed paths:
    engines/darkseed/cursor.cpp
    engines/darkseed/cursor.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/pic.cpp
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/cursor.cpp b/engines/darkseed/cursor.cpp
index 943d26609f0..b35679c17cb 100644
--- a/engines/darkseed/cursor.cpp
+++ b/engines/darkseed/cursor.cpp
@@ -29,7 +29,7 @@ void Darkseed::Cursor::setCursorType(enum CursorType newType) {
 void Darkseed::Cursor::updatePosition(int x, int y) {
 	_x = x;
 	_y = y;
-	debug("mouse at (%d,%d)", _x, _y);
+//	debug("mouse at (%d,%d)", _x, _y);
 }
 
 void Darkseed::Cursor::draw() {
diff --git a/engines/darkseed/cursor.h b/engines/darkseed/cursor.h
index ade694ebd48..84d2a50d33e 100644
--- a/engines/darkseed/cursor.h
+++ b/engines/darkseed/cursor.h
@@ -44,6 +44,7 @@ private:
 public:
 
 	void setCursorType(enum CursorType newType);
+	CursorType getCursorType() { return _currentCursorType; }
 
 	int getX() { return _x; }
 	int getY() { return _y; }
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 0c847e32180..7a24a47380c 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -232,8 +232,21 @@ void DarkseedEngine::handleInput() {
 		_cursor.setCursorType((CursorType)_actionMode);
 	} else if (_isLeftMouseClicked) {
 		// TODO do actions here.
+		handlePointerAction();
+	}
+}
 
+void DarkseedEngine::handlePointerAction() {
+	if (_cursor.getCursorType() == ConnectorEntrance) {
+		int newRoomNumber = _room->getExitRoomNumberAtPoint(_cursor.getX(), _cursor.getY());
+		if (newRoomNumber >= 0) {
+			changeToRoom(newRoomNumber);
+		}
 	}
 }
+void DarkseedEngine::changeToRoom(int newRoomNumber) {
+	delete _room;
+	_room = new Room(newRoomNumber);
+}
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 610f925c631..418ad90ad6b 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -125,6 +125,8 @@ private:
 	void updateEvents();
 	void handleInput();
 	void wait();
+	void handlePointerAction();
+	void changeToRoom(int newRoomNumber);
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/pic.cpp b/engines/darkseed/pic.cpp
index c5c68c136c6..ff927dc24e7 100644
--- a/engines/darkseed/pic.cpp
+++ b/engines/darkseed/pic.cpp
@@ -26,6 +26,7 @@
 bool Darkseed::Pic::load(const Common::String &filename) {
 	Common::File file;
 	if(!file.open(filename)) {
+		debug("Failed to load %s", filename.c_str());
 		return false;
 	}
 	bool ret = load(file);
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index b0caa2dff04..a8f4ab8ec6d 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -22,7 +22,7 @@
 #include "room.h"
 #include "darkseed.h"
 
-Darkseed::Room::Room(int roomNumber) : roomNumber(roomNumber) {
+Darkseed::Room::Room(int roomNumber) : _roomNumber(roomNumber) {
 	room1.resize(8);
 	room2.resize(16);
 	room3.resize(30);
@@ -33,10 +33,11 @@ Darkseed::Room::Room(int roomNumber) : roomNumber(roomNumber) {
 }
 
 bool Darkseed::Room::load() {
-	Common::String filename;
+	Common::String filenameBase = getRoomFilenameBase(_roomNumber);
+	Common::String romFilename;
 	Common::File file;
-	filename = Common::String::format("room%d.rom", roomNumber);
-	if(!file.open(filename)) {
+	romFilename = Common::String::format("%s.rom", filenameBase.c_str(), _roomNumber);
+	if(!file.open(romFilename)) {
 		return false;
 	}
 
@@ -48,14 +49,14 @@ bool Darkseed::Room::load() {
 	file.seek(0x27);
 
 	for (int i = 0; i < 8; i++) {
-		room1[i].unk0 = file.readUint16BE();
-		room1[i].unk2 = file.readUint16BE();
-		if (room1[i].unk2 > 233) {
-			room1[i].unk2 = 233;
+		room1[i].x = file.readUint16BE();
+		room1[i].y = file.readUint16BE();
+		if (room1[i].y > 233) {
+			room1[i].y = 233;
 		}
 		room1[i].unk4 = file.readUint16BE();
 		room1[i].unk6 = file.readUint16BE();
-		room1[i].unk8 = file.readUint16BE();
+		room1[i].roomNumber = file.readUint16BE();
 		room1[i].unka = file.readByte();
 	}
 
@@ -112,7 +113,7 @@ bool Darkseed::Room::load() {
 		return false;
 	}
 
-	_pal.load(Common::String::format("room%d.pal", roomNumber));
+	_pal.load(Common::String::format("%s.pal", filenameBase.c_str()));
 
 	return true;
 }
@@ -191,3 +192,28 @@ void Darkseed::Room::update() {
 		g_engine->_cursor.setCursorType(objectUnderCursor != -1 ? ConnectorEntrance : Pointer);
 	}
 }
+
+bool Darkseed::Room::exitRoom() {
+	return false;
+}
+int Darkseed::Room::getExitRoomNumberAtPoint(int x, int y) {
+	int obj = getObjectAtPoint(x, y);
+	for (int i = 0; i < room1.size(); i++) {
+		if (
+			room1[i].roomNumber != 0xff
+			&& room3[obj].xOffset <= room1[i].x
+			&& room1[i].x <= room3[obj].width + room3[obj].xOffset
+			&& room3[obj].yOffset <= room1[i].y
+			&& room1[i].y <= room3[obj].yOffset + room3[obj].height
+			) {
+			return room1[i].roomNumber;
+		}
+	}
+	return -1;
+}
+Common::String Darkseed::Room::getRoomFilenameBase(int roomNumber) {
+	if (roomNumber == 20 || roomNumber == 22) {
+		return "room19";
+	}
+	return Common::String::format("room%d", roomNumber);
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index 1587a28d4a2..2619fcb4524 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -28,11 +28,11 @@
 namespace Darkseed {
 
 struct RoomStruct1 {
-	uint16 unk0 = 0;
-	uint16 unk2 = 0;
+	uint16 x = 0;
+	uint16 y = 0;
 	uint16 unk4 = 0;
 	uint16 unk6 = 0;
-	uint16 unk8 = 0;
+	uint16 roomNumber = 0;
 	uint8 unka = 0;
 };
 
@@ -58,7 +58,7 @@ struct RoomConnector {
 
 class Room {
 public:
-	int roomNumber;
+	int _roomNumber;
 	Pic pic;
 	Pal _pal;
 
@@ -75,6 +75,9 @@ public:
 	void update();
 
 	int getObjectAtPoint(int x, int y);
+	int getExitRoomNumberAtPoint(int x, int y);
+	bool exitRoom();
+	Common::String getRoomFilenameBase(int roomNumber);
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);


Commit: bfec4f80c80c6c4c3ea675242c38498342be9a4c
    https://github.com/scummvm/scummvm/commit/bfec4f80c80c6c4c3ea675242c38498342be9a4c
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Add logic for determining walkable locations in each room

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 7a24a47380c..7d6d816d983 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -121,45 +121,10 @@ Common::Error DarkseedEngine::run() {
 //
 //	_screen->copyRectToSurfaceWithKey(s.pixels.data(), s.width, 0x45 + 220, 0x28 + 40, s.width, s.height, 0xf);
 
-	_room = new Room(2);
-//	_room->draw();
-//	_cursor.draw();
-//	_screen->update();
-	// Simple event handling loop
-//	Common::Event e;
-	int offset = 0;
-	int sIdx = 0;
+	_room = new Room(5);
 
 	gameloop();
 
-//	while (!shouldQuit()) {
-//		while (g_system->getEventManager()->pollEvent(e)) {
-//			if(e.type == Common::EVENT_KEYDOWN) {
-//				sIdx++;
-//				if (sIdx >= 96) {
-//					sIdx = 0;
-//				}
-//				const Sprite &s = playerNsp.getSpriteAt(sIdx);
-//				_room->draw();
-//				_cursor.draw();
-////				_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
-//				_screen->copyRectToSurfaceWithKey(s.pixels.data(), s.width, 0x45 + 220, 0x28 + 40, s.width, s.height, 0xf);
-//				_screen->makeAllDirty();
-//			}
-//		}
-////		_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
-//		// Cycle through a simple palette
-////		++offset;
-////		for (int i = 0; i < 256; ++i)
-////			pal[i * 3 + 1] = (i + offset) % 256;
-////		g_system->getPaletteManager()->setPalette(pal, 0, 256);
-//		_screen->update();
-//
-//		// Delay for a bit. All events loops should have a delay
-//		// to prevent the system being unduly loaded
-//		g_system->delayMillis(10);
-//	}
-
 	delete _room;
 
 	return Common::kNoError;
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index a8f4ab8ec6d..dfa2e1c33bb 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -24,7 +24,7 @@
 
 Darkseed::Room::Room(int roomNumber) : _roomNumber(roomNumber) {
 	room1.resize(8);
-	room2.resize(16);
+	walkableLocationsMap.resize(16);
 	room3.resize(30);
 
 	if(!load()) {
@@ -61,7 +61,7 @@ bool Darkseed::Room::load() {
 	}
 
 	for (int i = 0; i < 16; i++) {
-		file.read(room2[i].strip, 40);
+		file.read(walkableLocationsMap[i].strip, 40);
 	}
 
 	for (int i = 0; i < 30; i++) {
@@ -82,7 +82,7 @@ bool Darkseed::Room::load() {
 
 		if (room3[i].unk2 == 0 && room3[i].unk0 == 1) {
 			if (connectors.size() == 0xc) {
-				error("Too many connectors in this room, max of %", 0xc);
+				error("Too many connectors in this room, max of %d", 0xc);
 			}
 			RoomConnector connector;
 			connector.x = room3[i].xOffset;
@@ -131,8 +131,18 @@ Common::String Darkseed::Room::stripSpaces(Common::String source) {
 
 void Darkseed::Room::draw() {
 	pic.draw(0x45, 0x28);
+
+	// print walkable area map.
+	for (int y = 0x28; y < pic.getHeight() + 0x28; y++) {
+		for (int x = 0x45; x < pic.getWidth() + 0x45; x++) {
+			if (canWalkAtLocation(x, y)) {
+				g_engine->_screen->drawLine(x, y, x, y, 14);
+			}
+		}
+	}
+
 	for (int i = 0; i < connectors.size(); i++) {
-		g_engine->_screen->drawLine(connectors[i].x, connectors[i].y, connectors[i].x + 7, connectors[i].y + 13, 2);
+		g_engine->_baseSprites.getSpriteAt(0).draw(connectors[i].x, connectors[i].y);
 	}
 }
 
@@ -217,3 +227,13 @@ Common::String Darkseed::Room::getRoomFilenameBase(int roomNumber) {
 	}
 	return Common::String::format("room%d", roomNumber);
 }
+
+bool Darkseed::Room::canWalkAtLocation(int x, int y) {
+	if (x < 69 || x >= 570 || y < 40 || y >= 239) {
+		return false;
+	}
+
+	int t = (x - 69) / 5;
+
+	return (walkableLocationsMap[t / 8].strip[(y - 40) / 5] >> (7 - (t % 8) & 0x1f) & 1);
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index 2619fcb4524..1aaa83a37d3 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -63,7 +63,7 @@ public:
 	Pal _pal;
 
 	Common::Array<RoomStruct1> room1;
-	Common::Array<RoomStruct2> room2;
+	Common::Array<RoomStruct2> walkableLocationsMap;
 	Common::Array<RoomStruct3> room3;
 	Common::Array<RoomConnector> connectors;
 
@@ -78,6 +78,8 @@ public:
 	int getExitRoomNumberAtPoint(int x, int y);
 	bool exitRoom();
 	Common::String getRoomFilenameBase(int roomNumber);
+	bool canWalkAtLocation(int x, int y);
+
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);


Commit: 1e658f7ef0757db42bb9a3c53fb0f0488cc3efb3
    https://github.com/scummvm/scummvm/commit/1e658f7ef0757db42bb9a3c53fb0f0488cc3efb3
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Add start of in-game text console.

Changed paths:
  A engines/darkseed/debugconsole.cpp
  A engines/darkseed/debugconsole.h
  A engines/darkseed/player.cpp
  A engines/darkseed/player.h
    engines/darkseed/console.cpp
    engines/darkseed/console.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/module.mk
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index 3b461625697..5e417b33d90 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -20,29 +20,18 @@
  */
 
 #include "darkseed/console.h"
+#include "common/debug.h"
 
 namespace Darkseed {
 
-Console::Console(TosText *tosText) : GUI::Debugger(), tosText(tosText) {
-	registerCmd("tostext",   WRAP_METHOD(Console, Cmd_tostext));
-}
-
-Console::~Console() {
-}
-
-bool Console::Cmd_tostext(int argc, const char **argv) {
-	if (argc != 2) {
-		debugPrintf("Usage: tostext <index>\n");
-		return true;
+Console::Console(TosText *tosText) : _tosText(tosText) {
+	if(!_font.load("tosfont.nsp")) {
+		error("Error loading tosfont.nsp");
 	}
+}
 
-	uint16 textIdx = atoi(argv[1]);
-	if (textIdx < tosText->getNumEntries()) {
-		debugPrintf("%s\n", tosText->getText(textIdx).c_str());
-	} else {
-		debugPrintf("index too large!\n");
-	}
-	return true;
+void Console::printTosText(int tosIndex) {
+	debug(_tosText->getText(tosIndex).c_str());
 }
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
index 59134f1ded9..3dc18debae1 100644
--- a/engines/darkseed/console.h
+++ b/engines/darkseed/console.h
@@ -23,19 +23,20 @@
 #ifndef DARKSEED_CONSOLE_H
 #define DARKSEED_CONSOLE_H
 
-#include "gui/debugger.h"
 #include "tostext.h"
+#include "nsp.h"
 
 namespace Darkseed {
 
-class Console : public GUI::Debugger {
+class Console  {
 private:
-	TosText *tosText;
-private:
-	bool Cmd_tostext(int argc, const char **argv);
+	TosText *_tosText;
+	Nsp _font;
+
 public:
 	Console(TosText *tostext);
-	~Console() override;
+
+	void printTosText(int tosIndex);
 };
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 7d6d816d983..6d42bf60e89 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -28,6 +28,7 @@
 #include "common/system.h"
 #include "darkseed/console.h"
 #include "darkseed/detection.h"
+#include "debugconsole.h"
 #include "engines/util.h"
 #include "graphics/palette.h"
 #include "img.h"
@@ -63,6 +64,8 @@ Common::Error DarkseedEngine::run() {
 	_screen = new Graphics::Screen();
 	_tosText = new TosText();
 	_tosText->load();
+	_console = new Console(_tosText);
+
 	Img left00Img;
 	left00Img.load("art/left00.img");
 	Img left01Img;
@@ -76,7 +79,7 @@ Common::Error DarkseedEngine::run() {
 	lettersAnm.getImg(7, letterD1);
 
 	// Set the engine's debugger console
-	setDebugger(new Console(_tosText));
+	setDebugger(new DebugConsole(_tosText));
 
 	// If a savegame was selected from the launcher, load it
 	int saveSlot = ConfMan.getInt("save_slot");
@@ -212,6 +215,7 @@ void DarkseedEngine::handlePointerAction() {
 void DarkseedEngine::changeToRoom(int newRoomNumber) {
 	delete _room;
 	_room = new Room(newRoomNumber);
+	_room->printRoomDescriptionText();
 }
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 418ad90ad6b..4a23133ca97 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -34,9 +34,11 @@
 #include "engines/savestate.h"
 #include "graphics/screen.h"
 
+#include "console.h"
 #include "cursor.h"
 #include "darkseed/detection.h"
 #include "nsp.h"
+#include "player.h"
 #include "room.h"
 #include "tostext.h"
 
@@ -67,8 +69,10 @@ public:
 	Cursor _cursor;
 	Graphics::Screen *_screen = nullptr;
 	TosText *_tosText = nullptr;
+	Console *_console = nullptr;
 	Room *_room = nullptr;
 	ActionMode _actionMode = PointerAction;
+	Player _player;
 
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
new file mode 100644
index 00000000000..2d49f753af3
--- /dev/null
+++ b/engines/darkseed/debugconsole.cpp
@@ -0,0 +1,48 @@
+/* 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 "darkseed/debugconsole.h"
+
+namespace Darkseed {
+
+DebugConsole::DebugConsole(TosText *tosText) : GUI::Debugger(), tosText(tosText) {
+	registerCmd("tostext",   WRAP_METHOD(DebugConsole, Cmd_tostext));
+}
+
+DebugConsole::~DebugConsole() {
+}
+
+bool DebugConsole::Cmd_tostext(int argc, const char **argv) {
+	if (argc != 2) {
+		debugPrintf("Usage: tostext <index>\n");
+		return true;
+	}
+
+	uint16 textIdx = atoi(argv[1]);
+	if (textIdx < tosText->getNumEntries()) {
+		debugPrintf("%s\n", tosText->getText(textIdx).c_str());
+	} else {
+		debugPrintf("index too large!\n");
+	}
+	return true;
+}
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/debugconsole.h b/engines/darkseed/debugconsole.h
new file mode 100644
index 00000000000..e3e36e7c8ae
--- /dev/null
+++ b/engines/darkseed/debugconsole.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 DARKSEED_DEBUGCONSOLE_H
+#define DARKSEED_DEBUGCONSOLE_H
+
+#include "gui/debugger.h"
+#include "tostext.h"
+
+namespace Darkseed {
+
+class DebugConsole : public GUI::Debugger {
+private:
+	TosText *tosText;
+private:
+	bool Cmd_tostext(int argc, const char **argv);
+public:
+	DebugConsole(TosText *tostext);
+	~DebugConsole() override;
+};
+
+} // End of namespace Darkseed
+
+#endif // DARKSEED_DEBUGCONSOLE_H
diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
index f102adb6eb4..bc80ce39d54 100644
--- a/engines/darkseed/module.mk
+++ b/engines/darkseed/module.mk
@@ -2,6 +2,7 @@ MODULE := engines/darkseed
 
 MODULE_OBJS = \
 	darkseed.o \
+	debugconsole.o \
 	console.o \
 	anm.o \
 	img.o \
@@ -12,7 +13,8 @@ MODULE_OBJS = \
 	tostext.o \
 	metaengine.o \
 	room.o \
-	cursor.o
+	cursor.o \
+	player.o
 
 # This module can be built as a plugin
 ifeq ($(ENABLE_DARKSEED), DYNAMIC_PLUGIN)
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
new file mode 100644
index 00000000000..a5a2b94c1a0
--- /dev/null
+++ b/engines/darkseed/player.cpp
@@ -0,0 +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/>.
+*
+*/
+
+#include "player.h"
+
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
new file mode 100644
index 00000000000..5beacc38178
--- /dev/null
+++ b/engines/darkseed/player.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 DARKSEED_PLAYER_H
+#define DARKSEED_PLAYER_H
+
+#include "common/rect.h"
+
+namespace Darkseed {
+
+class Player {
+public:
+	int _frameIdx = 0;
+	int _direction = 0;
+	Common::Point _position;
+
+public:
+	void updateSprite();
+	void draw();
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_PLAYER_H
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index dfa2e1c33bb..5e81d21b163 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -22,6 +22,26 @@
 #include "room.h"
 #include "darkseed.h"
 
+const static int roomDescriptionTextTbl[] = {
+	0, 138, 165, 165,
+	181, 243, 254, 292,
+	369, 397, 420, 429,
+	438, 447, 463, 473,
+	502, 520, 546, 564,
+	564, 564, 564, 0,
+	569, 574, 574, 574,
+	563, 0, 748, 739,
+	738, 723, 704, 612,
+	619, 0, 758, 0,
+	770, 777, 779, 790,
+	778, 801, 809, 0,
+	810, 811, 814, 821,
+	0, 828, 810, 810,
+	850, 860, 867, 874,
+	886, 651, 682, 701,
+	702, 701, 898, 899,
+	903};
+
 Darkseed::Room::Room(int roomNumber) : _roomNumber(roomNumber) {
 	room1.resize(8);
 	walkableLocationsMap.resize(16);
@@ -237,3 +257,10 @@ bool Darkseed::Room::canWalkAtLocation(int x, int y) {
 
 	return (walkableLocationsMap[t / 8].strip[(y - 40) / 5] >> (7 - (t % 8) & 0x1f) & 1);
 }
+
+void Darkseed::Room::printRoomDescriptionText() const {
+	int textId = roomDescriptionTextTbl[_roomNumber];
+	if (textId != 0) {
+		g_engine->_console->printTosText(textId);
+	}
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index 1aaa83a37d3..a7f11b30369 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -79,7 +79,7 @@ public:
 	bool exitRoom();
 	Common::String getRoomFilenameBase(int roomNumber);
 	bool canWalkAtLocation(int x, int y);
-
+	void printRoomDescriptionText() const;
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);


Commit: 86dc3f5b6011d2611b58a0a51aa97f10b7f6a93d
    https://github.com/scummvm/scummvm/commit/86dc3f5b6011d2611b58a0a51aa97f10b7f6a93d
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Started work on animations. Added start of Player class.

Changed paths:
  A engines/darkseed/sprites.cpp
  A engines/darkseed/sprites.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/module.mk
    engines/darkseed/nsp.cpp
    engines/darkseed/nsp.h
    engines/darkseed/player.cpp
    engines/darkseed/player.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 6d42bf60e89..20b30b30bfe 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -65,6 +65,7 @@ Common::Error DarkseedEngine::run() {
 	_tosText = new TosText();
 	_tosText->load();
 	_console = new Console(_tosText);
+	_player = new Player();
 
 	Img left00Img;
 	left00Img.load("art/left00.img");
@@ -111,6 +112,11 @@ Common::Error DarkseedEngine::run() {
 	_cursor.updatePosition(0x140,0xaf);
 	_cursor.setCursorType(Pointer);
 
+	_player->_position.x = 0x87;
+	_player->_position.y = 0x5b;
+	_player->_direction = 1;
+	_player->_frameIdx = 0;
+
 //	Pic room;
 //	room.load("bed1a.pic");
 //	_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
@@ -119,7 +125,7 @@ Common::Error DarkseedEngine::run() {
 //	roomPal.load("room0.pal");
 
 	Nsp playerNsp;
-	playerNsp.load("cbase.nsp"); //"cplayer.nsp");
+	playerNsp.load("bedsleep.nsp"); //"cplayer.nsp");
 //	const Sprite &s = playerNsp.getSpriteAt(11);
 //
 //	_screen->copyRectToSurfaceWithKey(s.pixels.data(), s.width, 0x45 + 220, 0x28 + 40, s.width, s.height, 0xf);
@@ -129,6 +135,7 @@ Common::Error DarkseedEngine::run() {
 	gameloop();
 
 	delete _room;
+	delete _player;
 
 	return Common::kNoError;
 }
@@ -158,9 +165,11 @@ void DarkseedEngine::gameloop() {
 	while (!shouldQuit()) {
 		updateEvents();
 		handleInput();
+		updateDisplay();
 		_room->update();
 		_frame.draw();
 		_room->draw();
+		_sprites.drawSprites();
 		_cursor.draw();
 		_screen->makeAllDirty();
 		_screen->update();
@@ -218,4 +227,18 @@ void DarkseedEngine::changeToRoom(int newRoomNumber) {
 	_room->printRoomDescriptionText();
 }
 
+void DarkseedEngine::updateDisplay() {
+	const Sprite &playerSprite = _player->getSprite(_player->_frameIdx);
+	uint8 scaledWidth = playerSprite.width;
+	uint8 scaledHeight = playerSprite.height;
+
+	_sprites.addSpriteToDrawList(
+		_player->_position.x - (playerSprite.width / 2),
+		_player->_position.y ,//- scaledHeight,
+		&playerSprite,
+		240 - _player->_position.y,
+		scaledWidth,
+		scaledHeight, 0);
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 4a23133ca97..7b8ea35e0a6 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -40,6 +40,7 @@
 #include "nsp.h"
 #include "player.h"
 #include "room.h"
+#include "sprites.h"
 #include "tostext.h"
 
 namespace Darkseed {
@@ -72,7 +73,11 @@ public:
 	Console *_console = nullptr;
 	Room *_room = nullptr;
 	ActionMode _actionMode = PointerAction;
-	Player _player;
+	Player *_player = nullptr;
+	Sprites _sprites;
+
+	int _currentDay = 1;
+	int _currentTimeInSeconds = 0x7e8e;
 
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
@@ -123,6 +128,8 @@ public:
 
 	void fadeIn();
 	void fadeOut();
+
+	void updateDisplay();
 private:
 	void fadeInner(int startValue, int endValue, int increment);
 	void gameloop();
diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
index bc80ce39d54..5359b56ac9a 100644
--- a/engines/darkseed/module.mk
+++ b/engines/darkseed/module.mk
@@ -14,7 +14,8 @@ MODULE_OBJS = \
 	metaengine.o \
 	room.o \
 	cursor.o \
-	player.o
+	player.o \
+	sprites.o
 
 # This module can be built as a plugin
 ifeq ($(ENABLE_DARKSEED), DYNAMIC_PLUGIN)
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index 75dcef59cfe..adac7bc175e 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -65,6 +65,8 @@ bool Darkseed::Nsp::load(const Common::String &filename) {
 	file.close();
 	if (ret) {
 		debug("Loaded %s", filename.c_str());
+		Common::String obtFilename = filename.substr(0, filename.size() - 4) + ".obt";
+		ret = loadObt(obtFilename);
 	}
 	return ret;
 }
@@ -90,3 +92,39 @@ bool Darkseed::Nsp::load(Common::SeekableReadStream &readStream) {
 const Darkseed::Sprite &Darkseed::Nsp::getSpriteAt(int index) {
 	return frames[index];
 }
+
+bool Darkseed::Nsp::loadObt(const Common::String &filename) {
+	Common::File file;
+	if(!file.open(filename)) {
+		return false;
+	}
+
+	animations.resize(20);
+	for (int i = 0; i < 20; i++) {
+		animations[i].numFrames = file.readByte();
+
+		for (int j = 0; j < 20; j++) {
+			file.readByte();
+			int msb = file.readUint16BE();
+			animations[i].deltaX.push_back(msb);
+			file.readByte();
+			msb = file.readUint16BE();
+			animations[i].deltaY.push_back(msb);
+			animations[i].frameNo.push_back(file.readByte());
+			animations[i].frameDuration.push_back(file.readByte());
+		}
+	}
+
+	file.close();
+
+	debug("Loaded %s", filename.c_str());
+	return true;
+}
+
+Darkseed::Obt::Obt() {
+	numFrames = 0;
+	deltaX.reserve(20);
+	deltaY.reserve(20);
+	frameNo.reserve(20);
+	frameDuration.reserve(20);
+}
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
index 1840dd7af87..47446ab8a77 100644
--- a/engines/darkseed/nsp.h
+++ b/engines/darkseed/nsp.h
@@ -40,9 +40,20 @@ public:
 	void draw(int x, int y) const;
 };
 
+class Obt {
+public:
+	uint8 numFrames;
+	Common::Array<uint32> deltaX;
+	Common::Array<uint32> deltaY;
+	Common::Array<uint8> frameNo;
+	Common::Array<uint8> frameDuration;
+	Obt();
+};
+
 class Nsp {
 private:
 	Common::Array<Sprite> frames;
+	Common::Array<Obt> animations;
 
 public:
 	bool load(const Common::String &filename);
@@ -50,6 +61,7 @@ public:
 
 private:
 	bool load(Common::SeekableReadStream &readStream);
+	bool loadObt(const Common::String &filename);
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index a5a2b94c1a0..8358f98576f 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -21,3 +21,12 @@
 
 #include "player.h"
 
+Darkseed::Player::Player() {
+	_cPlayerSprites.load("cplayer.nsp");
+	_gPlayerSprites.load("gplayer.nsp");
+}
+
+const Darkseed::Sprite &Darkseed::Player::getSprite(int frameNo) {
+	// TODO switch sprite based on over or underworld.
+	return _cPlayerSprites.getSpriteAt(frameNo);
+}
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index 5beacc38178..7fafd2cb754 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -23,16 +23,23 @@
 #define DARKSEED_PLAYER_H
 
 #include "common/rect.h"
+#include "nsp.h"
 
 namespace Darkseed {
 
 class Player {
+private:
+	Nsp _cPlayerSprites;
+	Nsp _gPlayerSprites;
+
 public:
 	int _frameIdx = 0;
 	int _direction = 0;
 	Common::Point _position;
 
 public:
+	Player();
+	const Sprite &getSprite(int frameNo);
 	void updateSprite();
 	void draw();
 };
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
new file mode 100644
index 00000000000..b6481a8862f
--- /dev/null
+++ b/engines/darkseed/sprites.cpp
@@ -0,0 +1,69 @@
+/* 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 "sprites.h"
+#define DARKSEED_MAX_SPRITES_ON_SCREEN 30
+
+Darkseed::Sprites::Sprites() {
+	spriteDrawList.reserve(DARKSEED_MAX_SPRITES_ON_SCREEN);
+}
+
+void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Darkseed::Sprite *sprite, uint8 order, uint8 destW, uint8 destH, uint8 unk10) {
+	if (spriteDrawList.size() == DARKSEED_MAX_SPRITES_ON_SCREEN || destX >= 570) {
+		return;
+	}
+
+	SpriteDrawInstruction drawInstruction;
+	drawInstruction.destX = destX;
+	drawInstruction.destY = destY;
+	drawInstruction.sprite = sprite;
+	drawInstruction.order = order;
+	drawInstruction.destW = destW;
+	drawInstruction.destH = destH;
+	drawInstruction.unk10 = unk10;
+
+	if (!spriteDrawList.empty()) {
+		int insertLocation = 0;
+		for (; insertLocation < spriteDrawList.size(); insertLocation++) {
+			if (order < spriteDrawList[insertLocation].order) {
+				break;
+			}
+		}
+		spriteDrawList.insert_at(insertLocation, drawInstruction);
+	} else {
+		spriteDrawList.push_back(drawInstruction);
+	}
+}
+
+void Darkseed::Sprites::clearSpriteDrawList() {
+	// not using clear() here to avoid freeing array storage memory.
+	while(!spriteDrawList.empty()) {
+		spriteDrawList.pop_back();
+	}
+}
+
+void Darkseed::Sprites::drawSprites() {
+	while (!spriteDrawList.empty()) {
+		SpriteDrawInstruction &drawInstruction = spriteDrawList.back();
+		drawInstruction.sprite->draw(drawInstruction.destX, drawInstruction.destY); // TODO apply scaling!
+		spriteDrawList.pop_back();
+	}
+}
diff --git a/engines/darkseed/sprites.h b/engines/darkseed/sprites.h
new file mode 100644
index 00000000000..20fb8077277
--- /dev/null
+++ b/engines/darkseed/sprites.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 DARKSEED_SPRITES_H
+#define DARKSEED_SPRITES_H
+
+#include "common/scummsys.h"
+#include "nsp.h"
+
+namespace Darkseed {
+
+struct SpriteDrawInstruction {
+	uint16 destX = 0;
+	uint16 destY = 0;
+	uint16 srcW = 0;
+	uint16 srcH = 0;
+	const Sprite *sprite = nullptr;
+	uint8 order = 0;
+	uint8 destW = 0;
+	uint8 destH = 0;
+	uint8 unk10 = 0;
+};
+
+class Sprites {
+private:
+	Common::Array<SpriteDrawInstruction> spriteDrawList;
+public:
+	Sprites();
+	void addSpriteToDrawList(uint16 destX, uint16 destY, const Sprite *sprite, uint8 order, uint8 destW, uint8 destH, uint8 unk10);
+	void clearSpriteDrawList();
+
+	void drawSprites();
+};
+
+} // namespace Darkseed
+#endif // DARKSEED_SPRITES_H


Commit: f0ce43dec12e91b335e1a9a698d832a7bd143026
    https://github.com/scummvm/scummvm/commit/f0ce43dec12e91b335e1a9a698d832a7bd143026
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Work on player animations. Added initial bed wake animation.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/nsp.cpp
    engines/darkseed/nsp.h
    engines/darkseed/player.cpp
    engines/darkseed/player.h
    engines/darkseed/sprites.cpp
    engines/darkseed/sprites.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 20b30b30bfe..fb71ad9f058 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -124,13 +124,24 @@ Common::Error DarkseedEngine::run() {
 //	Pal roomPal;
 //	roomPal.load("room0.pal");
 
-	Nsp playerNsp;
-	playerNsp.load("bedsleep.nsp"); //"cplayer.nsp");
+//	Nsp playerNsp;
+//	playerNsp.load("bedsleep.nsp"); //"cplayer.nsp");
 //	const Sprite &s = playerNsp.getSpriteAt(11);
 //
 //	_screen->copyRectToSurfaceWithKey(s.pixels.data(), s.width, 0x45 + 220, 0x28 + 40, s.width, s.height, 0xf);
 
-	_room = new Room(5);
+	_room = new Room(0);
+
+	if (prefsCutsceneId == 'I' || ((prefsCutsceneId == 'S' || prefsCutsceneId == 'B' || prefsCutsceneId == 'C') &&
+		  _room->_roomNumber == 0)) {
+		_player->loadAnimations("bedsleep.nsp");
+		_player->_position.x = 0x87;
+		_player->_position.y = 0x5b;
+		_player->_frameIdx = 0;
+		_player->_direction = 1;
+		setupOtherNspAnimation(0, 1);
+//		bVar1 = true;
+	}
 
 	gameloop();
 
@@ -198,18 +209,29 @@ void DarkseedEngine::wait() {
 }
 
 void DarkseedEngine::handleInput() {
-	if (_isRightMouseClicked) {
-		if (_actionMode == LookAction) {
-			_actionMode = PointerAction;
-		} else if (_actionMode == PointerAction) {
-			_actionMode = HandAction;
-		} else if (_actionMode == HandAction) {
-			_actionMode = LookAction;
+	if (!isPlayingAnimation_maybe) {
+		if (_isRightMouseClicked) {
+			if (_actionMode == LookAction) {
+				_actionMode = PointerAction;
+			} else if (_actionMode == PointerAction) {
+				_actionMode = HandAction;
+			} else if (_actionMode == HandAction) {
+				_actionMode = LookAction;
+			}
+			_cursor.setCursorType((CursorType)_actionMode);
+		} else if (_isLeftMouseClicked) {
+			// TODO do actions here.
+			handlePointerAction();
 		}
-		_cursor.setCursorType((CursorType)_actionMode);
-	} else if (_isLeftMouseClicked) {
-		// TODO do actions here.
-		handlePointerAction();
+	} else {
+		updateAnimation();
+//		uVar7 = playerSpriteX_maybe;
+//		uVar5 = playerSpriteY_maybe;
+//		if ((isPlayingAnimation_maybe == False) && (DAT_2c85_6b17 != '\0')) {
+//			FUN_2022_7508();
+//			uVar7 = playerSpriteX_maybe;
+//			uVar5 = playerSpriteY_maybe;
+//		}
 	}
 }
 
@@ -228,17 +250,236 @@ void DarkseedEngine::changeToRoom(int newRoomNumber) {
 }
 
 void DarkseedEngine::updateDisplay() {
-	const Sprite &playerSprite = _player->getSprite(_player->_frameIdx);
-	uint8 scaledWidth = playerSprite.width;
-	uint8 scaledHeight = playerSprite.height;
-
-	_sprites.addSpriteToDrawList(
-		_player->_position.x - (playerSprite.width / 2),
-		_player->_position.y ,//- scaledHeight,
-		&playerSprite,
-		240 - _player->_position.y,
-		scaledWidth,
-		scaledHeight, 0);
+	int currentRoomNumber = _room->_roomNumber;
+	_sprites.clearSpriteDrawList();
+//	FUN_2022_2ca7();
+//	FUN_2022_413a();
+	if (isPlayingAnimation_maybe == 0 ||
+		(otherNspAnimationType_maybe != 6 && otherNspAnimationType_maybe != 7) || currentRoomNumber != 5) {
+		DAT_2c85_8326_blit_related = 0xf0;
+	}
+	else {
+		DAT_2c85_8326_blit_related = 0xd0;
+	}
+
+	if (currentRoomNumber != 0x22 && currentRoomNumber != 0x13 &&
+		  currentRoomNumber != 0x14 && currentRoomNumber != 0x15 && currentRoomNumber != 0x16 &&
+		 DAT_2c85_825c != 9 && (currentRoomNumber != 0x35 || DAT_2c85_819c != 2)) {
+		if (((otherNspAnimationType_maybe == 0x3c) || (otherNspAnimationType_maybe == 0x3d)) &&
+			isPlayingAnimation_maybe) {
+//			uVar7 = *(undefined2 *)((int)nspWidthTbl + _player->_frameIdx * 2);
+//			uVar1 = *(uint *)((int)nspHeightTbl + _player->_frameIdx * 2);
+//			addSpriteToDraw(0x1af,0x42,uVar7,uVar1,*(undefined2 *)((int)nspPixelPtrTbl + _player->_frameIdx * 4),
+//							*(undefined2 *)((int)&nspPixelPtrTbl[0].Offset + _player->_frameIdx * 4),0xff,uVar7,uVar1,
+//							uVar1 & 0xff00);
+		}
+		if (!isWearingHeadBand || (headAcheMessageCounter & 1) != 0) {
+			if (!isPlayingAnimation_maybe || otherNspAnimationType_maybe == 0x13
+				|| otherNspAnimationType_maybe == 0x17) {
+//				calculateScaledPlayerSpriteDimensions(uVar7,uVar4,playerSpriteY_maybe);
+				if ((currentRoomNumber != 0x35) || (DAT_2c85_81e0 != 2)) {
+					const Sprite &playerSprite = _player->getSprite(_player->_frameIdx);
+					uint8 scaledWidth = playerSprite.width;
+					uint8 scaledHeight = playerSprite.height;
+					_sprites.addSpriteToDrawList(
+						_player->_position.x - (scaledWidth / 2),
+						_player->_position.y - scaledHeight,
+						&playerSprite,
+						240 - _player->_position.y,
+						scaledWidth,
+						scaledHeight, player_sprite_related_2c85_82f3);
+				}
+			} else {
+				if (otherNspAnimationType_maybe == 0x25) {
+//					uVar1 = (uint)BYTE_ARRAY_2c85_41e7[1];
+//					uVar7 = *(undefined2 *)((int)CPlayerSpriteWidthTbl + uVar1 * 2);
+//					uVar4 = *(undefined2 *)((int)CPlayerSpriteHeightTbl + uVar1 * 2);
+//					calculateScaledPlayerSpriteDimensions(uVar7,uVar4,playerSpriteY_maybe);
+//					addSpriteToDraw(playerSpriteX_maybe - (_curPlayerSpriteWidth & 0xff) / 2,
+//									playerSpriteY_maybe - (_curPlayerSpriteHeight_maybe & 0xff),uVar7,uVar4,
+//									*(undefined2 *)((int)CPlayerSpritePtrTbl + uVar1 * 4),
+//									*(undefined2 *)((int)&CPlayerSpritePtrTbl[0].Offset + uVar1 * 4),0xf0 - playerSpriteY_maybe ,
+//									_curPlayerSpriteWidth,_curPlayerSpriteHeight_maybe,_player_sprite_related_2c85_82f3);
+				}
+				if (otherNspAnimationType_maybe == 0x27 || otherNspAnimationType_maybe == 0x3b ||
+					 otherNspAnimationType_maybe == 0x3c || otherNspAnimationType_maybe == 0x3d) {
+//					uVar1 = (uint)BYTE_ARRAY_2c85_41e7[1];
+//					uVar7 = *(undefined2 *)((int)CPlayerSpriteWidthTbl + uVar1 * 2);
+//					uVar4 = *(undefined2 *)((int)CPlayerSpriteHeightTbl + uVar1 * 2);
+//					calculateScaledPlayerSpriteDimensions(uVar7,uVar4,playerSpriteY_maybe);
+//					addSpriteToDraw(playerSpriteX_maybe - (_curPlayerSpriteWidth & 0xff) / 2,
+//									playerSpriteY_maybe - (_curPlayerSpriteHeight_maybe & 0xff),uVar7,uVar4,
+//									*(undefined2 *)((int)CPlayerSpritePtrTbl + uVar1 * 4),
+//									*(undefined2 *)((int)&CPlayerSpritePtrTbl[0].Offset + uVar1 * 4),0xf0 - playerSpriteY_maybe ,
+//									_curPlayerSpriteWidth,_curPlayerSpriteHeight_maybe,_player_sprite_related_2c85_82f3);
+//					if ((otherNspAnimationType_maybe == 0x3c) || (otherNspAnimationType_maybe == 0x3d)) {
+//						sprite_y_scaling_threshold_maybe = 0xf0;
+//						drawInventory();
+//						updateScreen();
+//						DAT_2c85_985d = cursorYPosition;
+//						return;
+//					}
+				}
+//				iVar9 = *(int *)((int)otherNspWidthTbl + _player->_frameIdx * 2);
+//				iVar8 = *(int *)((int)&otherNspHeightTbl + _player->_frameIdx * 2);
+				if (otherNspAnimationType_maybe == 0x12) {
+					if (trunkPushCounter == 0) {
+						sprite_y_scaling_threshold_maybe = 0xcb;
+					}
+					else if (trunkPushCounter == 1) {
+						sprite_y_scaling_threshold_maybe = 0xcb;
+					}
+					else if (trunkPushCounter == 2) {
+						sprite_y_scaling_threshold_maybe = 0xc4;
+					}
+					else {
+						sprite_y_scaling_threshold_maybe = 0xaf;
+					}
+				}
+
+				if (nsp_sprite_scaling_y_position == 0) {
+//					calculateScaledPlayerSpriteDimensions(iVar9,iVar8,playerSpriteY_maybe);
+//					bVar6 = extraout_AH_00;
+				}
+				else {
+//					calculateScaledPlayerSpriteDimensions(iVar9,iVar8,nsp_sprite_scaling_y_position);
+//					bVar6 = extraout_AH;
+				}
+
+				if (otherNspAnimationType_maybe == 3) {
+//					uVar1 = _curPlayerSpriteWidth & 0xff;
+//					uVar2 = _curPlayerSpriteHeight_maybe & 0xff;
+//					calculateScaledPlayerSpriteDimensions
+//						(*(undefined2 *)((int)otherNspWidthTbl + (_player->_frameIdx + 1) * 2),
+//						 *(undefined2 *)((int)&otherNspHeightTbl + (_player->_frameIdx + 1) * 2),playerSpriteY_maybe);
+//					if (otherNspAnimationType_maybe == 3) {
+//						uVar3 = ((_curPlayerSpriteWidth & 0xff) + uVar1) / 2;
+//						iVar5 = playerSpriteX_maybe - uVar3;
+//					}
+//					else {
+//						uVar11 = 0;
+//						uVar10 = 1000;
+//						uVar7 = LONG_2c85_8116._2_2_;
+//						uVar4 = LXMUL@(CONCAT22((undefined2)LONG_2c85_8116,LONG_2c85_8116._2_2_),0x2d0000);
+//						uVar3 = LUMOD@(uVar4,uVar7,uVar10,uVar11);
+//						iVar5 = playerSpriteX_maybe - uVar3;
+//					}
+//					addSpriteToDraw(iVar5,playerSpriteY_maybe - uVar2,iVar9,iVar8,
+//									*(undefined2 *)((int)otherNspSpritePtr + _player->_frameIdx * 4),
+//									*(undefined2 *)((int)&otherNspSpritePtr[0].Offset + _player->_frameIdx * 4),
+//									0xf0 - playerSpriteY_maybe,uVar1,uVar2,uVar3 & 0xff00);
+//					bVar6 = extraout_AH_01;
+				} else if (!BoolEnum_2c85_985) {
+					if (otherNspAnimationType_maybe == 0x11) {
+//						addSpriteToDraw(playerSpriteX_maybe - (int)otherNspWidthTbl[0] / 2,playerSpriteY_maybe - iVar8,iVar9,iVa r8,
+//										*(undefined2 *)((int)otherNspSpritePtr + _player->_frameIdx * 4),
+//										*(undefined2 *)((int)&otherNspSpritePtr[0].Offset + _player->_frameIdx * 4),
+//										0xf0 - playerSpriteY_maybe,iVar9,iVar8,_player_sprite_related_2c85_82f3);
+//						bVar6 = extraout_AH_02;
+					} else if (otherNspAnimationType_maybe == 5 || otherNspAnimationType_maybe == 1) {
+						int x = 0xa6;
+						int y = 0x69;
+						if (_player->_frameIdx < 4) {
+							x = 0x75;
+							y = 0x71;
+						}
+						else if (_player->_frameIdx == 4) {
+							x = 0x75;
+							y = 0x69;
+						}
+						else if (_player->_frameIdx == 7) {
+							x = 0xa6;
+							y = 0x5b;
+						}
+
+						/* bed wake sequence is played here. */
+						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+						_sprites.addSpriteToDrawList(x, y, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+//						addSpriteToDraw(x,y,iVar9,iVar8,*(undefined2 *)((int)otherNspSpritePtr + _player->_frameIdx *  4),
+//										*(undefined2 *)((int)&otherNspSpritePtr[0].Offset + _player->_frameIdx * 4),
+//										0xf0 - playerSpriteY_maybe,iVar9,iVar8,_player_sprite_related_2c85_82f3);
+//						bVar6 = extraout_AH_03;
+					} // TODO continue adding logic here. else if (....
+				}
+			}
+		}
+	}
+}
+
+void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
+	assert(nspAnimIdx < 20);
+	_player->_playerIsMoving_maybe = false;
+	nsp_sprite_scaling_y_position = 0;
+	BoolEnum_2c85_985a = false;
+
+	animIndexTbl[nspAnimIdx] = 0;
+	spriteAnimCountdownTimer[nspAnimIdx] = _player->_animations.getAnimAt(nspAnimIdx).frameDuration[0];
+	isPlayingAnimation_maybe = true;
+	otherNspAnimationType_maybe = animId;
+	_player->_frameIdx = _player->_animations.getAnimAt(nspAnimIdx).frameNo[0];
+
+	player_sprite_related_2c85_82f3 = 0;
+	isAnimFinished_maybe = false;
+
+	if (otherNspAnimationType_maybe < 2) {
+		return;
+	}
+
+	// TODO big switch here to init the different animation types.
+	switch (otherNspAnimationType_maybe - 2) {
+	default:
+		break;
+	}
+}
+
+void DarkseedEngine::updateAnimation() {
+	switch (otherNspAnimationType_maybe) {
+	case 0: break;
+	case 1 : // sleep wake anim
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		}
+		else {
+			_player->_position.x = 0xdf;
+			_player->_position.y = 0xbe;
+			_player->_walkTarget.x = 0xdf;
+			_player->_walkTarget.y = 0xbe;
+			_player->updateSprite();
+		}
+		break;
+	default:
+		error("Unhandled animation type! %d", otherNspAnimationType_maybe);
+	}
+}
+
+void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
+	if (!BoolEnum_2c85_985a) {
+//		LONG_2c85_8116._2_2_ = 0;
+//		LONG_2c85_8116._0_2_ = 1000;
+	}
+	else {
+//		calculateScaledPlayerSpriteDimensions(10,10,playerSpriteY_maybe);
+	}
+	isAnimFinished_maybe = false;
+	animFrameChanged = false;
+	const Obt &anim = _player->_animations.getAnimAt(nspAminIdx);
+	spriteAnimCountdownTimer[nspAminIdx] = spriteAnimCountdownTimer[nspAminIdx] - 1;
+	if (spriteAnimCountdownTimer[nspAminIdx] < 1) {
+		animFrameChanged = true;
+		animIndexTbl[nspAminIdx] = animIndexTbl[nspAminIdx] + 1;
+		_player->_position.x += (int16)anim.deltaX[animIndexTbl[nspAminIdx]];
+		_player->_position.y += (int16)anim.deltaY[animIndexTbl[nspAminIdx]];
+		if (animIndexTbl[nspAminIdx] == anim.numFrames) {
+			animIndexTbl[nspAminIdx] = 0;
+			isAnimFinished_maybe = true;
+			isPlayingAnimation_maybe = false;
+			_player->_walkTarget.x = _player->_position.x;
+			_player->_walkTarget.y = _player->_position.y;
+			_player->updateSprite();
+		}
+		spriteAnimCountdownTimer[nspAminIdx] = anim.frameDuration[animIndexTbl[nspAminIdx]];
+	}
 }
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 7b8ea35e0a6..dcdef29e430 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -79,6 +79,30 @@ public:
 	int _currentDay = 1;
 	int _currentTimeInSeconds = 0x7e8e;
 
+	bool isPlayingAnimation_maybe = false;
+	uint16 otherNspAnimationType_maybe = 0;
+	bool isWearingHeadBand = false;
+	uint16 headAcheMessageCounter = 0;
+	uint16 trunkPushCounter = 0;
+	int sprite_y_scaling_threshold_maybe = 0xf0;
+	int nsp_sprite_scaling_y_position = 0;
+	bool BoolEnum_2c85_985 = false;
+	bool player_sprite_related_2c85_82f3 = false;
+	int DAT_2c85_8326_blit_related = 0;
+	bool isAnimFinished_maybe = false;
+	bool animFrameChanged = false;
+	char prefsCutsceneId = 'I';
+	int animIndexTbl[20];
+	int spriteAnimCountdownTimer[20];
+
+	// Unknown variables
+	uint16 DAT_2c85_825c = 0;
+	uint16 DAT_2c85_819c = 0;
+	bool BoolEnum_2c85_985a = false;
+	bool BoolEnum_2c85_811c = false;
+	uint16 DAT_2c85_81e0 = 0;
+	uint16 DAT_2c85_7dd7 = 0;
+
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	~DarkseedEngine() override;
@@ -130,7 +154,10 @@ public:
 	void fadeOut();
 
 	void updateDisplay();
+	void setupOtherNspAnimation(int nspAnimIdx, int animId);
 private:
+	void updateAnimation();
+	void advanceAnimationFrame(int nspAminIdx);
 	void fadeInner(int startValue, int endValue, int increment);
 	void gameloop();
 	void updateEvents();
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index adac7bc175e..1472a2cc9d4 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -104,12 +104,17 @@ bool Darkseed::Nsp::loadObt(const Common::String &filename) {
 		animations[i].numFrames = file.readByte();
 
 		for (int j = 0; j < 20; j++) {
-			file.readByte();
-			int msb = file.readUint16BE();
-			animations[i].deltaX.push_back(msb);
-			file.readByte();
-			msb = file.readUint16BE();
-			animations[i].deltaY.push_back(msb);
+			// TODO verify this is the correct way to load negative delta values.
+			if (file.readByte()) {
+				animations[i].deltaX.push_back(file.readSint16BE());
+			} else {
+				animations[i].deltaX.push_back(file.readUint16BE());
+			}
+			if (file.readByte()) {
+				animations[i].deltaY.push_back(file.readSint16BE());
+			} else {
+				animations[i].deltaY.push_back(file.readUint16BE());
+			}
 			animations[i].frameNo.push_back(file.readByte());
 			animations[i].frameDuration.push_back(file.readByte());
 		}
@@ -121,6 +126,10 @@ bool Darkseed::Nsp::loadObt(const Common::String &filename) {
 	return true;
 }
 
+const Darkseed::Obt &Darkseed::Nsp::getAnimAt(int index) {
+	return animations[index];
+}
+
 Darkseed::Obt::Obt() {
 	numFrames = 0;
 	deltaX.reserve(20);
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
index 47446ab8a77..dfdcdabf4f1 100644
--- a/engines/darkseed/nsp.h
+++ b/engines/darkseed/nsp.h
@@ -43,8 +43,8 @@ public:
 class Obt {
 public:
 	uint8 numFrames;
-	Common::Array<uint32> deltaX;
-	Common::Array<uint32> deltaY;
+	Common::Array<int32> deltaX;
+	Common::Array<int32> deltaY;
 	Common::Array<uint8> frameNo;
 	Common::Array<uint8> frameDuration;
 	Obt();
@@ -58,6 +58,7 @@ private:
 public:
 	bool load(const Common::String &filename);
 	const Sprite &getSpriteAt(int index);
+	const Obt &getAnimAt(int index);
 
 private:
 	bool load(Common::SeekableReadStream &readStream);
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 8358f98576f..e9038b1be5d 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -20,6 +20,7 @@
 */
 
 #include "player.h"
+#include "darkseed.h"
 
 Darkseed::Player::Player() {
 	_cPlayerSprites.load("cplayer.nsp");
@@ -30,3 +31,49 @@ const Darkseed::Sprite &Darkseed::Player::getSprite(int frameNo) {
 	// TODO switch sprite based on over or underworld.
 	return _cPlayerSprites.getSpriteAt(frameNo);
 }
+
+bool Darkseed::Player::loadAnimations(const Common::String &filename) {
+	return _animations.load(filename);
+}
+
+uint8 playerSpriteIndexDirectionTbl[] = { 24,  26,  28,  26 };
+bool BYTE_ARRAY_2c85_41eb[] = { false, false, false, true };
+uint16 BYTE_ARRAY_2c85_41e3[] = { 0,   8,  16,   8 };
+
+void Darkseed::Player::updateSprite() {
+	if (!_playerIsMoving_maybe) {
+		if ((_direction == 3) || (_direction == 1)) {
+			g_engine->player_sprite_related_2c85_82f3 = BYTE_ARRAY_2c85_41eb[_direction];
+		}
+		if (_position.x == _walkTarget.x && _position.y == _walkTarget.y && !g_engine->BoolEnum_2c85_811c) {
+			_frameIdx = playerSpriteIndexDirectionTbl[_direction];
+		} else {
+			_frameIdx = g_engine->DAT_2c85_7dd7 + BYTE_ARRAY_2c85_41e3[_direction];
+		}
+		if (_direction == 2) {
+			if (_position.x < _walkTarget.x) {
+				g_engine->player_sprite_related_2c85_82f3 = true;
+			}
+			else if (_walkTarget.x < _position.x) {
+				g_engine->player_sprite_related_2c85_82f3 = false;
+			}
+		}
+		if (_direction == 0) {
+			if (_walkTarget.x < _position.x) {
+				g_engine->player_sprite_related_2c85_82f3 = true;
+			}
+			else if (_position.x < _walkTarget.x) {
+				g_engine->player_sprite_related_2c85_82f3 = false;
+			}
+		}
+	}
+	else {
+		g_engine->player_sprite_related_2c85_82f3 = 4 < playerSpriteWalkIndex_maybe;
+		if (g_engine->player_sprite_related_2c85_82f3) {
+			_frameIdx = 0x20 - playerSpriteWalkIndex_maybe;
+		}
+		else {
+			_frameIdx = playerSpriteWalkIndex_maybe + 0x18;
+		}
+	}
+}
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index 7fafd2cb754..7286c136223 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -33,12 +33,17 @@ private:
 	Nsp _gPlayerSprites;
 
 public:
+	Nsp _animations;
 	int _frameIdx = 0;
 	int _direction = 0;
 	Common::Point _position;
+	Common::Point _walkTarget;
+	uint16 playerSpriteWalkIndex_maybe = 0;
+	bool _playerIsMoving_maybe;
 
 public:
 	Player();
+	bool loadAnimations(const Common::String &filename);
 	const Sprite &getSprite(int frameNo);
 	void updateSprite();
 	void draw();
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
index b6481a8862f..110c201193e 100644
--- a/engines/darkseed/sprites.cpp
+++ b/engines/darkseed/sprites.cpp
@@ -26,7 +26,7 @@ Darkseed::Sprites::Sprites() {
 	spriteDrawList.reserve(DARKSEED_MAX_SPRITES_ON_SCREEN);
 }
 
-void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Darkseed::Sprite *sprite, uint8 order, uint8 destW, uint8 destH, uint8 unk10) {
+void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Darkseed::Sprite *sprite, uint8 order, uint8 destW, uint8 destH, bool unk10) {
 	if (spriteDrawList.size() == DARKSEED_MAX_SPRITES_ON_SCREEN || destX >= 570) {
 		return;
 	}
diff --git a/engines/darkseed/sprites.h b/engines/darkseed/sprites.h
index 20fb8077277..9440ac40ee8 100644
--- a/engines/darkseed/sprites.h
+++ b/engines/darkseed/sprites.h
@@ -36,7 +36,7 @@ struct SpriteDrawInstruction {
 	uint8 order = 0;
 	uint8 destW = 0;
 	uint8 destH = 0;
-	uint8 unk10 = 0;
+	bool unk10 = false;
 };
 
 class Sprites {
@@ -44,7 +44,7 @@ private:
 	Common::Array<SpriteDrawInstruction> spriteDrawList;
 public:
 	Sprites();
-	void addSpriteToDrawList(uint16 destX, uint16 destY, const Sprite *sprite, uint8 order, uint8 destW, uint8 destH, uint8 unk10);
+	void addSpriteToDrawList(uint16 destX, uint16 destY, const Sprite *sprite, uint8 order, uint8 destW, uint8 destH, bool unk10);
 	void clearSpriteDrawList();
 
 	void drawSprites();


Commit: 78739f45637d4e465dc33632a94841a19aea6274
    https://github.com/scummvm/scummvm/commit/78739f45637d4e465dc33632a94841a19aea6274
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Work on logic to handle player direction changes

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/player.cpp
    engines/darkseed/player.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index fb71ad9f058..799c43deee1 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -209,19 +209,68 @@ void DarkseedEngine::wait() {
 }
 
 void DarkseedEngine::handleInput() {
+	int currentRoomNumber = _room->_roomNumber;
+	if (_player->_isAutoWalkingToBed && currentRoomNumber == 0 && _player->isAtPosition(0xdf, 0xbe)) {
+		_player->_isAutoWalkingToBed = false;
+		_currentTimeInSeconds = 0x7e90;
+		_player->loadAnimations("bedsleep.nsp");
+		setupOtherNspAnimation(1,5);
+	}
+
 	if (!isPlayingAnimation_maybe) {
-		if (_isRightMouseClicked) {
-			if (_actionMode == LookAction) {
-				_actionMode = PointerAction;
-			} else if (_actionMode == PointerAction) {
-				_actionMode = HandAction;
-			} else if (_actionMode == HandAction) {
-				_actionMode = LookAction;
+		if (!_player->_playerIsChangingDirection) {
+			if (currentRoomNumber == 0x39 &&_previousRoomNumber == 6) {
+				_player->updateSprite();
+			} else {
+				if (_player->isAtWalkTarget() && !BoolEnum_2c85_811c) {
+					_player->updateSprite();
+				} else {
+					if (counter_2c85_888b >= 0 && !_player->isAtWalkTarget()) {
+						counter_2c85_888b = 0;
+						//						uVar7 = CONCAT11((char)(uVar7 >> 8),DAT_2c85_7dd7 + '\x01') & 0xff07;
+						//						DAT_2c85_7dd7 = (char)uVar7;
+						//						if (((DAT_2c85_7dd7 == '\0') || (DAT_2c85_7dd7 == '\x04')) &&
+						//							((((currentRoomNumber != 0x22 && (currentRoomNumber != 0x13)) && (currentRoomNumber != 0x14)) &&
+						//							  ((currentRoomNumber != 0x15 && (currentRoomNumber != 0x16)))))) {
+						//							FUN_1208_0dac_sound_related(0x5c,CONCAT11((char)(uVar7 >> 8),5));
+						//						}
+					}
+					_player->updateSprite();
+				}
+				if (_isLeftMouseClicked && _cursor.getY() > 0x28 && ~_player->isPlayerWalking_maybe) { // prevLeftMouseButtonState == 0 &&
+					if (_actionMode == PointerAction) {
+						_player->playerFaceWalkTarget();
+
+					} else {
+						int objNum = getObjectUnderCursor();
+						if (objNum != -1) {
+
+						}
+					}
+				}
+
+				if (_isRightMouseClicked) {
+					if (_actionMode == LookAction) {
+						_actionMode = PointerAction;
+					} else if (_actionMode == PointerAction) {
+						_actionMode = HandAction;
+					} else if (_actionMode == HandAction) {
+						_actionMode = LookAction;
+					}
+					_cursor.setCursorType((CursorType)_actionMode);
+				} else if (_isLeftMouseClicked) {
+					// TODO do actions here.
+					handlePointerAction();
+				}
 			}
-			_cursor.setCursorType((CursorType)_actionMode);
-		} else if (_isLeftMouseClicked) {
-			// TODO do actions here.
-			handlePointerAction();
+		} else {
+			// turn player around.
+			_player->playerSpriteWalkIndex_maybe = (int16)((_player->playerSpriteWalkIndex_maybe + _player->playerWalkFrameDeltaOffset) & 7);
+			if (_player->playerSpriteWalkIndex_maybe == _player->playerNewFacingDirection_maybe) {
+				_player->_playerIsChangingDirection = false;
+				_player->_direction = _player->playerNewFacingDirection_maybe / 2;
+			}
+			_player->updateSprite();
 		}
 	} else {
 		updateAnimation();
@@ -408,7 +457,7 @@ void DarkseedEngine::updateDisplay() {
 
 void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 	assert(nspAnimIdx < 20);
-	_player->_playerIsMoving_maybe = false;
+	_player->_playerIsChangingDirection = false;
 	nsp_sprite_scaling_y_position = 0;
 	BoolEnum_2c85_985a = false;
 
@@ -482,4 +531,9 @@ void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
 	}
 }
 
+int DarkseedEngine::getObjectUnderCursor() {
+	// TODO
+	return -1;
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index dcdef29e430..5b52b23bcb2 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -79,6 +79,8 @@ public:
 	int _currentDay = 1;
 	int _currentTimeInSeconds = 0x7e8e;
 
+	uint16 _previousRoomNumber = 0;
+
 	bool isPlayingAnimation_maybe = false;
 	uint16 otherNspAnimationType_maybe = 0;
 	bool isWearingHeadBand = false;
@@ -102,6 +104,7 @@ public:
 	bool BoolEnum_2c85_811c = false;
 	uint16 DAT_2c85_81e0 = 0;
 	uint16 DAT_2c85_7dd7 = 0;
+	int16 counter_2c85_888b = 0;
 
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
@@ -155,6 +158,9 @@ public:
 
 	void updateDisplay();
 	void setupOtherNspAnimation(int nspAnimIdx, int animId);
+
+	int getObjectUnderCursor();
+
 private:
 	void updateAnimation();
 	void advanceAnimationFrame(int nspAminIdx);
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index e9038b1be5d..c3702eb83b3 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -41,7 +41,7 @@ bool BYTE_ARRAY_2c85_41eb[] = { false, false, false, true };
 uint16 BYTE_ARRAY_2c85_41e3[] = { 0,   8,  16,   8 };
 
 void Darkseed::Player::updateSprite() {
-	if (!_playerIsMoving_maybe) {
+	if (!_playerIsChangingDirection) {
 		if ((_direction == 3) || (_direction == 1)) {
 			g_engine->player_sprite_related_2c85_82f3 = BYTE_ARRAY_2c85_41eb[_direction];
 		}
@@ -77,3 +77,80 @@ void Darkseed::Player::updateSprite() {
 		}
 	}
 }
+bool Darkseed::Player::isAtPosition(int x, int y) const {
+	return _position.x == x && _position.y == y;
+}
+
+bool Darkseed::Player::isAtWalkTarget() const {
+	return _position ==_walkTarget;
+}
+
+void Darkseed::Player::changeDirection(int16 oldDir, int16 newDir) {
+	if (oldDir != newDir) {
+		_playerIsChangingDirection = true;
+		playerSpriteWalkIndex_maybe = (int16)(oldDir * 2);
+		playerNewFacingDirection_maybe = (int16)(newDir * 2);
+		playerWalkFrameDeltaOffset = 1;
+		if (oldDir < 4) {
+			switch (oldDir) {
+			case 0 :
+				if (newDir == 3) {
+					playerWalkFrameDeltaOffset = -1;
+				}
+				break;
+			case 1 :
+				if (newDir == 0) {
+					playerWalkFrameDeltaOffset = -1;
+				}
+				break;
+			case 2 :
+				if (newDir == 1) {
+					playerWalkFrameDeltaOffset = -1;
+				}
+				break;
+			case 3 :
+				if (newDir == 2) {
+					playerWalkFrameDeltaOffset = -1;
+				}
+				break;
+			}
+		}
+	}
+}
+
+void Darkseed::Player::playerFaceWalkTarget() {
+	int previousDirection;
+	int xDelta;
+	int yDelta;
+  
+	previousDirection = _direction;
+	if (_position.x < _walkTarget.x) {
+		xDelta = _walkTarget.x - _position.x;
+	}
+	else {
+		xDelta = _position.x - _walkTarget.x;
+	}
+	if (_position.y < _walkTarget.y) {
+		yDelta = _walkTarget.y - _position.y;
+	}
+	else {
+		yDelta = _position.y - _walkTarget.y;
+	}
+	if (yDelta * 2 <= xDelta) {
+		if (_position.x < _walkTarget.x) {
+			_direction = 1;
+		}
+		else if (_walkTarget.x < _position.x) {
+			_direction = 3;
+		}
+	}
+	else if (_position.y < _walkTarget.y) {
+		_direction = 2;
+	}
+	else {
+		_direction = 0;
+	}
+	changeDirection(previousDirection,_direction);
+	updateSprite();
+	_positionLong = _position;
+}
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index 7286c136223..84ee177b3c5 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -37,9 +37,14 @@ public:
 	int _frameIdx = 0;
 	int _direction = 0;
 	Common::Point _position;
+	Common::Point _positionLong; // the original sometimes seems to use a long (4 byte) version of the location
 	Common::Point _walkTarget;
-	uint16 playerSpriteWalkIndex_maybe = 0;
-	bool _playerIsMoving_maybe;
+	int16 playerSpriteWalkIndex_maybe = 0;
+	int16 playerWalkFrameDeltaOffset = 0;
+	int16 playerNewFacingDirection_maybe = 0;
+	bool isPlayerWalking_maybe = false;
+	bool _playerIsChangingDirection = false;
+	bool _isAutoWalkingToBed = false;
 
 public:
 	Player();
@@ -47,6 +52,12 @@ public:
 	const Sprite &getSprite(int frameNo);
 	void updateSprite();
 	void draw();
+
+	bool isAtPosition(int x, int y) const;
+	bool isAtWalkTarget() const;
+
+	void changeDirection(int16 oldDir, int16 newDir);
+	void playerFaceWalkTarget();
 };
 
 } // namespace Darkseed


Commit: d3eb5abf3c491e95b86226c95ab62a5a8b8befc3
    https://github.com/scummvm/scummvm/commit/d3eb5abf3c491e95b86226c95ab62a5a8b8befc3
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Work on player movement logic.

Changed paths:
    engines/darkseed/cursor.cpp
    engines/darkseed/cursor.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/player.cpp
    engines/darkseed/player.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/cursor.cpp b/engines/darkseed/cursor.cpp
index b35679c17cb..f08975badca 100644
--- a/engines/darkseed/cursor.cpp
+++ b/engines/darkseed/cursor.cpp
@@ -26,15 +26,15 @@ void Darkseed::Cursor::setCursorType(enum CursorType newType) {
 	_currentCursorType = newType;
 }
 
-void Darkseed::Cursor::updatePosition(int x, int y) {
-	_x = x;
-	_y = y;
+void Darkseed::Cursor::updatePosition(int16 x, int16 y) {
+	_position.x = x;
+	_position.y = y;
 //	debug("mouse at (%d,%d)", _x, _y);
 }
 
 void Darkseed::Cursor::draw() {
 	const Sprite cursorSprite = g_engine->_baseSprites.getSpriteAt(_currentCursorType);
-	int drawX = _x;
+	int drawX = _position.x;
 	if (drawX + cursorSprite.width > 640) {
 		drawX = 640 - cursorSprite.width;
 	}
@@ -42,7 +42,7 @@ void Darkseed::Cursor::draw() {
 		drawX = 0;
 	}
 
-	int drawY = _y;
+	int drawY = _position.y;
 	if (drawY + cursorSprite.height > 350) {
 		drawY = 350 - cursorSprite.height;
 	}
diff --git a/engines/darkseed/cursor.h b/engines/darkseed/cursor.h
index 84d2a50d33e..0e58fe58202 100644
--- a/engines/darkseed/cursor.h
+++ b/engines/darkseed/cursor.h
@@ -22,7 +22,9 @@
 #ifndef DARKSEED_CURSOR_H
 #define DARKSEED_CURSOR_H
 
+#include "common/rect.h"
 #include "nsp.h"
+
 namespace Darkseed {
 
 enum CursorType {
@@ -37,8 +39,7 @@ enum CursorType {
 
 class Cursor {
 private:
-	int _x = 0;
-	int _y = 0;
+	Common::Point _position;
 	enum CursorType _currentCursorType = Pointer;
 
 public:
@@ -46,14 +47,15 @@ public:
 	void setCursorType(enum CursorType newType);
 	CursorType getCursorType() { return _currentCursorType; }
 
-	int getX() { return _x; }
-	int getY() { return _y; }
+	Common::Point &getPosition() { return _position; }
+	int16 getX() const { return _position.x; }
+	int16 getY() const { return _position.y; }
 
 	int getWidth();
 	int getHeight();
 	const Sprite &getSprite();
 
-	void updatePosition(int x, int y);
+	void updatePosition(int16 x, int16 y);
 	void draw();
 };
 
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 799c43deee1..c1db9590129 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -222,7 +222,7 @@ void DarkseedEngine::handleInput() {
 			if (currentRoomNumber == 0x39 &&_previousRoomNumber == 6) {
 				_player->updateSprite();
 			} else {
-				if (_player->isAtWalkTarget() && !BoolEnum_2c85_811c) {
+				if (_player->isAtWalkTarget() && !_player->BoolEnum_2c85_811c) {
 					_player->updateSprite();
 				} else {
 					if (counter_2c85_888b >= 0 && !_player->isAtWalkTarget()) {
@@ -237,10 +237,10 @@ void DarkseedEngine::handleInput() {
 					}
 					_player->updateSprite();
 				}
-				if (_isLeftMouseClicked && _cursor.getY() > 0x28 && ~_player->isPlayerWalking_maybe) { // prevLeftMouseButtonState == 0 &&
+				if (_isLeftMouseClicked && _cursor.getY() > 0x28 && !_player->isPlayerWalking_maybe) { // prevLeftMouseButtonState == 0 &&
 					if (_actionMode == PointerAction) {
+						_player->calculateWalkTarget();
 						_player->playerFaceWalkTarget();
-
 					} else {
 						int objNum = getObjectUnderCursor();
 						if (objNum != -1) {
@@ -248,8 +248,19 @@ void DarkseedEngine::handleInput() {
 						}
 					}
 				}
-
-				if (_isRightMouseClicked) {
+//				if ((int)playerSpriteX_maybe < (int)walkTargetX) {
+//					local_22 = walkTargetX - playerSpriteX_maybe;
+//				}
+//				else {
+//					local_22 = playerSpriteX_maybe - walkTargetX;
+//				}
+//				if ((int)playerSpriteY_maybe < (int)walkTargetY) {
+//					local_20 = walkTargetY - playerSpriteY_maybe;
+//				}
+//				else {
+//					local_20 = playerSpriteY_maybe - walkTargetY;
+//				}
+				if (_isRightMouseClicked && !_player->isPlayerWalking_maybe) {
 					if (_actionMode == LookAction) {
 						_actionMode = PointerAction;
 					} else if (_actionMode == PointerAction) {
@@ -258,10 +269,26 @@ void DarkseedEngine::handleInput() {
 						_actionMode = LookAction;
 					}
 					_cursor.setCursorType((CursorType)_actionMode);
-				} else if (_isLeftMouseClicked) {
-					// TODO do actions here.
-					handlePointerAction();
 				}
+				if (_player->isAtWalkTarget() && _player->BoolEnum_2c85_811c && _player->walkPathIndex != 0xff) {
+//					if (walkPathIndex + 1 < numConnectorsInWalkPath) {
+//						walkPathIndex = walkPathIndex + 1;
+//						walkTargetX = *(uint *)((int)roomConnectorXPositionTbl +
+//												*(int *)((int)walkPathConnectorList + walkPathIndex * 2) * 2);
+//						walkTargetY = *(uint *)((int)roomConnectorYPositionTbl +
+//												*(int *)((int)walkPathConnectorList + walkPathIndex * 2) * 2);
+//					}
+//					else {
+//						walkTargetX = DAT_2c85_6dd7;
+//						walkTargetY = DAT_2c85_6df1;
+//						walkPathIndex = 0xff;
+//					}
+//					playerFaceWalkTarget();
+				}
+//				else if (_isLeftMouseClicked) {
+//					// TODO do actions here.
+//					handlePointerAction();
+//				}
 			}
 		} else {
 			// turn player around.
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 5b52b23bcb2..9d8cd0f349a 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -80,6 +80,7 @@ public:
 	int _currentTimeInSeconds = 0x7e8e;
 
 	uint16 _previousRoomNumber = 0;
+	uint16 targetRoomNumber = 0;
 
 	bool isPlayingAnimation_maybe = false;
 	uint16 otherNspAnimationType_maybe = 0;
@@ -101,11 +102,14 @@ public:
 	uint16 DAT_2c85_825c = 0;
 	uint16 DAT_2c85_819c = 0;
 	bool BoolEnum_2c85_985a = false;
-	bool BoolEnum_2c85_811c = false;
+	bool BoolByteEnum_2c85_9e67 = false;
+
 	uint16 DAT_2c85_81e0 = 0;
-	uint16 DAT_2c85_7dd7 = 0;
+
 	int16 counter_2c85_888b = 0;
 
+	uint8 DAT_2c85_6b0e = 0; // related to changing rooms.
+
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	~DarkseedEngine() override;
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index c3702eb83b3..f5e39556957 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -38,17 +38,17 @@ bool Darkseed::Player::loadAnimations(const Common::String &filename) {
 
 uint8 playerSpriteIndexDirectionTbl[] = { 24,  26,  28,  26 };
 bool BYTE_ARRAY_2c85_41eb[] = { false, false, false, true };
-uint16 BYTE_ARRAY_2c85_41e3[] = { 0,   8,  16,   8 };
+uint16 walkFrameOffsetTbl[] = { 0,   8,  16,   8 };
 
 void Darkseed::Player::updateSprite() {
 	if (!_playerIsChangingDirection) {
 		if ((_direction == 3) || (_direction == 1)) {
 			g_engine->player_sprite_related_2c85_82f3 = BYTE_ARRAY_2c85_41eb[_direction];
 		}
-		if (_position.x == _walkTarget.x && _position.y == _walkTarget.y && !g_engine->BoolEnum_2c85_811c) {
+		if (_position.x == _walkTarget.x && _position.y == _walkTarget.y && !BoolEnum_2c85_811c) {
 			_frameIdx = playerSpriteIndexDirectionTbl[_direction];
 		} else {
-			_frameIdx = g_engine->DAT_2c85_7dd7 + BYTE_ARRAY_2c85_41e3[_direction];
+			_frameIdx = playerWalkFrameIdx + walkFrameOffsetTbl[_direction];
 		}
 		if (_direction == 2) {
 			if (_position.x < _walkTarget.x) {
@@ -154,3 +154,37 @@ void Darkseed::Player::playerFaceWalkTarget() {
 	updateSprite();
 	_positionLong = _position;
 }
+
+void Darkseed::Player::calculateWalkTarget() {
+	BoolEnum_2c85_811c = true;
+	playerWalkFrameIdx = 0;
+	walkPathIndex = -1;
+	numConnectorsInWalkPath = 0;
+	int selectedObjNum = 0;
+	if(g_engine->_actionMode == PointerAction) {
+		selectedObjNum = g_engine->_room->getObjectNumUnder6AtCursor();
+	}
+
+	if (selectedObjNum == 0) {
+		_walkTarget.x = g_engine->_cursor.getX();
+		_walkTarget.y = g_engine->_cursor.getY();
+	} else {
+		int currentRoomNumber = g_engine->_room->_roomNumber;
+		if (currentRoomNumber == 0x22 || (currentRoomNumber > 0x12 && currentRoomNumber < 0x18)) {
+			g_engine->_previousRoomNumber = currentRoomNumber;
+			if (currentRoomNumber == 0x22) {
+				// TODO FUN_171d_88f4_change_rooms_maybe(0); // also set current room to 0x21
+			} else {
+				// TODO FUN_171d_88f4_change_rooms_maybe(0); // also set current room to 0x1c
+			}
+			return;
+		}
+		g_engine->_room->getWalkTargetForObjectType_maybe(selectedObjNum);
+	}
+
+	if (_walkTarget.y > 0xed) {
+		_walkTarget.y = 0xee;
+	}
+
+	// TODO more logic here.
+}
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index 84ee177b3c5..dcb59e05641 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -42,9 +42,13 @@ public:
 	int16 playerSpriteWalkIndex_maybe = 0;
 	int16 playerWalkFrameDeltaOffset = 0;
 	int16 playerNewFacingDirection_maybe = 0;
-	bool isPlayerWalking_maybe = false;
+	uint16 playerWalkFrameIdx = 0;
+	bool isPlayerWalking_maybe = false; // player is pathfinding to some destination?
 	bool _playerIsChangingDirection = false;
 	bool _isAutoWalkingToBed = false;
+	bool BoolEnum_2c85_811c = false; // maybe set to true while player is walking around the room.
+	int walkPathIndex = -1;
+	uint16 numConnectorsInWalkPath = 0;
 
 public:
 	Player();
@@ -55,6 +59,7 @@ public:
 
 	bool isAtPosition(int x, int y) const;
 	bool isAtWalkTarget() const;
+	void calculateWalkTarget();
 
 	void changeDirection(int16 oldDir, int16 newDir);
 	void playerFaceWalkTarget();
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 5e81d21b163..3e5138ac5de 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -264,3 +264,41 @@ void Darkseed::Room::printRoomDescriptionText() const {
 		g_engine->_console->printTosText(textId);
 	}
 }
+
+int Darkseed::Room::getObjectNumUnder6AtCursor() {
+	Common::Rect cursorRect(g_engine->_cursor.getPosition(), g_engine->_cursor.getWidth(), g_engine->_cursor.getHeight());
+	for (int i = 0; i < room3.size(); i++) {
+		if (room3[i].unk0 == 0 && room3[i].unk2 < 6 && cursorRect.contains(room3[i].xOffset, room3[i].yOffset)) {
+			selectedObjIndex = i;
+			return room3[i].unk2;
+		}
+	}
+	return 0;
+}
+
+void Darkseed::Room::getWalkTargetForObjectType_maybe(int objId) {
+	for (int i = 0; i < room3.size(); i++) {
+		if (room3[i].unk2 == objId && room3[i].unk0 == 4) {
+			g_engine->_player->_walkTarget.x = room3[i].xOffset;
+			g_engine->_player->_walkTarget.y = room3[i].yOffset;
+			for (int j = 0; j < room1.size(); j++) {
+				if (room1[j].roomNumber != 0xff
+					&& room3[selectedObjIndex].xOffset < room1[j].x
+					&& room1[j].x < room3[selectedObjIndex].xOffset + room3[selectedObjIndex].width
+					&& room3[selectedObjIndex].yOffset < room1[j].y
+					&& room1[j].y < room3[selectedObjIndex].yOffset + room3[selectedObjIndex].height
+					) {
+					if (_roomNumber != 0x3d || room1[j].roomNumber == 5 || g_engine->trunkPushCounter > 2) {
+						g_engine->BoolByteEnum_2c85_9e67 = 1;
+					}
+					g_engine->targetRoomNumber = room1[j].roomNumber;
+					g_engine->DAT_2c85_6b0e = room1[j].unka; // TODO what is this?
+					break;
+				}
+			}
+			return;
+		}
+	}
+	g_engine->_player->_walkTarget.x = g_engine->_cursor.getX();
+	g_engine->_player->_walkTarget.y = g_engine->_cursor.getY();
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index a7f11b30369..bea2eb0432e 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -24,6 +24,7 @@
 
 #include "pal.h"
 #include "pic.h"
+#include "common/rect.h"
 
 namespace Darkseed {
 
@@ -67,6 +68,7 @@ public:
 	Common::Array<RoomStruct3> room3;
 	Common::Array<RoomConnector> connectors;
 
+	uint16 selectedObjIndex = 0;
 public:
 	explicit Room(int roomNumber);
 
@@ -75,6 +77,8 @@ public:
 	void update();
 
 	int getObjectAtPoint(int x, int y);
+	int getObjectNumUnder6AtCursor();
+	void getWalkTargetForObjectType_maybe(int objId);
 	int getExitRoomNumberAtPoint(int x, int y);
 	bool exitRoom();
 	Common::String getRoomFilenameBase(int roomNumber);


Commit: dc7d9c5bf53e0b9dcdd3e383cf762f44aa1b0e45
    https://github.com/scummvm/scummvm/commit/dc7d9c5bf53e0b9dcdd3e383cf762f44aa1b0e45
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Continuing with player movement logic.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/player.cpp
    engines/darkseed/player.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h
    engines/darkseed/sprites.cpp
    engines/darkseed/sprites.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index c1db9590129..5b5aefe2524 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -175,6 +175,7 @@ void DarkseedEngine::fadeInner(int startValue, int endValue, int increment) {
 void DarkseedEngine::gameloop() {
 	while (!shouldQuit()) {
 		updateEvents();
+		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
 		handleInput();
 		updateDisplay();
 		_room->update();
@@ -205,7 +206,7 @@ void DarkseedEngine::updateEvents() {
 }
 
 void DarkseedEngine::wait() {
-	g_system->delayMillis(10);
+	g_system->delayMillis(15);
 }
 
 void DarkseedEngine::handleInput() {
@@ -219,7 +220,7 @@ void DarkseedEngine::handleInput() {
 
 	if (!isPlayingAnimation_maybe) {
 		if (!_player->_playerIsChangingDirection) {
-			if (currentRoomNumber == 0x39 &&_previousRoomNumber == 6) {
+			if (currentRoomNumber == 0x39 &&_previousRoomNumber == 0x36) {
 				_player->updateSprite();
 			} else {
 				if (_player->isAtWalkTarget() && !_player->BoolEnum_2c85_811c) {
@@ -227,13 +228,14 @@ void DarkseedEngine::handleInput() {
 				} else {
 					if (counter_2c85_888b >= 0 && !_player->isAtWalkTarget()) {
 						counter_2c85_888b = 0;
-						//						uVar7 = CONCAT11((char)(uVar7 >> 8),DAT_2c85_7dd7 + '\x01') & 0xff07;
-						//						DAT_2c85_7dd7 = (char)uVar7;
-						//						if (((DAT_2c85_7dd7 == '\0') || (DAT_2c85_7dd7 == '\x04')) &&
-						//							((((currentRoomNumber != 0x22 && (currentRoomNumber != 0x13)) && (currentRoomNumber != 0x14)) &&
-						//							  ((currentRoomNumber != 0x15 && (currentRoomNumber != 0x16)))))) {
+						_player->playerWalkFrameIdx = (_player->playerWalkFrameIdx + 1) % 8;
+						if ((_player->playerWalkFrameIdx == 0 || _player->playerWalkFrameIdx == 4)
+							&& currentRoomNumber != 0x22 && currentRoomNumber != 0x13
+							&& currentRoomNumber != 0x14 && currentRoomNumber != 0x15
+							&& currentRoomNumber != 16) {
+							//TODO
 						//							FUN_1208_0dac_sound_related(0x5c,CONCAT11((char)(uVar7 >> 8),5));
-						//						}
+						}
 					}
 					_player->updateSprite();
 				}
@@ -248,18 +250,9 @@ void DarkseedEngine::handleInput() {
 						}
 					}
 				}
-//				if ((int)playerSpriteX_maybe < (int)walkTargetX) {
-//					local_22 = walkTargetX - playerSpriteX_maybe;
-//				}
-//				else {
-//					local_22 = playerSpriteX_maybe - walkTargetX;
-//				}
-//				if ((int)playerSpriteY_maybe < (int)walkTargetY) {
-//					local_20 = walkTargetY - playerSpriteY_maybe;
-//				}
-//				else {
-//					local_20 = playerSpriteY_maybe - walkTargetY;
-//				}
+				int xDistToTarget = ABS(_player->_walkTarget.x - _player->_position.x);
+				int yDistToTarget = ABS(_player->_walkTarget.y - _player->_position.y);
+
 				if (_isRightMouseClicked && !_player->isPlayerWalking_maybe) {
 					if (_actionMode == LookAction) {
 						_actionMode = PointerAction;
@@ -285,6 +278,84 @@ void DarkseedEngine::handleInput() {
 //					}
 //					playerFaceWalkTarget();
 				}
+				if (_isLeftMouseClicked && _cursor.getY() < 0x29) {
+					// TODO handle inventory click.
+				}
+				_room->calculateScaledSpriteDimensions(_player->getWidth(), _player->getHeight(), _player->_position.y);
+
+				if (_player->isAtWalkTarget() && _player->BoolEnum_2c85_811c && !_player->isPlayerWalking_maybe) {
+					if (BoolByteEnum_2c85_9e67) {
+						_player->changeDirection(_player->_direction, targetPlayerDirection);
+						BoolByteEnum_2c85_9e67 = false;
+						BoolByteEnum_2c85_8324 = true;
+						return;
+					}
+					_player->BoolEnum_2c85_811c = false;
+					if (BoolByteEnum_2c85_9e67 || BoolByteEnum_2c85_8324) {
+						for (int i = 0; i < _room->room1.size(); i++) {
+							RoomExit &roomExit = _room->room1[i];
+							if (roomExit.roomNumber != 0xff
+								&& roomExit.x < scaledSpriteWidth / 2 + _player->_position.x
+								&& _player->_position.x - scaledSpriteWidth / 2 < roomExit.x + roomExit.width
+								&& roomExit.y < _player->_position.y
+								&& _player->_position.y - scaledSpriteHeight < roomExit.y + roomExit.height
+								&& roomExit.direction == _player->_direction) {
+								bool bVar = true;
+								if (currentRoomNumber == 0x40 && roomExit.roomNumber == 0x40) {
+									bVar = false;
+									_console->printTosText(0x2bf);
+								}
+								if (currentRoomNumber == 0x43 && roomExit.roomNumber == 0) {
+									bVar = false;
+									_console->printTosText(0x386);
+								}
+								// 2022:808a TODO
+//								if (currentRoomNumber == 0x3b)
+								if (bVar) {
+									if (currentRoomNumber != 0x22 && (currentRoomNumber < 0x13 || currentRoomNumber > 0x17)) {
+										_player->_playerIsChangingDirection = false;
+										_player->BoolEnum_2c85_811c = false;
+										_player->updateSprite();
+										updateDisplay();
+										_previousRoomNumber = currentRoomNumber;
+//										currentRoomNumber = *(byte *)((int)&roomExitTbl[0].roomNumber + iVar7 * 0xb);
+//										if (((isAutoWalkingToBed != False) && (DAT_2c85_8254 == 2)) && (currentRoomNumber == 10)) {
+//											FUN_171d_0c6e();
+//										}
+										changeToRoom(roomExit.roomNumber);
+//										if ((isAutoWalkingToBed != False) &&
+//											((currentRoomNumber != 5 ||
+//											  (lVar9 = CONCAT22(playerSpriteX_long._2_2_,(uint)playerSpriteX_long),
+//											   lVar10 = CONCAT22(playerSpriteY_long._2_2_,(uint)playerSpriteY_long), previousRoomNumber != 0x3d ))))
+//										{
+//											FUN_2022_7508();
+//											uVar4 = playerSpriteX_maybe;
+//											uVar3 = playerSpriteY_maybe;
+//											lVar9 = CONCAT22(playerSpriteX_long._2_2_,(uint)playerSpriteX_long);
+//											lVar10 = CONCAT22(playerSpriteY_long._2_2_,(uint)playerSpriteY_long);
+//										}
+										return;
+									}
+								}
+							}
+						}
+					}
+				}
+				if (_player->isAtWalkTarget() && _player->isPlayerWalking_maybe) {
+					if (_player->playerNewFacingDirection_maybe != -1) {
+						_player->changeDirection(_player->_direction, _player->playerNewFacingDirection_maybe);
+						_player->updateSprite();
+						_player->playerNewFacingDirection_maybe = -1;
+						return;
+					}
+					_player->BoolEnum_2c85_811c = false;
+					_player->isPlayerWalking_maybe = false;
+					// TODO complete at final destination logic. 2022:879d
+				}
+				if (!isPlayingAnimation_maybe) {
+					_player->_position = _player->_walkTarget;
+					// TODO handle walking movement here. 2022:88ca
+				}
 //				else if (_isLeftMouseClicked) {
 //					// TODO do actions here.
 //					handlePointerAction();
@@ -435,8 +506,8 @@ void DarkseedEngine::updateDisplay() {
 //					else {
 //						uVar11 = 0;
 //						uVar10 = 1000;
-//						uVar7 = LONG_2c85_8116._2_2_;
-//						uVar4 = LXMUL@(CONCAT22((undefined2)LONG_2c85_8116,LONG_2c85_8116._2_2_),0x2d0000);
+//						uVar7 = scaledWalkSpeed_maybe._2_2_;
+//						uVar4 = LXMUL@(CONCAT22((undefined2)scaledWalkSpeed_maybe,scaledWalkSpeed_maybe._2_2_),0x2d0000);
 //						uVar3 = LUMOD@(uVar4,uVar7,uVar10,uVar11);
 //						iVar5 = playerSpriteX_maybe - uVar3;
 //					}
@@ -531,8 +602,8 @@ void DarkseedEngine::updateAnimation() {
 
 void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
 	if (!BoolEnum_2c85_985a) {
-//		LONG_2c85_8116._2_2_ = 0;
-//		LONG_2c85_8116._0_2_ = 1000;
+//		scaledWalkSpeed_maybe._2_2_ = 0;
+//		scaledWalkSpeed_maybe._0_2_ = 1000;
 	}
 	else {
 //		calculateScaledPlayerSpriteDimensions(10,10,playerSpriteY_maybe);
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 9d8cd0f349a..0a0e987f99a 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -87,7 +87,12 @@ public:
 	bool isWearingHeadBand = false;
 	uint16 headAcheMessageCounter = 0;
 	uint16 trunkPushCounter = 0;
+
 	int sprite_y_scaling_threshold_maybe = 0xf0;
+	int scaledWalkSpeed_maybe = 0;
+	uint8 scaledSpriteWidth = 0;
+	uint8 scaledSpriteHeight = 0;
+
 	int nsp_sprite_scaling_y_position = 0;
 	bool BoolEnum_2c85_985 = false;
 	bool player_sprite_related_2c85_82f3 = false;
@@ -99,6 +104,7 @@ public:
 	int spriteAnimCountdownTimer[20];
 
 	// Unknown variables
+	bool BoolByteEnum_2c85_8324 = false;
 	uint16 DAT_2c85_825c = 0;
 	uint16 DAT_2c85_819c = 0;
 	bool BoolEnum_2c85_985a = false;
@@ -108,7 +114,7 @@ public:
 
 	int16 counter_2c85_888b = 0;
 
-	uint8 DAT_2c85_6b0e = 0; // related to changing rooms.
+	uint8 targetPlayerDirection = 0; // related to changing rooms.
 
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index f5e39556957..e45e627b51c 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -186,5 +186,23 @@ void Darkseed::Player::calculateWalkTarget() {
 		_walkTarget.y = 0xee;
 	}
 
+	if (!g_engine->_room->canWalkAtLocation(_walkTarget.x, _walkTarget.y)) {
+		int ty = _walkTarget.y;
+		for (; !g_engine->_room->canWalkAtLocation(_walkTarget.x, ty) && ty <= 0xe9;) {
+			ty += 4;
+		}
+		if (ty < 0xeb) {
+			_walkTarget.y = ty;
+		}
+	}
+
 	// TODO more logic here.
 }
+
+int Darkseed::Player::getWidth() {
+	return getSprite(_frameIdx).width;
+}
+
+int Darkseed::Player::getHeight() {
+	return getSprite(_frameIdx).height;
+}
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index dcb59e05641..afd8ddbb6f0 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -63,6 +63,8 @@ public:
 
 	void changeDirection(int16 oldDir, int16 newDir);
 	void playerFaceWalkTarget();
+	int getWidth();
+	int getHeight();
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 3e5138ac5de..c4ca66e8613 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -74,10 +74,10 @@ bool Darkseed::Room::load() {
 		if (room1[i].y > 233) {
 			room1[i].y = 233;
 		}
-		room1[i].unk4 = file.readUint16BE();
-		room1[i].unk6 = file.readUint16BE();
+		room1[i].width = file.readUint16BE();
+		room1[i].height = file.readUint16BE();
 		room1[i].roomNumber = file.readUint16BE();
-		room1[i].unka = file.readByte();
+		room1[i].direction = file.readByte();
 	}
 
 	for (int i = 0; i < 16; i++) {
@@ -266,9 +266,9 @@ void Darkseed::Room::printRoomDescriptionText() const {
 }
 
 int Darkseed::Room::getObjectNumUnder6AtCursor() {
-	Common::Rect cursorRect(g_engine->_cursor.getPosition(), g_engine->_cursor.getWidth(), g_engine->_cursor.getHeight());
 	for (int i = 0; i < room3.size(); i++) {
-		if (room3[i].unk0 == 0 && room3[i].unk2 < 6 && cursorRect.contains(room3[i].xOffset, room3[i].yOffset)) {
+		Common::Rect roomRect(room3[i].xOffset, room3[i].yOffset, room3[i].xOffset + room3[i].width, room3[i].yOffset + room3[i].height);
+		if (room3[i].unk0 == 0 && room3[i].unk2 < 6 && roomRect.contains(g_engine->_cursor.getPosition())) {
 			selectedObjIndex = i;
 			return room3[i].unk2;
 		}
@@ -289,10 +289,10 @@ void Darkseed::Room::getWalkTargetForObjectType_maybe(int objId) {
 					&& room1[j].y < room3[selectedObjIndex].yOffset + room3[selectedObjIndex].height
 					) {
 					if (_roomNumber != 0x3d || room1[j].roomNumber == 5 || g_engine->trunkPushCounter > 2) {
-						g_engine->BoolByteEnum_2c85_9e67 = 1;
+						g_engine->BoolByteEnum_2c85_9e67 = true;
 					}
 					g_engine->targetRoomNumber = room1[j].roomNumber;
-					g_engine->DAT_2c85_6b0e = room1[j].unka; // TODO what is this?
+					g_engine->targetPlayerDirection = room1[j].direction; // TODO what is this?
 					break;
 				}
 			}
@@ -302,3 +302,55 @@ void Darkseed::Room::getWalkTargetForObjectType_maybe(int objId) {
 	g_engine->_player->_walkTarget.x = g_engine->_cursor.getX();
 	g_engine->_player->_walkTarget.y = g_engine->_cursor.getY();
 }
+
+static const int room_sprite_related_2c85_41e[] = {
+	 1000,          1000,          1000,          1000,
+	 1000,          1000,          1000,          1000,
+	 1000,          1000,           400,           750,
+	  800,          1000,          1000,          1000,
+	 1000,          1000,          1000,          1000,
+	 1000,          1000,          1000,          1000,
+	  750,           850,          1000,          1000,
+	 1000,          1000,          1000,           800,
+	 1000,          1000,          1000,           900,
+	 1000,          1000,          1000,          1000,
+	 1000,          1000,          1000,           830,
+	 1000,           750,           550,           500,
+	  650,          1000,           950,          1000,
+	  500,           750,           700,           800,
+	  800,          1000,          1000,          1000,
+	 1000,          1000,          1000,           245,
+	  750,           800,           500,           700,
+	  800
+};
+
+static const uint8 room_sprite_related_2c85_4303[] = {
+	 13,            13,            25,            25,
+	28,            15,            22,            18,
+	18,            13,            15,            15,
+	35,            18,            40,            45,
+	25,            22,            20,            10,
+	10,            10,            10,            10,
+	40,            20,            50,            30,
+	25,            10,            10,            35,
+	55,            35,            10,            45,
+	15,            20,            13,            20,
+	20,            15,            25,            30,
+	20,            20,            30,            40,
+	40,            60,            20,            15,
+	5,            20,            10,            35,
+	40,            15,            45,            10,
+	34,            20,            25,             5,
+	15,            25,            10,            10,
+	15
+};
+
+void Darkseed::Room::calculateScaledSpriteDimensions(int width, int height, int curYPosition) {
+	int local_6 = (g_engine->sprite_y_scaling_threshold_maybe - 2) - curYPosition;
+	if (local_6 <= 0) {
+		local_6 = 0;
+	}
+	g_engine->scaledWalkSpeed_maybe = room_sprite_related_2c85_41e[_roomNumber] - ((room_sprite_related_2c85_4303[_roomNumber] * local_6) / 5);
+	g_engine->scaledSpriteWidth = (width * g_engine->scaledWalkSpeed_maybe) / 1000;
+	g_engine->scaledSpriteHeight = (height * g_engine->scaledWalkSpeed_maybe) / 1000;
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index bea2eb0432e..5172469b7d1 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -28,13 +28,13 @@
 
 namespace Darkseed {
 
-struct RoomStruct1 {
+struct RoomExit {
 	uint16 x = 0;
 	uint16 y = 0;
-	uint16 unk4 = 0;
-	uint16 unk6 = 0;
+	uint16 width = 0;
+	uint16 height = 0;
 	uint16 roomNumber = 0;
-	uint8 unka = 0;
+	uint8 direction = 0;
 };
 
 struct RoomStruct2 {
@@ -63,7 +63,7 @@ public:
 	Pic pic;
 	Pal _pal;
 
-	Common::Array<RoomStruct1> room1;
+	Common::Array<RoomExit> room1;
 	Common::Array<RoomStruct2> walkableLocationsMap;
 	Common::Array<RoomStruct3> room3;
 	Common::Array<RoomConnector> connectors;
@@ -84,6 +84,7 @@ public:
 	Common::String getRoomFilenameBase(int roomNumber);
 	bool canWalkAtLocation(int x, int y);
 	void printRoomDescriptionText() const;
+	void calculateScaledSpriteDimensions(int width, int height, int curYPosition);
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
index 110c201193e..6a9ff1b8702 100644
--- a/engines/darkseed/sprites.cpp
+++ b/engines/darkseed/sprites.cpp
@@ -38,7 +38,7 @@ void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Da
 	drawInstruction.order = order;
 	drawInstruction.destW = destW;
 	drawInstruction.destH = destH;
-	drawInstruction.unk10 = unk10;
+	drawInstruction.flip = unk10;
 
 	if (!spriteDrawList.empty()) {
 		int insertLocation = 0;
diff --git a/engines/darkseed/sprites.h b/engines/darkseed/sprites.h
index 9440ac40ee8..b57392cdf57 100644
--- a/engines/darkseed/sprites.h
+++ b/engines/darkseed/sprites.h
@@ -36,7 +36,7 @@ struct SpriteDrawInstruction {
 	uint8 order = 0;
 	uint8 destW = 0;
 	uint8 destH = 0;
-	bool unk10 = false;
+	bool flip = false;
 };
 
 class Sprites {


Commit: 3d92aeb93f7cfab16eb7ace673ec278cb29e3e9e
    https://github.com/scummvm/scummvm/commit/3d92aeb93f7cfab16eb7ace673ec278cb29e3e9e
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Working on room transition animations

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/nsp.cpp
    engines/darkseed/nsp.h
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 5b5aefe2524..21d2c5efb8b 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -393,6 +393,17 @@ void DarkseedEngine::handlePointerAction() {
 void DarkseedEngine::changeToRoom(int newRoomNumber) {
 	delete _room;
 	_room = new Room(newRoomNumber);
+	if (newRoomNumber == 5 && _previousRoomNumber == 6) {
+		_player->loadAnimations("stairs.nsp");
+		_player->_position.x = 0x174;
+		_player->_position.y = 0x100;
+		setupOtherNspAnimation(2,6);
+	} else if (newRoomNumber == 6 && _previousRoomNumber == 5) {
+		_player->loadAnimations("stairs.nsp");
+		_player->_position.x = 0x19f;
+		_player->_position.y = 0x8c;
+		setupOtherNspAnimation(0,7);
+	}
 	_room->printRoomDescriptionText();
 }
 
@@ -484,14 +495,10 @@ void DarkseedEngine::updateDisplay() {
 					}
 				}
 
-				if (nsp_sprite_scaling_y_position == 0) {
-//					calculateScaledPlayerSpriteDimensions(iVar9,iVar8,playerSpriteY_maybe);
-//					bVar6 = extraout_AH_00;
-				}
-				else {
-//					calculateScaledPlayerSpriteDimensions(iVar9,iVar8,nsp_sprite_scaling_y_position);
-//					bVar6 = extraout_AH;
-				}
+				_room->calculateScaledSpriteDimensions(
+					_player->_animations.getSpriteAt(_player->_frameIdx).width,
+					_player->_animations.getSpriteAt(_player->_frameIdx).height,
+					nsp_sprite_scaling_y_position != 0 ? nsp_sprite_scaling_y_position : _player->_position.y);
 
 				if (otherNspAnimationType_maybe == 3) {
 //					uVar1 = _curPlayerSpriteWidth & 0xff;
@@ -516,7 +523,7 @@ void DarkseedEngine::updateDisplay() {
 //									*(undefined2 *)((int)&otherNspSpritePtr[0].Offset + _player->_frameIdx * 4),
 //									0xf0 - playerSpriteY_maybe,uVar1,uVar2,uVar3 & 0xff00);
 //					bVar6 = extraout_AH_01;
-				} else if (!BoolEnum_2c85_985) {
+				} else if (!BoolEnum_2c85_985a) {
 					if (otherNspAnimationType_maybe == 0x11) {
 //						addSpriteToDraw(playerSpriteX_maybe - (int)otherNspWidthTbl[0] / 2,playerSpriteY_maybe - iVar8,iVar9,iVa r8,
 //										*(undefined2 *)((int)otherNspSpritePtr + _player->_frameIdx * 4),
@@ -547,6 +554,33 @@ void DarkseedEngine::updateDisplay() {
 //										0xf0 - playerSpriteY_maybe,iVar9,iVar8,_player_sprite_related_2c85_82f3);
 //						bVar6 = extraout_AH_03;
 					} // TODO continue adding logic here. else if (....
+				} else if (otherNspAnimationType_maybe == 6) {
+					// stairs up
+					_sprites.addSpriteToDrawList(
+						_player->_position.x - scaledSpriteWidth / 2,
+						_player->_position.y - scaledSpriteHeight,
+						&_player->_animations.getSpriteAt(_player->_frameIdx),
+						0xff,
+						scaledSpriteWidth,
+						scaledSpriteHeight,
+						player_sprite_related_2c85_82f3);
+				} else if (otherNspAnimationType_maybe == 0x16) {
+					// TODO
+				} else if (otherNspAnimationType_maybe == 4 || otherNspAnimationType_maybe == 0x15) {
+					// TODO
+				} else if (otherNspAnimationType_maybe == 0x27) {
+					// TODO
+				} else if (otherNspAnimationType_maybe == 0x2f) {
+					// TODO
+				} else {
+					_sprites.addSpriteToDrawList(
+						_player->_position.x - scaledSpriteWidth / 2,
+						_player->_position.y - scaledSpriteHeight,
+						&_player->_animations.getSpriteAt(_player->_frameIdx),
+						0xf0 - _player->_position.y,
+						scaledSpriteWidth,
+						scaledSpriteHeight,
+						player_sprite_related_2c85_82f3);
 				}
 			}
 		}
@@ -573,13 +607,22 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 	}
 
 	// TODO big switch here to init the different animation types.
-	switch (otherNspAnimationType_maybe - 2) {
+	switch (otherNspAnimationType_maybe) {
+	case 6 : // stairs
+		nsp_sprite_scaling_y_position = 0xbe;
+		BoolEnum_2c85_985a = true;
+		break;
+	case 7 : // stairs down
+		nsp_sprite_scaling_y_position = 0xbe;
+		BoolEnum_2c85_985a = true;
+		break;
 	default:
 		break;
 	}
 }
 
 void DarkseedEngine::updateAnimation() {
+	int currentRoomNumber = _room->_roomNumber;
 	switch (otherNspAnimationType_maybe) {
 	case 0: break;
 	case 1 : // sleep wake anim
@@ -595,6 +638,53 @@ void DarkseedEngine::updateAnimation() {
 			_player->updateSprite();
 		}
 		break;
+	case 6: // stairs up
+		if (currentRoomNumber == 6) {
+			advanceAnimationFrame(1);
+		} else {
+			advanceAnimationFrame(2);
+		}
+		if (animFrameChanged && ((currentRoomNumber == 6 && animIndexTbl[1] == 1) || (currentRoomNumber == 5 && animIndexTbl[2] == 1))) {
+//			FUN_1208_0dac_sound_related(0xd,CONCAT11(uVar4,5));
+		}
+		if (!isAnimFinished_maybe) {
+			if (currentRoomNumber == 6) {
+				_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
+			} else {
+				_player->_frameIdx = _player->_animations.getAnimAt(2).frameNo[_player->_animations.getAnimAt(2).frameNo[animIndexTbl[2]]];
+			}
+		} else {
+			if (currentRoomNumber == 6) {
+				_previousRoomNumber = 6;
+				changeToRoom(5);
+			}
+//			if (isAutoWalkingToBed != False) {
+//				FUN_2022_7508();
+//			}
+		}
+		break;
+	case 7: // stairs down
+		if (currentRoomNumber == 5) {
+			advanceAnimationFrame(3);
+			if (animFrameChanged && animIndexTbl[3] == 1) {
+				// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
+			}
+			if (!isAnimFinished_maybe) {
+				_player->_frameIdx = _player->_animations.getAnimAt(3).frameNo[_player->_animations.getAnimAt(3).frameNo[animIndexTbl[3]]];
+			} else {
+				_previousRoomNumber = 5;
+				changeToRoom(6);
+			}
+		} else {
+			advanceAnimationFrame(0);
+			if (animFrameChanged && animIndexTbl[0] == 1) {
+				// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
+			}
+			if (!isAnimFinished_maybe) {
+				_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			}
+		}
+		break;
 	default:
 		error("Unhandled animation type! %d", otherNspAnimationType_maybe);
 	}
@@ -602,11 +692,10 @@ void DarkseedEngine::updateAnimation() {
 
 void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
 	if (!BoolEnum_2c85_985a) {
-//		scaledWalkSpeed_maybe._2_2_ = 0;
-//		scaledWalkSpeed_maybe._0_2_ = 1000;
+		scaledWalkSpeed_maybe = 1000;
 	}
 	else {
-//		calculateScaledPlayerSpriteDimensions(10,10,playerSpriteY_maybe);
+		_room->calculateScaledSpriteDimensions(10, 10, _player->_position.y);
 	}
 	isAnimFinished_maybe = false;
 	animFrameChanged = false;
@@ -615,8 +704,8 @@ void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
 	if (spriteAnimCountdownTimer[nspAminIdx] < 1) {
 		animFrameChanged = true;
 		animIndexTbl[nspAminIdx] = animIndexTbl[nspAminIdx] + 1;
-		_player->_position.x += (int16)anim.deltaX[animIndexTbl[nspAminIdx]];
-		_player->_position.y += (int16)anim.deltaY[animIndexTbl[nspAminIdx]];
+		_player->_position.x += ((int16)anim.deltaX[animIndexTbl[nspAminIdx]] * scaledWalkSpeed_maybe) / 1000;
+		_player->_position.y += ((int16)anim.deltaY[animIndexTbl[nspAminIdx]] * scaledWalkSpeed_maybe) / 1000;
 		if (animIndexTbl[nspAminIdx] == anim.numFrames) {
 			animIndexTbl[nspAminIdx] = 0;
 			isAnimFinished_maybe = true;
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 0a0e987f99a..bfc09206daf 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -94,7 +94,7 @@ public:
 	uint8 scaledSpriteHeight = 0;
 
 	int nsp_sprite_scaling_y_position = 0;
-	bool BoolEnum_2c85_985 = false;
+
 	bool player_sprite_related_2c85_82f3 = false;
 	int DAT_2c85_8326_blit_related = 0;
 	bool isAnimFinished_maybe = false;
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index 1472a2cc9d4..9593c2e4d58 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -99,21 +99,21 @@ bool Darkseed::Nsp::loadObt(const Common::String &filename) {
 		return false;
 	}
 
+	animations.clear();
 	animations.resize(20);
 	for (int i = 0; i < 20; i++) {
 		animations[i].numFrames = file.readByte();
 
 		for (int j = 0; j < 20; j++) {
-			// TODO verify this is the correct way to load negative delta values.
 			if (file.readByte()) {
-				animations[i].deltaX.push_back(file.readSint16BE());
+				animations[i].deltaX.push_back(-(file.readUint16LE()/100));
 			} else {
-				animations[i].deltaX.push_back(file.readUint16BE());
+				animations[i].deltaX.push_back(file.readUint16LE()/100);
 			}
 			if (file.readByte()) {
-				animations[i].deltaY.push_back(file.readSint16BE());
+				animations[i].deltaY.push_back(-(file.readUint16LE()/100));
 			} else {
-				animations[i].deltaY.push_back(file.readUint16BE());
+				animations[i].deltaY.push_back(file.readUint16LE()/100);
 			}
 			animations[i].frameNo.push_back(file.readByte());
 			animations[i].frameDuration.push_back(file.readByte());
@@ -137,3 +137,10 @@ Darkseed::Obt::Obt() {
 	frameNo.reserve(20);
 	frameDuration.reserve(20);
 }
+
+Darkseed::Obt::~Obt() {
+	deltaX.clear();
+	deltaY.clear();
+	frameNo.clear();
+	frameDuration.clear();
+}
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
index dfdcdabf4f1..48abd0e6afc 100644
--- a/engines/darkseed/nsp.h
+++ b/engines/darkseed/nsp.h
@@ -48,6 +48,7 @@ public:
 	Common::Array<uint8> frameNo;
 	Common::Array<uint8> frameDuration;
 	Obt();
+	virtual ~Obt();
 };
 
 class Nsp {
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index c4ca66e8613..bb5979120c1 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -292,7 +292,7 @@ void Darkseed::Room::getWalkTargetForObjectType_maybe(int objId) {
 						g_engine->BoolByteEnum_2c85_9e67 = true;
 					}
 					g_engine->targetRoomNumber = room1[j].roomNumber;
-					g_engine->targetPlayerDirection = room1[j].direction; // TODO what is this?
+					g_engine->targetPlayerDirection = room1[j].direction;
 					break;
 				}
 			}


Commit: a41b814468d6bbf9ee921fd15225190b37821d91
    https://github.com/scummvm/scummvm/commit/a41b814468d6bbf9ee921fd15225190b37821d91
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added basic support for sprite scaling.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/nsp.cpp
    engines/darkseed/nsp.h
    engines/darkseed/player.cpp
    engines/darkseed/player.h
    engines/darkseed/sprites.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 21d2c5efb8b..19f123fc47b 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -403,7 +403,25 @@ void DarkseedEngine::changeToRoom(int newRoomNumber) {
 		_player->_position.x = 0x19f;
 		_player->_position.y = 0x8c;
 		setupOtherNspAnimation(0,7);
+	} // TODO a bunch of other room codes here.
+	else if (newRoomNumber != 0x22 && (newRoomNumber < 0x13 || newRoomNumber > 0x17)) {
+		for (int i = 0; i < _room->room1.size(); i++) {
+			const RoomExit &roomExit = _room->room1[i];
+			if (roomExit.roomNumber == _previousRoomNumber) {
+				_player->_position.x = roomExit.x + roomExit.width / 2;
+				_player->_position.y = roomExit.y;
+				_player->_direction = roomExit.direction ^ 2;
+				_player->updatePlayerPositionAfterRoomChange();
+				_player->_walkTarget = _player->_position;
+			}
+		}
+		if (_previousRoomNumber == 10 && newRoomNumber == 6) {
+//			if (DAT_2c85_81a0 == 0 && _currentDay == 1) {
+//				DAT_2c85_6750 = 2;
+//			}
+		}
 	}
+
 	_room->printRoomDescriptionText();
 }
 
@@ -434,18 +452,16 @@ void DarkseedEngine::updateDisplay() {
 		if (!isWearingHeadBand || (headAcheMessageCounter & 1) != 0) {
 			if (!isPlayingAnimation_maybe || otherNspAnimationType_maybe == 0x13
 				|| otherNspAnimationType_maybe == 0x17) {
-//				calculateScaledPlayerSpriteDimensions(uVar7,uVar4,playerSpriteY_maybe);
+				const Sprite &playerSprite = _player->getSprite(_player->_frameIdx);
+				_room->calculateScaledSpriteDimensions(playerSprite.width, playerSprite.height, _player->_position.y);
 				if ((currentRoomNumber != 0x35) || (DAT_2c85_81e0 != 2)) {
-					const Sprite &playerSprite = _player->getSprite(_player->_frameIdx);
-					uint8 scaledWidth = playerSprite.width;
-					uint8 scaledHeight = playerSprite.height;
 					_sprites.addSpriteToDrawList(
-						_player->_position.x - (scaledWidth / 2),
-						_player->_position.y - scaledHeight,
+						_player->_position.x - (scaledSpriteWidth / 2),
+						_player->_position.y - scaledSpriteHeight,
 						&playerSprite,
 						240 - _player->_position.y,
-						scaledWidth,
-						scaledHeight, player_sprite_related_2c85_82f3);
+						scaledSpriteWidth,
+						scaledSpriteHeight, player_sprite_related_2c85_82f3);
 				}
 			} else {
 				if (otherNspAnimationType_maybe == 0x25) {
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index 9593c2e4d58..395aaf1510f 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -23,8 +23,8 @@
 #include "common/debug.h"
 #include "darkseed.h"
 
-Darkseed::Sprite::Sprite(uint16 width, uint16 height) : width(width), height(height) {
-	pixels.resize(width * height, 0);
+Darkseed::Sprite::Sprite(uint16 width, uint16 height, uint16 pitch) : width(width), height(height), pitch(pitch) {
+	pixels.resize(pitch * height, 0);
 }
 
 bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
@@ -34,7 +34,7 @@ bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
 	} else {
 		bool hasReadByte = false;
 		int currentDataByte = 0;
-		for (int i = 0; i < width * height; i++) {
+		for (int i = 0; i < pitch * height; i++) {
 			if (!hasReadByte) {
 				currentDataByte = readStream.readByte();
 				if (readStream.eos()) {
@@ -53,7 +53,69 @@ bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
 }
 
 void Darkseed::Sprite::draw(int x, int y) const {
-	g_engine->_screen->copyRectToSurfaceWithKey(pixels.data(), width, x, y, width, height, 0xf);
+	g_engine->_screen->copyRectToSurfaceWithKey(pixels.data(), pitch, x, y, width, height, 0xf);
+}
+
+void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destHeight, bool flipX) const {
+	//TODO this logic is pretty messy. It should probably be re-written. It is trying to scale, clip and flip at once.
+	Graphics::ManagedSurface * destSurface = g_engine->_screen;
+	// Based on the GNAP engine scaling code
+	if (destWidth == 0 || destHeight == 0) {
+		return;
+	}
+	const byte *source = pixels.data();
+	const int xs = ((width - 1) << 16) / destWidth;
+	const int ys = ((height -1) << 16) / destHeight;
+	int clipX = 0, clipY = 0;
+	const int destPitch = destSurface->pitch;
+	if (destX < 0) {
+		clipX = -destX;
+		destX = 0;
+		destWidth -= clipX;
+	}
+
+	if (destY < 0) {
+		clipY = -destY;
+		destY = 0;
+		destHeight -= clipY;
+	}
+	if (destY + destHeight >= destSurface->h) {
+		destHeight = destSurface->h - destY;
+	}
+	if (destWidth < 0 || destHeight < 0)
+		return;
+	byte *dst = (byte *)destSurface->getBasePtr(destX, destY);
+	int yi = ys * clipY;
+	const byte *hsrc = source + pitch * ((yi + 0x8000) >> 16);
+	for (int yc = 0; yc < destHeight; ++yc) {
+		byte *wdst = flipX ? dst + (destWidth - 1) : dst;
+		int16 currX = flipX ? destX + (destWidth - 1) : destX;
+		int xi = flipX ? xs : xs * clipX;
+		const byte *wsrc = hsrc + ((xi + 0x8000) >> 16);
+		for (int xc = 0; xc < destWidth; ++xc) {
+			if (currX >= 0 && currX < destSurface->w) {
+				byte colorIndex = *wsrc;
+				//				uint16 c = READ_LE_UINT16(&palette[colorIndex * 2]);
+				if (colorIndex != 0xf) {
+					*wdst = colorIndex;
+					//					if (!(c & 0x8000u) || alpha == NONE) {
+					//						// only copy opaque pixels
+					//						WRITE_SCREEN(wdst, c & ~0x8000);
+					//					} else {
+					//						WRITE_SCREEN(wdst, alphaBlendRGB555(c & 0x7fffu, READ_SCREEN(wdst) & 0x7fffu, 128));
+					//						// semi-transparent pixels.
+					//					}
+				}
+			}
+			currX += (flipX ? -1 : 1);
+			wdst += (flipX ? -1 : 1);
+			xi += xs;
+			wsrc = hsrc + ((xi + 0x8000) >> 16);
+		}
+		dst += destPitch;
+		yi += ys;
+		hsrc = source + pitch * ((yi + 0x8000) >> 16);
+	}
 }
 
 bool Darkseed::Nsp::load(const Common::String &filename) {
@@ -76,8 +138,8 @@ bool Darkseed::Nsp::load(Common::SeekableReadStream &readStream) {
 	for (int i = 0; i < 96; i++) {
 		int w = readStream.readByte();
 		int h = readStream.readByte();
-		w = w + (w & 1);
-		frames.push_back(Sprite(w, h));
+		int p = w + (w & 1);
+		frames.push_back(Sprite(w, h, p));
 	}
 
 	for (int i = 0; i < 96; i++) {
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
index 48abd0e6afc..8a6b9bed96a 100644
--- a/engines/darkseed/nsp.h
+++ b/engines/darkseed/nsp.h
@@ -32,12 +32,14 @@ class Sprite {
 public:
 	uint16 width;
 	uint16 height;
+	uint16 pitch;
 	Common::Array<uint8> pixels;
 
 public:
-	Sprite(uint16 width, uint16 height);
+	Sprite(uint16 width, uint16 height, uint16 pitch);
 	bool loadData(Common::SeekableReadStream &readStream);
 	void draw(int x, int y) const;
+	void drawScaled(int x, int y, int destWidth, int destHeight, bool flipX) const;
 };
 
 class Obt {
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index e45e627b51c..e467a4dadc0 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -206,3 +206,70 @@ int Darkseed::Player::getWidth() {
 int Darkseed::Player::getHeight() {
 	return getSprite(_frameIdx).height;
 }
+
+void Darkseed::Player::updatePlayerPositionAfterRoomChange() {
+	int currentRoomNumber = g_engine->_room->_roomNumber;
+	g_engine->_room->calculateScaledSpriteDimensions(getWidth(), getHeight(), _position.y);
+	if (currentRoomNumber == 0x29 && g_engine->_previousRoomNumber == 0x2c) {
+		_position = Common::Point(0x13d, 0xa9);
+	} else if (currentRoomNumber == 0x2c && g_engine->_previousRoomNumber == 0x29) {
+		_position = Common::Point(0x16e, 0xb8);
+	} else if (_direction == 0 || ((currentRoomNumber == 0x29 || currentRoomNumber == 0x2c) && _direction == 2)) {
+		_position.y = 0xec;
+		g_engine->_room->calculateScaledSpriteDimensions(getWidth(), getHeight(), _position.y);
+		while (!g_engine->_room->canWalkAtLocation(_position.x, _position.y + 3) && _position.y > 100) {
+			_position.y--;
+		}
+	} else if (_direction == 2) {
+		while (!g_engine->_room->canWalkAtLocation(_position.x, _position.y - 5) && _position.y < 0xee && currentRoomNumber != 0x29 && currentRoomNumber != 0x2c) {
+			_position.y++;
+		}
+	} else if (_direction == 3) {
+		if (currentRoomNumber == 0x20 || currentRoomNumber == 0x1a) {
+			g_engine->scaledSpriteHeight = 5;
+		} else {
+			g_engine->_room->calculateScaledSpriteDimensions(getWidth(), getHeight(), _position.y + g_engine->scaledSpriteHeight);
+		}
+		_position.y += g_engine->scaledSpriteHeight;
+		if (_position.y > 0xee) {
+			_position.y = 0xee;
+		}
+		if (_position.x > 0x27b) {
+			_position.x = 0x27b;
+		}
+
+		int yUp = _position.y;
+		int yDown = _position.y;
+		while(!g_engine->_room->canWalkAtLocation(_position.x, yUp) && yUp < 0xee) {
+			yUp++;
+		}
+		while(!g_engine->_room->canWalkAtLocation(_position.x, yDown) && yDown > 0x28) {
+			yDown--;
+		}
+		if (yUp - _position.y < _position.y - yDown) {
+			_position.y = yUp;
+		} else {
+			_position.y = yDown;
+		}
+	} else {
+		g_engine->_room->calculateScaledSpriteDimensions(getWidth(), getHeight(), _position.y + g_engine->scaledSpriteHeight);
+		_position.y += g_engine->scaledSpriteHeight;
+		if (_position.y > 0xee) {
+			_position.y = 0xee;
+		}
+
+		int yUp = _position.y;
+		int yDown = _position.y;
+		while(!g_engine->_room->canWalkAtLocation(_position.x, yUp) && yUp < 0xee) {
+			yUp++;
+		}
+		while(!g_engine->_room->canWalkAtLocation(_position.x, yDown) && yDown > 0x28) {
+			yDown--;
+		}
+		if (yUp - _position.y < _position.y - yDown) {
+			_position.y = yUp;
+		} else {
+			_position.y = yDown;
+		}
+	}
+}
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index afd8ddbb6f0..cac79c9d92a 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -65,6 +65,7 @@ public:
 	void playerFaceWalkTarget();
 	int getWidth();
 	int getHeight();
+	void updatePlayerPositionAfterRoomChange();
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
index 6a9ff1b8702..725a85a8014 100644
--- a/engines/darkseed/sprites.cpp
+++ b/engines/darkseed/sprites.cpp
@@ -20,6 +20,7 @@
 */
 
 #include "sprites.h"
+#include "darkseed.h"
 #define DARKSEED_MAX_SPRITES_ON_SCREEN 30
 
 Darkseed::Sprites::Sprites() {
@@ -63,7 +64,7 @@ void Darkseed::Sprites::clearSpriteDrawList() {
 void Darkseed::Sprites::drawSprites() {
 	while (!spriteDrawList.empty()) {
 		SpriteDrawInstruction &drawInstruction = spriteDrawList.back();
-		drawInstruction.sprite->draw(drawInstruction.destX, drawInstruction.destY); // TODO apply scaling!
+		drawInstruction.sprite->drawScaled(drawInstruction.destX, drawInstruction.destY, drawInstruction.destW, drawInstruction.destH, drawInstruction.flip);
 		spriteDrawList.pop_back();
 	}
 }


Commit: a355322e623d6f93b5f897b587e6f742f168be9d
    https://github.com/scummvm/scummvm/commit/a355322e623d6f93b5f897b587e6f742f168be9d
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Player walking around.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 19f123fc47b..a71885858da 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -353,8 +353,62 @@ void DarkseedEngine::handleInput() {
 					// TODO complete at final destination logic. 2022:879d
 				}
 				if (!isPlayingAnimation_maybe) {
-					_player->_position = _player->_walkTarget;
-					// TODO handle walking movement here. 2022:88ca
+					int walkXDelta = 0;
+					int walkYDelta = 0;
+					int local_a = scaledWalkSpeed_maybe * 16;
+					if ( _player->_direction == 0 || _player->_direction == 2) {
+						local_a = local_a / 3;
+					}
+					if (local_a < 1000) {
+						local_a = 1000;
+					}
+					if (yDistToTarget < xDistToTarget) {
+						walkXDelta = local_a;
+						if (yDistToTarget == 0) {
+							walkYDelta = 0;
+						} else {
+							walkYDelta = (local_a * yDistToTarget) / xDistToTarget;
+						}
+					} else {
+						walkYDelta = local_a;
+						if (xDistToTarget == 0) {
+							walkXDelta = 0;
+						} else {
+							walkXDelta = (local_a * xDistToTarget) / yDistToTarget;
+						}
+					}
+					if (walkXDelta != 0) {
+						walkXDelta = walkXDelta / 1000;
+					}
+					if (walkYDelta != 0) {
+						walkYDelta = walkYDelta / 1000;
+					}
+					if (!_room->canWalkAtLocation(_player->_walkTarget.x, _player->_walkTarget.y) || _player->isAtWalkTarget()) {
+						// TODO 2022:8b62
+					} else {
+						if (_player->_walkTarget.x < _player->_position.x) {
+							if (_player->_position.x - _player->_walkTarget.x < walkXDelta) {
+								walkXDelta = _player->_position.x - _player->_walkTarget.x;
+							}
+							_player->_position.x -= walkXDelta;
+						} else if (_player->_position.x < _player->_walkTarget.x) {
+							if (_player->_walkTarget.x - _player->_position.x < walkXDelta) {
+								walkXDelta = _player->_walkTarget.x - _player->_position.x;
+							}
+							_player->_position.x += walkXDelta;
+						}
+						if (_player->_walkTarget.y < _player->_position.y) {
+							if (_player->_position.y - _player->_walkTarget.y < walkYDelta) {
+								walkYDelta = _player->_position.y - _player->_walkTarget.y;
+							}
+							_player->_position.y -= walkYDelta;
+						} else if (_player->_position.y < _player->_walkTarget.y) {
+							if (_player->_walkTarget.y - _player->_position.y < walkYDelta) {
+								walkYDelta = _player->_walkTarget.y - _player->_position.y;
+							}
+							_player->_position.y += walkYDelta;
+						}
+					}
 				}
 //				else if (_isLeftMouseClicked) {
 //					// TODO do actions here.
@@ -390,6 +444,7 @@ void DarkseedEngine::handlePointerAction() {
 		}
 	}
 }
+
 void DarkseedEngine::changeToRoom(int newRoomNumber) {
 	delete _room;
 	_room = new Room(newRoomNumber);
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index bb5979120c1..11f7c36bb58 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -153,17 +153,17 @@ void Darkseed::Room::draw() {
 	pic.draw(0x45, 0x28);
 
 	// print walkable area map.
-	for (int y = 0x28; y < pic.getHeight() + 0x28; y++) {
-		for (int x = 0x45; x < pic.getWidth() + 0x45; x++) {
-			if (canWalkAtLocation(x, y)) {
-				g_engine->_screen->drawLine(x, y, x, y, 14);
-			}
-		}
-	}
-
-	for (int i = 0; i < connectors.size(); i++) {
-		g_engine->_baseSprites.getSpriteAt(0).draw(connectors[i].x, connectors[i].y);
-	}
+//	for (int y = 0x28; y < pic.getHeight() + 0x28; y++) {
+//		for (int x = 0x45; x < pic.getWidth() + 0x45; x++) {
+//			if (canWalkAtLocation(x, y)) {
+//				g_engine->_screen->drawLine(x, y, x, y, 14);
+//			}
+//		}
+//	}
+//
+//	for (int i = 0; i < connectors.size(); i++) {
+//		g_engine->_baseSprites.getSpriteAt(0).draw(connectors[i].x, connectors[i].y);
+//	}
 }
 
 int Darkseed::Room::getObjectAtPoint(int x, int y) {


Commit: 2f390ada9a276dddb4e5db41cdb8ea7977d10702
    https://github.com/scummvm/scummvm/commit/2f390ada9a276dddb4e5db41cdb8ea7977d10702
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: More progress on player walking.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/player.cpp
    engines/darkseed/player.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index a71885858da..6c5049ba337 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -328,7 +328,7 @@ void DarkseedEngine::handleInput() {
 //											  (lVar9 = CONCAT22(playerSpriteX_long._2_2_,(uint)playerSpriteX_long),
 //											   lVar10 = CONCAT22(playerSpriteY_long._2_2_,(uint)playerSpriteY_long), previousRoomNumber != 0x3d ))))
 //										{
-//											FUN_2022_7508();
+//											_player->updateBedAutoWalkSequence();
 //											uVar4 = playerSpriteX_maybe;
 //											uVar3 = playerSpriteY_maybe;
 //											lVar9 = CONCAT22(playerSpriteX_long._2_2_,(uint)playerSpriteX_long);
@@ -353,6 +353,8 @@ void DarkseedEngine::handleInput() {
 					// TODO complete at final destination logic. 2022:879d
 				}
 				if (!isPlayingAnimation_maybe) {
+					// walk to destination point
+					Common::Point origPlayerPosition = _player->_position;
 					int walkXDelta = 0;
 					int walkYDelta = 0;
 					int local_a = scaledWalkSpeed_maybe * 16;
@@ -384,7 +386,92 @@ void DarkseedEngine::handleInput() {
 						walkYDelta = walkYDelta / 1000;
 					}
 					if (!_room->canWalkAtLocation(_player->_walkTarget.x, _player->_walkTarget.y) || _player->isAtWalkTarget()) {
-						// TODO 2022:8b62
+						bool bVar1 = false;
+						bool bVar2 = false;
+						if ((walkYDelta == 0 && _player->_position.y != _player->_walkTarget.y) ||
+							_player->_position.y == _player->_walkTarget.y) {
+							bVar2 = true;
+						}
+						if ((walkXDelta == 0 && _player->_position.x != _player->_walkTarget.x) ||
+							_player->_position.x == _player->_walkTarget.x) {
+							bVar1 = true;
+						}
+						int local_6 = 0;
+						int local_4 = 0;
+						if (_player->_walkTarget.x < _player->_position.x) {
+							if (_player->_position.x - _player->_walkTarget.x <= walkXDelta) {
+								local_6 = _player->_position.x - _player->_walkTarget.x;
+							} else {
+								local_6 = walkXDelta;
+							}
+							while (!bVar1 && local_6 > 0) {
+								if (!_room->canWalkAtLocation(_player->_position.x - local_6 - 1, _player->_position.y)) {
+									local_6--;
+								} else {
+									_player->_position.x -= local_6;
+									_player->BoolEnum_2c85_811c = true;
+									bVar1 = true;
+								}
+							}
+						} else if (_player->_position.x < _player->_walkTarget.x) {
+							if (_player->_walkTarget.x - _player->_position.x <= walkXDelta) {
+								local_6 = _player->_walkTarget.x - _player->_position.x;
+							} else {
+								local_6 = walkXDelta;
+							}
+							while (!bVar1 && local_6 > 0) {
+								if (!_room->canWalkAtLocation(_player->_position.x + local_6 + 1, _player->_position.y)) {
+									local_6--;
+								} else {
+									_player->_position.x += local_6;
+									_player->BoolEnum_2c85_811c = true;
+									bVar1 = true;
+								}
+							}
+						}
+						if (_player->_walkTarget.y < _player->_position.y) {
+							if (_player->_position.y - _player->_walkTarget.y <= walkYDelta) {
+								local_4 = _player->_position.y - _player->_walkTarget.y;
+							} else {
+								local_4 = walkYDelta;
+							}
+							while (!bVar2 && local_4 > 0) {
+								int local_34 = (_player->_position.y - local_4) - 1;
+								if (local_34 > 0xee) {
+									local_34 = 0xee;
+								}
+								if (!_room->canWalkAtLocation(_player->_position.x, (local_34 - local_4) - 2)) {
+									local_4--;
+								} else {
+									_player->_position.y -= local_4;
+									_player->BoolEnum_2c85_811c = true;
+									bVar2 = true;
+								}
+							}
+						} else if (_player->_position.y < _player->_walkTarget.y) {
+							if (_player->_walkTarget.y - _player->_position.y <= walkYDelta) {
+								local_4 = _player->_walkTarget.y - _player->_position.y;
+							} else {
+								local_4 = walkYDelta;
+							}
+							while (!bVar2 && local_4 > 0) {
+								if (!_room->canWalkAtLocation(_player->_position.x, _player->_position.y + local_4 + 2)) {
+									local_4--;
+								} else {
+									_player->_position.y += local_4;
+									_player->BoolEnum_2c85_811c = true;
+									bVar2 = true;
+								}
+							}
+						}
+
+						if (!bVar1 || !bVar2) {
+							_player->_walkTarget = _player->_position;
+						}
+						BoolByteEnum_2c85_8324 = false;
+						if (_player->_isAutoWalkingToBed && _player->isAtWalkTarget()) {
+							_player->updateBedAutoWalkSequence();
+						}
 					} else {
 						if (_player->_walkTarget.x < _player->_position.x) {
 							if (_player->_position.x - _player->_walkTarget.x < walkXDelta) {
@@ -408,6 +495,10 @@ void DarkseedEngine::handleInput() {
 							}
 							_player->_position.y += walkYDelta;
 						}
+						if (!_room->canWalkAtLocation(_player->_position.x, _player->_position.y)) {
+							_player->_position = origPlayerPosition;
+							_player->_walkTarget = origPlayerPosition;
+						}
 					}
 				}
 //				else if (_isLeftMouseClicked) {
@@ -426,13 +517,9 @@ void DarkseedEngine::handleInput() {
 		}
 	} else {
 		updateAnimation();
-//		uVar7 = playerSpriteX_maybe;
-//		uVar5 = playerSpriteY_maybe;
-//		if ((isPlayingAnimation_maybe == False) && (DAT_2c85_6b17 != '\0')) {
-//			FUN_2022_7508();
-//			uVar7 = playerSpriteX_maybe;
-//			uVar5 = playerSpriteY_maybe;
-//		}
+		if (!isPlayingAnimation_maybe && _player->_isAutoWalkingToBed) {
+			_player->updateBedAutoWalkSequence();
+		}
 	}
 }
 
@@ -730,7 +817,7 @@ void DarkseedEngine::updateAnimation() {
 				changeToRoom(5);
 			}
 //			if (isAutoWalkingToBed != False) {
-//				FUN_2022_7508();
+//				_player->updateBedAutoWalkSequence();
 //			}
 		}
 		break;
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index e467a4dadc0..34fd8b0e031 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -273,3 +273,7 @@ void Darkseed::Player::updatePlayerPositionAfterRoomChange() {
 		}
 	}
 }
+
+void Darkseed::Player::updateBedAutoWalkSequence() {
+	// TODO updateBedAutoWalkSequence.
+}
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index cac79c9d92a..a311d835158 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -66,6 +66,7 @@ public:
 	int getWidth();
 	int getHeight();
 	void updatePlayerPositionAfterRoomChange();
+	void updateBedAutoWalkSequence();
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 11f7c36bb58..8a54be59f59 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -258,6 +258,48 @@ bool Darkseed::Room::canWalkAtLocation(int x, int y) {
 	return (walkableLocationsMap[t / 8].strip[(y - 40) / 5] >> (7 - (t % 8) & 0x1f) & 1);
 }
 
+bool Darkseed::Room::canWalkInLineToTarget(int x, int y, int targetX, int targetY) {
+	int iVar2 = targetX - x;
+	int iVar3 = targetY - y;
+
+	if (iVar2 < 0 || iVar3 > 0) {
+		if (iVar2 < 1 && iVar3 < 1) {
+			if (-iVar2 <= -iVar3) {
+				int iVar4 = 0;
+				do {
+					if (x == targetX) {
+						return true;
+					}
+					iVar4 -= iVar2;
+					if (-iVar4 == iVar3 || -iVar3 < iVar4) {
+						iVar4 += iVar3;
+						x--;
+					}
+					y--;
+				} while (canWalkAtLocation(x, y));
+			}
+		} else {
+			int iVar4 = 0;
+			do {
+				if (x == targetX) {
+					return true;
+				}
+				iVar4 -= iVar3;
+				if (-iVar4 == iVar2 || -iVar2 < iVar4) {
+					iVar4 += iVar2;
+					y--;
+				}
+				x--;
+			} while (canWalkAtLocation(x, y));
+		}
+	} else if (-iVar3 < iVar2) {
+
+	} else {
+
+	}
+	return false;
+}
+
 void Darkseed::Room::printRoomDescriptionText() const {
 	int textId = roomDescriptionTextTbl[_roomNumber];
 	if (textId != 0) {
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index 5172469b7d1..d70ea34a18f 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -83,6 +83,7 @@ public:
 	bool exitRoom();
 	Common::String getRoomFilenameBase(int roomNumber);
 	bool canWalkAtLocation(int x, int y);
+	bool canWalkInLineToTarget(int x,int y,int targetX,int targetY);
 	void printRoomDescriptionText() const;
 	void calculateScaledSpriteDimensions(int width, int height, int curYPosition);
 private:


Commit: 3eaca562652ba7a890aca4b618b39eeb44efd4c5
    https://github.com/scummvm/scummvm/commit/3eaca562652ba7a890aca4b618b39eeb44efd4c5
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Started adding support for CD versions

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/detection_tables.h
    engines/darkseed/nsp.cpp
    engines/darkseed/pic.cpp
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 6c5049ba337..2ce217eed5d 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -881,4 +881,18 @@ int DarkseedEngine::getObjectUnderCursor() {
 	return -1;
 }
 
+Common::String DarkseedEngine::getRoomFilePath(const Common::String &filename) {
+	if (isCdVersion()) {
+		return "room/" + filename;
+	}
+	return filename;
+}
+
+Common::String DarkseedEngine::getPictureFilePath(const Common::String &filename) {
+	if (isCdVersion()) {
+		return "picture/" + filename;
+	}
+	return filename;
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index bfc09206daf..84da6acfa89 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -134,6 +134,10 @@ public:
 		return _randomSource.getRandomNumber(maxNum);
 	}
 
+	bool isCdVersion() {
+		return getFeatures() & ADGF_CD;
+	}
+
 	bool hasFeature(EngineFeature f) const override {
 		return
 		    (f == kSupportsLoadingDuringRuntime) ||
@@ -163,6 +167,9 @@ public:
 		return syncGame(s);
 	}
 
+	Common::String getRoomFilePath(const Common::String &filename);
+	Common::String getPictureFilePath(const Common::String &filename);
+
 	void fadeIn();
 	void fadeOut();
 
diff --git a/engines/darkseed/detection_tables.h b/engines/darkseed/detection_tables.h
index 15d37fa10ef..459edb45edd 100644
--- a/engines/darkseed/detection_tables.h
+++ b/engines/darkseed/detection_tables.h
@@ -36,6 +36,24 @@ const ADGameDescription gameDescriptions[] = {
 		ADGF_UNSTABLE,
 		GUIO1(GUIO_NONE)
 	},
+	{
+		"darkseed",
+		"CD",
+		AD_ENTRY1s("TOS.EXE", "679abf5829b2453d30b17caabafea168", 168432),
+		Common::EN_ANY,
+		Common::kPlatformDOS,
+		ADGF_UNSTABLE | ADGF_CD,
+		GUIO1(GUIO_NONE)
+	},
+	{
+		"darkseed",
+		"CD",
+		AD_ENTRY1s("DARKSEED.EXE", "27321d178a553c4dc17d1a2a601a9a6f", 1432140),
+		Common::JA_JPN,
+		Common::kPlatformWindows,
+		ADGF_UNSTABLE | ADGF_CD,
+		GUIO1(GUIO_NONE)
+	},
 
 	AD_TABLE_END_MARKER
 };
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index 395aaf1510f..c29da56da97 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -120,14 +120,15 @@ void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destH
 
 bool Darkseed::Nsp::load(const Common::String &filename) {
 	Common::File file;
-	if(!file.open(filename)) {
+	Common::String filePath = g_engine->getRoomFilePath(filename);
+	if(!file.open(filePath)) {
 		return false;
 	}
 	bool ret = load(file);
 	file.close();
 	if (ret) {
-		debug("Loaded %s", filename.c_str());
-		Common::String obtFilename = filename.substr(0, filename.size() - 4) + ".obt";
+		debug("Loaded %s", filePath.c_str());
+		Common::String obtFilename = filePath.substr(0, filePath.size() - 4) + ".obt";
 		ret = loadObt(obtFilename);
 	}
 	return ret;
diff --git a/engines/darkseed/pic.cpp b/engines/darkseed/pic.cpp
index ff927dc24e7..d48e1bcf909 100644
--- a/engines/darkseed/pic.cpp
+++ b/engines/darkseed/pic.cpp
@@ -25,14 +25,15 @@
 
 bool Darkseed::Pic::load(const Common::String &filename) {
 	Common::File file;
-	if(!file.open(filename)) {
-		debug("Failed to load %s", filename.c_str());
+	Common::String fullPath = g_engine->getPictureFilePath(filename);
+	if(!file.open(fullPath)) {
+		debug("Failed to load %s", fullPath.c_str());
 		return false;
 	}
 	bool ret = load(file);
 	file.close();
 	if (ret) {
-		debug("Loaded %s (%d,%d)", filename.c_str(), width, height);
+		debug("Loaded %s (%d,%d)", fullPath.c_str(), width, height);
 	}
 	return ret;
 }
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 8a54be59f59..1ae9ae79c3a 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -56,7 +56,7 @@ bool Darkseed::Room::load() {
 	Common::String filenameBase = getRoomFilenameBase(_roomNumber);
 	Common::String romFilename;
 	Common::File file;
-	romFilename = Common::String::format("%s.rom", filenameBase.c_str(), _roomNumber);
+	romFilename = g_engine->getRoomFilePath(Common::String::format("%s.rom", filenameBase.c_str(), _roomNumber));
 	if(!file.open(romFilename)) {
 		return false;
 	}
@@ -133,7 +133,7 @@ bool Darkseed::Room::load() {
 		return false;
 	}
 
-	_pal.load(Common::String::format("%s.pal", filenameBase.c_str()));
+	_pal.load(g_engine->getPictureFilePath(Common::String::format("%s.pal", filenameBase.c_str())));
 
 	return true;
 }


Commit: a031bf341b6c679214b16c78db7d6769e3409840
    https://github.com/scummvm/scummvm/commit/a031bf341b6c679214b16c78db7d6769e3409840
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added `dt` debug command. Print day and time.

Changed paths:
    engines/darkseed/debugconsole.cpp
    engines/darkseed/debugconsole.h


diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
index 2d49f753af3..8507b090904 100644
--- a/engines/darkseed/debugconsole.cpp
+++ b/engines/darkseed/debugconsole.cpp
@@ -19,12 +19,14 @@
  *
  */
 
+#include "darkseed.h"
 #include "darkseed/debugconsole.h"
 
 namespace Darkseed {
 
 DebugConsole::DebugConsole(TosText *tosText) : GUI::Debugger(), tosText(tosText) {
 	registerCmd("tostext",   WRAP_METHOD(DebugConsole, Cmd_tostext));
+	registerCmd("dt",   WRAP_METHOD(DebugConsole, Cmd_dt));
 }
 
 DebugConsole::~DebugConsole() {
@@ -45,4 +47,14 @@ bool DebugConsole::Cmd_tostext(int argc, const char **argv) {
 	return true;
 }
 
+bool DebugConsole::Cmd_dt(int argc, const char **argv) {
+	int hour = g_engine->_currentTimeInSeconds / 60 / 60 + 1;
+	debugPrintf("Day %d at %d:%02d%s (%d seconds)\n",
+				g_engine->_currentDay,
+				hour % 12,
+				(g_engine->_currentTimeInSeconds / 60) % 60,
+				hour < 12 ? "AM" : "PM", g_engine->_currentTimeInSeconds);
+	return true;
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/debugconsole.h b/engines/darkseed/debugconsole.h
index e3e36e7c8ae..2e5b77813fe 100644
--- a/engines/darkseed/debugconsole.h
+++ b/engines/darkseed/debugconsole.h
@@ -33,6 +33,7 @@ private:
 	TosText *tosText;
 private:
 	bool Cmd_tostext(int argc, const char **argv);
+	bool Cmd_dt(int argc, const char **argv);
 public:
 	DebugConsole(TosText *tostext);
 	~DebugConsole() override;


Commit: 1cc274a3a3c02280754b4376c8a82e66b33dea68
    https://github.com/scummvm/scummvm/commit/1cc274a3a3c02280754b4376c8a82e66b33dea68
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Adding console support.

Changed paths:
  A engines/darkseed/gamefont.cpp
  A engines/darkseed/gamefont.h
    engines/darkseed/console.cpp
    engines/darkseed/console.h
    engines/darkseed/darkseed.cpp


diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index 5e417b33d90..555611981d7 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -25,13 +25,68 @@
 namespace Darkseed {
 
 Console::Console(TosText *tosText) : _tosText(tosText) {
-	if(!_font.load("tosfont.nsp")) {
+	if(!_font.load()) {
 		error("Error loading tosfont.nsp");
 	}
+	_text.resize(10);
 }
 
 void Console::printTosText(int tosIndex) {
-	debug(_tosText->getText(tosIndex).c_str());
+	const Common::String &text = _tosText->getText(tosIndex);
+	debug(text.c_str());
+	addLine(" ");
+	auto lines = wrapText(text);
+	for (auto &line : lines) {
+		addLine(line);
+	}
+}
+
+void Console::draw() {
+	int curIdx = _startIdx == 0 ? _text.size() - 1 : _startIdx - 1;
+	int y = 0x139;
+	for (int i = 0; i < 4 && curIdx != _startIdx && !_text[curIdx].empty(); i++) {
+		_font.displayString(0x70, y, _text[curIdx]);
+		y -= 11;
+		curIdx = curIdx == 0 ? _text.size() - 1 : curIdx - 1;
+	}
+}
+
+Common::Array<Common::String> Console::wrapText(const Common::String &text) {
+	Common::Array<Common::String> lines;
+	Common::String line;
+	Common::String word;
+	int lineLength = 0;
+
+	for (int i = 0; i < text.size(); i++) {
+		word += text[i];
+		if (text[i] == ' ' || text[i] == '\r') {
+			int wordLength = _font.stringLength(word);
+			if (lineLength + wordLength > 0x1a0) {
+				lines.push_back(line);
+				line = word;
+				lineLength = wordLength;
+			} else {
+				line += word;
+				lineLength += wordLength;
+			}
+			word = "";
+		}
+		if (text[i] == '\r') {
+			break;
+		}
+	}
+
+	if (!line.empty() || !word.empty()) {
+		line += word;
+		lines.push_back(line);
+	}
+
+	return lines;
+}
+
+void Console::addLine(const Common::String &line) {
+	_text[_startIdx] = line;
+	_startIdx = (_startIdx + 1) % _text.size();
 }
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
index 3dc18debae1..f8b114fcd4b 100644
--- a/engines/darkseed/console.h
+++ b/engines/darkseed/console.h
@@ -23,20 +23,30 @@
 #ifndef DARKSEED_CONSOLE_H
 #define DARKSEED_CONSOLE_H
 
-#include "tostext.h"
+#include "gamefont.h"
 #include "nsp.h"
+#include "tostext.h"
 
 namespace Darkseed {
 
 class Console  {
 private:
 	TosText *_tosText;
-	Nsp _font;
+	GameFont _font;
+
+	Common::Array<Common::String> _text;
+	int _startIdx = 0;
 
 public:
 	Console(TosText *tostext);
 
 	void printTosText(int tosIndex);
+
+	void draw();
+
+private:
+	Common::Array<Common::String> wrapText(const Common::String &text);
+	void addLine(const Common::String &line);
 };
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 2ce217eed5d..5dcfde3601e 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -182,6 +182,7 @@ void DarkseedEngine::gameloop() {
 		_frame.draw();
 		_room->draw();
 		_sprites.drawSprites();
+		_console->draw();
 		_cursor.draw();
 		_screen->makeAllDirty();
 		_screen->update();
diff --git a/engines/darkseed/gamefont.cpp b/engines/darkseed/gamefont.cpp
new file mode 100644
index 00000000000..f32668b9f9c
--- /dev/null
+++ b/engines/darkseed/gamefont.cpp
@@ -0,0 +1,96 @@
+/* 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 "darkseed.h"
+#include "gamefont.h"
+
+namespace Darkseed {
+extern DarkseedEngine *g_engine;
+
+Darkseed::GameFont::GameFont() {
+}
+
+bool GameFont::load() {
+	return letters.load("tosfont.nsp");
+}
+
+void GameFont::displayString(uint16 x, uint16 y, const Common::String &text) {
+	for (int i = 0; i < text.size(); i++) {
+		auto letter = getCharacterSprite(text[i]);
+		if (letter) {
+			letter->draw(x, y);
+			x += letter->width + 1;
+		}
+	}
+}
+
+int GameFont::stringLength(const Common::String &text) {
+	int width = 0;
+	for (int i = 0; i < text.size(); i++) {
+		const Sprite *sprite = getCharacterSprite(text[i]);
+		if (sprite) {
+			width += sprite->width + 1;
+		}
+	}
+	return width;
+}
+
+const Sprite *GameFont::getCharacterSprite(char c) {
+	int letterIdx = 1000;
+	switch (c) {
+	case 0x20 : letterIdx = 0x46; break;
+	case 0x21 : letterIdx = 0x36; break;
+	case 0x22 : letterIdx = 0x3a; break;
+	case 0x27 : letterIdx = 0x45; break;
+	case 0x28 : letterIdx = 0x37; break;
+	case 0x29 : letterIdx = 0x38; break;
+	case 0x2b : letterIdx = 0xa; break;
+	case 0x2c : letterIdx = 0x34; break;
+	case 0x2d : letterIdx = 0x46; break;
+	case 0x2e : letterIdx = 0x35; break;
+	case 0x3a : letterIdx = 0x47; break;
+	case 0x3f : letterIdx = 0x39; break;
+	case 0x5e : letterIdx = 0x3a; break;
+
+	default: {
+		if (c < 0x41 || c > 0x5a) {
+			if (c < 0x61 || c > 0x7a) {
+				if (c > 0x2f && c < 0x3a) {
+					letterIdx = c + 0xb;
+				}
+			} else {
+				letterIdx = c - 0x61;
+			}
+		} else {
+			letterIdx = c - 0x27;
+		}
+		break;
+	}
+	}
+
+	if (letterIdx != 1000) {
+		return &letters.getSpriteAt(letterIdx);
+	}
+
+	return nullptr;
+}
+
+} // namespace Darkseed
\ No newline at end of file
diff --git a/engines/darkseed/gamefont.h b/engines/darkseed/gamefont.h
new file mode 100644
index 00000000000..1e3ad743d44
--- /dev/null
+++ b/engines/darkseed/gamefont.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 DARKSEED_GAMEFONT_H
+#define DARKSEED_GAMEFONT_H
+
+#include "nsp.h"
+namespace Darkseed {
+
+class GameFont {
+private:
+	Nsp letters;
+
+public:
+	GameFont();
+	bool load();
+	void displayString(uint16 x, uint16 y, const Common::String &text);
+	int stringLength(const Common::String &text);
+private:
+	const Sprite *getCharacterSprite(char c);
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_GAMEFONT_H


Commit: ed2647fd78cdbcd22245daf38defdb908626109c
    https://github.com/scummvm/scummvm/commit/ed2647fd78cdbcd22245daf38defdb908626109c
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: fixing build config

Changed paths:
    engines/darkseed/module.mk


diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
index 5359b56ac9a..9c3df809b6b 100644
--- a/engines/darkseed/module.mk
+++ b/engines/darkseed/module.mk
@@ -10,6 +10,7 @@ MODULE_OBJS = \
 	pic.o \
 	pal.o \
 	titlefont.o \
+	gamefont.o \
 	tostext.o \
 	metaengine.o \
 	room.o \


Commit: ae283b9e74915037c30523f669a06903d48ea30d
    https://github.com/scummvm/scummvm/commit/ae283b9e74915037c30523f669a06903d48ea30d
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Started to add object and invetory logic.

Changed paths:
  A engines/darkseed/inventory.cpp
  A engines/darkseed/inventory.h
  A engines/darkseed/objects.cpp
  A engines/darkseed/objects.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/debugconsole.cpp
    engines/darkseed/debugconsole.h
    engines/darkseed/module.mk
    engines/darkseed/sprites.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 5dcfde3601e..bd9b922f7fb 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -141,6 +141,13 @@ Common::Error DarkseedEngine::run() {
 		_player->_direction = 1;
 		setupOtherNspAnimation(0, 1);
 //		bVar1 = true;
+		if (_currentDay == 1) {
+			_console->printTosText(8);
+		} else if (_currentDay == 2) {
+			_console->printTosText(0xc);
+		} else if (_currentDay == 3) {
+			_console->printTosText(0xe);
+		}
 	}
 
 	gameloop();
@@ -207,10 +214,11 @@ void DarkseedEngine::updateEvents() {
 }
 
 void DarkseedEngine::wait() {
-	g_system->delayMillis(15);
+	g_system->delayMillis(100);
 }
 
 void DarkseedEngine::handleInput() {
+	// FUN_2022_762b_handles_mouse_click_action
 	int currentRoomNumber = _room->_roomNumber;
 	if (_player->_isAutoWalkingToBed && currentRoomNumber == 0 && _player->isAtPosition(0xdf, 0xbe)) {
 		_player->_isAutoWalkingToBed = false;
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 84da6acfa89..fccb2c2ba02 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -37,7 +37,9 @@
 #include "console.h"
 #include "cursor.h"
 #include "darkseed/detection.h"
+#include "inventory.h"
 #include "nsp.h"
+#include "objects.h"
 #include "player.h"
 #include "room.h"
 #include "sprites.h"
@@ -75,6 +77,8 @@ public:
 	ActionMode _actionMode = PointerAction;
 	Player *_player = nullptr;
 	Sprites _sprites;
+	Objects _objects;
+	Inventory _inventory;
 
 	int _currentDay = 1;
 	int _currentTimeInSeconds = 0x7e8e;
diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
index 8507b090904..c6e7bf188ce 100644
--- a/engines/darkseed/debugconsole.cpp
+++ b/engines/darkseed/debugconsole.cpp
@@ -27,6 +27,8 @@ namespace Darkseed {
 DebugConsole::DebugConsole(TosText *tosText) : GUI::Debugger(), tosText(tosText) {
 	registerCmd("tostext",   WRAP_METHOD(DebugConsole, Cmd_tostext));
 	registerCmd("dt",   WRAP_METHOD(DebugConsole, Cmd_dt));
+	registerCmd("getvar",   WRAP_METHOD(DebugConsole, Cmd_getvar));
+	registerCmd("setvar",   WRAP_METHOD(DebugConsole, Cmd_setvar));
 }
 
 DebugConsole::~DebugConsole() {
@@ -57,4 +59,28 @@ bool DebugConsole::Cmd_dt(int argc, const char **argv) {
 	return true;
 }
 
+bool DebugConsole::Cmd_getvar(int argc, const char **argv) {
+	if (argc != 2) {
+		debugPrintf("Usage: getvar <index>\n");
+		return true;
+	}
+
+	uint16 varIdx = atoi(argv[1]);
+	debugPrintf("Object Var: %d\n", g_engine->_objects.getVar(varIdx));
+	return true;
+}
+
+bool DebugConsole::Cmd_setvar(int argc, const char **argv) {
+	if (argc != 3) {
+		debugPrintf("Usage: setvar <index> <newValue>\n");
+		return true;
+	}
+
+	uint16 varIdx = atoi(argv[1]);
+	int16 newValue = atoi(argv[2]);
+
+	g_engine->_objects.setVar(varIdx, newValue);
+	return true;
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/debugconsole.h b/engines/darkseed/debugconsole.h
index 2e5b77813fe..62ac0138185 100644
--- a/engines/darkseed/debugconsole.h
+++ b/engines/darkseed/debugconsole.h
@@ -34,6 +34,8 @@ private:
 private:
 	bool Cmd_tostext(int argc, const char **argv);
 	bool Cmd_dt(int argc, const char **argv);
+	bool Cmd_getvar(int argc, const char **argv);
+	bool Cmd_setvar(int argc, const char **argv);
 public:
 	DebugConsole(TosText *tostext);
 	~DebugConsole() override;
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
new file mode 100644
index 00000000000..b730884332c
--- /dev/null
+++ b/engines/darkseed/inventory.cpp
@@ -0,0 +1,32 @@
+/* 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 "inventory.h"
+
+constexpr uint16 MAX_INVENTORY = 42;
+Darkseed::Inventory::Inventory() {
+	reset();
+}
+
+void Darkseed::Inventory::reset() {
+	_inventory.clear();
+	_inventory.push_back(8);
+}
diff --git a/engines/darkseed/inventory.h b/engines/darkseed/inventory.h
new file mode 100644
index 00000000000..aeb5a60450b
--- /dev/null
+++ b/engines/darkseed/inventory.h
@@ -0,0 +1,38 @@
+/* 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 DARKSEED_INVENTORY_H
+#define DARKSEED_INVENTORY_H
+
+#include "common/list.h"
+namespace Darkseed {
+
+class Inventory {
+private:
+	Common::List<uint8> _inventory;
+public:
+	Inventory();
+	void reset();
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_INVENTORY_H
diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
index 9c3df809b6b..26cdb7d3914 100644
--- a/engines/darkseed/module.mk
+++ b/engines/darkseed/module.mk
@@ -16,7 +16,9 @@ MODULE_OBJS = \
 	room.o \
 	cursor.o \
 	player.o \
-	sprites.o
+	sprites.o \
+	objects.o \
+	inventory.o
 
 # This module can be built as a plugin
 ifeq ($(ENABLE_DARKSEED), DYNAMIC_PLUGIN)
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
new file mode 100644
index 00000000000..d50751c9cba
--- /dev/null
+++ b/engines/darkseed/objects.cpp
@@ -0,0 +1,61 @@
+/* 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 "objects.h"
+
+constexpr int MAX_OBJECTS = 199;
+
+Darkseed::Objects::Objects() {
+	_objectVar.resize(MAX_OBJECTS);
+	_objectRunningCode.resize(MAX_OBJECTS);
+	_moveObjectX.resize(MAX_OBJECTS);
+	_moveObjectY.resize(MAX_OBJECTS);
+	_moveObjectRoom.resize(MAX_OBJECTS); // The original only allocates 42 entries here but writes 199 in the save file!
+	reset();
+}
+
+void Darkseed::Objects::reset() {
+	for (int i = 0; i < MAX_OBJECTS; i++) {
+		_objectVar[i] = 0;
+		_objectRunningCode[i] = 0;
+		_moveObjectX[i] = 0; // TODO verify this is the correct reset state for these XY vars.
+		_moveObjectY[i] = 0;
+		_moveObjectRoom[i] = i < 42 ? 0xff : 0; // Hack for weird behaviour in original engine.
+	}
+	// Initial object state.
+	setVar(52, 1);
+	setVar(112, 0);
+	setVar(62, 0);
+}
+
+void Darkseed::Objects::setVar(uint16 varIdx, int16 newValue) {
+	if (varIdx >= MAX_OBJECTS) {
+		error("setVar: Object Index out of range! %d", varIdx);
+	}
+	_objectVar[varIdx] = newValue;
+}
+
+int16 Darkseed::Objects::getVar(uint16 varIdx) {
+	if (varIdx >= MAX_OBJECTS) {
+		error("getVar: Object Index out of range! %d", varIdx);
+	}
+	return _objectVar[varIdx];
+}
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
new file mode 100644
index 00000000000..0bb3b698dae
--- /dev/null
+++ b/engines/darkseed/objects.h
@@ -0,0 +1,46 @@
+/* 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 DARKSEED_OBJECTS_H
+#define DARKSEED_OBJECTS_H
+
+#include "common/array.h"
+namespace Darkseed {
+
+class Objects {
+private:
+	Common::Array<int16> _objectVar;
+	Common::Array<int16> _objectRunningCode;
+	Common::Array<uint16> _moveObjectX;
+	Common::Array<uint16> _moveObjectY;
+	Common::Array<uint8> _moveObjectRoom;
+
+public:
+	Objects();
+	void reset();
+
+	void setVar(uint16 varIdx, int16 newValue);
+	int16 getVar(uint16 varIdx);
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_OBJECTS_H
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
index 725a85a8014..5ac79f5a1fe 100644
--- a/engines/darkseed/sprites.cpp
+++ b/engines/darkseed/sprites.cpp
@@ -62,9 +62,8 @@ void Darkseed::Sprites::clearSpriteDrawList() {
 }
 
 void Darkseed::Sprites::drawSprites() {
-	while (!spriteDrawList.empty()) {
-		SpriteDrawInstruction &drawInstruction = spriteDrawList.back();
+	for (int i = spriteDrawList.size() - 1; i >= 0; i--) {
+		SpriteDrawInstruction &drawInstruction = spriteDrawList[i];
 		drawInstruction.sprite->drawScaled(drawInstruction.destX, drawInstruction.destY, drawInstruction.destW, drawInstruction.destH, drawInstruction.flip);
-		spriteDrawList.pop_back();
 	}
 }


Commit: 5ff6bf8d271d1bf3eecb4a23d041547fadb9ed83
    https://github.com/scummvm/scummvm/commit/5ff6bf8d271d1bf3eecb4a23d041547fadb9ed83
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Lock game logic to 10fps

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index bd9b922f7fb..24584f542b5 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -183,8 +183,12 @@ void DarkseedEngine::gameloop() {
 	while (!shouldQuit()) {
 		updateEvents();
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
-		handleInput();
-		updateDisplay();
+		if (systemTimerCounter == 5) {
+			handleInput();
+			updateDisplay();
+			_isRightMouseClicked = false;
+			_isLeftMouseClicked = false;
+		}
 		_room->update();
 		_frame.draw();
 		_room->draw();
@@ -199,22 +203,26 @@ void DarkseedEngine::gameloop() {
 
 void DarkseedEngine::updateEvents() {
 	Common::Event event;
-	_isRightMouseClicked = false;
-	_isLeftMouseClicked = false;
+//	_isRightMouseClicked = false;
+//	_isLeftMouseClicked = false;
 	while (g_system->getEventManager()->pollEvent(event)) {
 		switch (event.type) {
 		case Common::EVENT_MOUSEMOVE: _cursor.updatePosition(event.mouse.x, event.mouse.y); break;
 		case Common::EVENT_RBUTTONDOWN: _isRightMouseClicked = true; break;
-		case Common::EVENT_RBUTTONUP: _isRightMouseClicked = false; break;
+//		case Common::EVENT_RBUTTONUP: _isRightMouseClicked = false; break;
 		case Common::EVENT_LBUTTONDOWN: _isLeftMouseClicked = true; break;
-		case Common::EVENT_LBUTTONUP: _isLeftMouseClicked = false; break;
+//		case Common::EVENT_LBUTTONUP: _isLeftMouseClicked = false; break;
 		default: break;
 		}
 	}
 }
 
 void DarkseedEngine::wait() {
-	g_system->delayMillis(100);
+	g_system->delayMillis(16);
+	systemTimerCounter++;
+	if (systemTimerCounter == 6) {
+		systemTimerCounter = 0;
+	}
 }
 
 void DarkseedEngine::handleInput() {
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index fccb2c2ba02..6c2f96f9e56 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -120,6 +120,7 @@ public:
 
 	uint8 targetPlayerDirection = 0; // related to changing rooms.
 
+	uint8 systemTimerCounter = 0;
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	~DarkseedEngine() override;


Commit: 802526b30451a003d25f6e19afe6f803c755c854
    https://github.com/scummvm/scummvm/commit/802526b30451a003d25f6e19afe6f803c755c854
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Cursor hotspot updates

Changed paths:
    engines/darkseed/cursor.cpp
    engines/darkseed/cursor.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/cursor.cpp b/engines/darkseed/cursor.cpp
index f08975badca..882edfdb710 100644
--- a/engines/darkseed/cursor.cpp
+++ b/engines/darkseed/cursor.cpp
@@ -68,3 +68,7 @@ int Darkseed::Cursor::getHeight() {
 const Darkseed::Sprite &Darkseed::Cursor::getSprite() {
 	return g_engine->_baseSprites.getSpriteAt(_currentCursorType);
 }
+
+const Darkseed::Sprite &Darkseed::Cursor::getSpriteForType(Darkseed::CursorType cursorType) {
+	return g_engine->_baseSprites.getSpriteAt(cursorType);
+}
diff --git a/engines/darkseed/cursor.h b/engines/darkseed/cursor.h
index 0e58fe58202..8d22a9e5902 100644
--- a/engines/darkseed/cursor.h
+++ b/engines/darkseed/cursor.h
@@ -54,7 +54,7 @@ public:
 	int getWidth();
 	int getHeight();
 	const Sprite &getSprite();
-
+	const Sprite &getSpriteForType(CursorType cursorType);
 	void updatePosition(int16 x, int16 y);
 	void draw();
 };
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 1ae9ae79c3a..ee0cb7dd754 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -85,22 +85,22 @@ bool Darkseed::Room::load() {
 	}
 
 	for (int i = 0; i < 30; i++) {
-		room3[i].unk0 = file.readUint16BE();
-		room3[i].unk2 = file.readUint16BE();
+		room3[i].type = file.readUint16BE();
+		room3[i].objNum = file.readUint16BE();
 		room3[i].xOffset = file.readUint16BE();
 		room3[i].yOffset = file.readUint16BE();
 		room3[i].width = file.readUint16BE();
 		room3[i].height = file.readUint16BE();
-		room3[i].unkc = file.readByte();
-		room3[i].unkd = file.readByte();
+		room3[i].depth = file.readByte();
+		room3[i].spriteNum = file.readByte();
 
-		if (room3[i].unkd >= 0x29 && room3[i].unk0 != 0 && room3[i].unk0 != 1000) {
+		if (room3[i].spriteNum >= 0x29 && room3[i].type != 0 && room3[i].type != 1000) {
 			room3[i].height = 0x14;
 			room3[i].width = 0x14;
-			room3[i].unk0 = 0;
+			room3[i].type = 0;
 		}
 
-		if (room3[i].unk2 == 0 && room3[i].unk0 == 1) {
+		if (room3[i].objNum == 0 && room3[i].type == 1) {
 			if (connectors.size() == 0xc) {
 				error("Too many connectors in this room, max of %d", 0xc);
 			}
@@ -123,7 +123,7 @@ bool Darkseed::Room::load() {
 
 			debug("Room Connector: %d %d", connector.x, connector.y);
 			connectors.push_back(connector);
-			room3[i].unk0 = 0xff;
+			room3[i].type = 0xff;
 		}
 	}
 
@@ -166,45 +166,78 @@ void Darkseed::Room::draw() {
 //	}
 }
 
-int Darkseed::Room::getObjectAtPoint(int x, int y) {
-	const Sprite &cursorSprite = g_engine->_cursor.getSprite();
+int Darkseed::Room::checkCursorAndMoveableObjects() {
 	ActionMode actionMode = g_engine->_actionMode;
+	const Sprite &cursorSprite = (actionMode == LookAction)
+									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
+									 : g_engine->_cursor.getSprite();
 	bool hasObject = false;
+	int objNum = -1;
 	for (int i = 0; i < room3.size(); i++) {
-		if (room3[i].unk0 == 0
+		if ((room3[i].type == 1 || room3[i].type == 3)
 			&& room3[i].xOffset <= cursorSprite.width + g_engine->_cursor.getX()
 			&& g_engine->_cursor.getX() <= room3[i].width + room3[i].xOffset
 			&& room3[i].yOffset <= cursorSprite.height + g_engine->_cursor.getY()
 			&& g_engine->_cursor.getY() <= room3[i].height + room3[i].yOffset
 		) {
-			if (actionMode != PointerAction && room3[i].unk2 >= 5) {
+			if (room3[i].objNum == 25) {
+				if (g_engine->_objects.getVar(80) < 3) {
+					hasObject = false;
+				} else {
+					hasObject = true;
+				}
+			}
+
+			if (room3[i].objNum == 14 && g_engine->_cursor.getY() > 40 && g_engine->_objects.getVar(86) == 0) {
+				hasObject = false;
+			}
+
+			if (hasObject) {
+				objNum = i;
+			}
+		}
+	}
+	return hasObject ? objNum : -1;
+}
+
+int Darkseed::Room::checkCursorAndStaticObjects(int x, int y) {
+	ActionMode actionMode = g_engine->_actionMode;
+	const Sprite &cursorSprite = (actionMode == LookAction)
+									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
+									 : g_engine->_cursor.getSprite();
+	bool hasObject = false;
+	for (int i = 0; i < room3.size(); i++) {
+		if (room3[i].type == 0
+			&& room3[i].xOffset <= cursorSprite.width + g_engine->_cursor.getX()
+			&& g_engine->_cursor.getX() <= room3[i].width + room3[i].xOffset
+			&& room3[i].yOffset <= cursorSprite.height + g_engine->_cursor.getY()
+			&& g_engine->_cursor.getY() <= room3[i].height + room3[i].yOffset
+		) {
+			if (actionMode != PointerAction && room3[i].objNum >= 5) {
 				hasObject = true;
 			}
 
-			if (actionMode == PointerAction && room3[i].unk2 < 6) {
+			if (actionMode == PointerAction && room3[i].objNum < 6) {
 				hasObject = true;
 			}
 
-			if (room3[i].unk2 == 0x3b || room3[i].unk2 == 0x4e) {
-				// TODO
-//				if (DAT_2c85_8186 == 1) {
-//					hasObject = true;
-//				}
-//				else {
-//					hasObject = false;
-//				}
+			if (room3[i].objNum == 59 || room3[i].objNum == 78) {
+				if (g_engine->_objects.getVar(34) == 1) {
+					hasObject = true;
+				} else {
+					hasObject = false;
+				}
 			}
 
-			if (room3[i].unk2 == 0x19 && hasObject) {
-//				if (DAT_2c85_81e2 < 2) {
-//					hasObject = false;
-//				}
-//				else {
-//					hasObject = true;
-//				}
+			if (room3[i].objNum == 0x19 && hasObject) {
+				if (g_engine->_objects.getVar(80) < 2) {
+					hasObject = false;
+				} else {
+					hasObject = true;
+				}
 			}
 
-			if (room3[i].unk2 == 0x74 && hasObject && (int)actionMode != 0x13) {
+			if (room3[i].objNum == 0x74 && hasObject && (int)actionMode != 0x13) {
 				hasObject = false;
 			}
 
@@ -217,8 +250,23 @@ int Darkseed::Room::getObjectAtPoint(int x, int y) {
 }
 
 void Darkseed::Room::update() {
-	int objectUnderCursor = getObjectAtPoint(g_engine->_cursor.getX(), g_engine->_cursor.getY());
-	if (g_engine->_actionMode == PointerAction) {
+	if (g_engine->_actionMode == HandAction) {
+		int moveableObj = checkCursorAndMoveableObjects();
+		if (moveableObj == -1) {
+			int objectUnderCursor = checkCursorAndStaticObjects(g_engine->_cursor.getX(), g_engine->_cursor.getY());
+			if (objectUnderCursor == -1) {
+				// TODO CheckCursorAndMovedObjects();
+				g_engine->_cursor.setCursorType(Hand);
+			} else {
+				g_engine->_cursor.setCursorType(HandPointing);
+			}
+		} else {
+			g_engine->_cursor.setCursorType(HandPointing);
+		}
+	} else if (g_engine->_actionMode == LookAction) {
+
+	} else if (g_engine->_actionMode == PointerAction) {
+		int objectUnderCursor = checkCursorAndStaticObjects(g_engine->_cursor.getX(), g_engine->_cursor.getY());
 		g_engine->_cursor.setCursorType(objectUnderCursor != -1 ? ConnectorEntrance : Pointer);
 	}
 }
@@ -227,7 +275,7 @@ bool Darkseed::Room::exitRoom() {
 	return false;
 }
 int Darkseed::Room::getExitRoomNumberAtPoint(int x, int y) {
-	int obj = getObjectAtPoint(x, y);
+	int obj = checkCursorAndStaticObjects(x, y);
 	for (int i = 0; i < room1.size(); i++) {
 		if (
 			room1[i].roomNumber != 0xff
@@ -310,9 +358,9 @@ void Darkseed::Room::printRoomDescriptionText() const {
 int Darkseed::Room::getObjectNumUnder6AtCursor() {
 	for (int i = 0; i < room3.size(); i++) {
 		Common::Rect roomRect(room3[i].xOffset, room3[i].yOffset, room3[i].xOffset + room3[i].width, room3[i].yOffset + room3[i].height);
-		if (room3[i].unk0 == 0 && room3[i].unk2 < 6 && roomRect.contains(g_engine->_cursor.getPosition())) {
+		if (room3[i].type == 0 && room3[i].objNum < 6 && roomRect.contains(g_engine->_cursor.getPosition())) {
 			selectedObjIndex = i;
-			return room3[i].unk2;
+			return room3[i].objNum;
 		}
 	}
 	return 0;
@@ -320,7 +368,7 @@ int Darkseed::Room::getObjectNumUnder6AtCursor() {
 
 void Darkseed::Room::getWalkTargetForObjectType_maybe(int objId) {
 	for (int i = 0; i < room3.size(); i++) {
-		if (room3[i].unk2 == objId && room3[i].unk0 == 4) {
+		if (room3[i].objNum == objId && room3[i].type == 4) {
 			g_engine->_player->_walkTarget.x = room3[i].xOffset;
 			g_engine->_player->_walkTarget.y = room3[i].yOffset;
 			for (int j = 0; j < room1.size(); j++) {
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index d70ea34a18f..f2e2ab7352a 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -41,15 +41,15 @@ struct RoomStruct2 {
 	uint8 strip[40];
 };
 
-struct RoomStruct3 {
-	uint16 unk0 = 0;
-	uint16 unk2 = 0;
+struct RoomObjElement {
+	uint16 type = 0;
+	uint16 objNum = 0;
 	uint16 xOffset = 0;
 	uint16 yOffset = 0;
 	uint16 width = 0;
 	uint16 height = 0;
-	uint8 unkc = 0;
-	uint8 unkd = 0;
+	uint8 depth = 0;
+	uint8 spriteNum = 0;
 };
 
 struct RoomConnector {
@@ -65,7 +65,7 @@ public:
 
 	Common::Array<RoomExit> room1;
 	Common::Array<RoomStruct2> walkableLocationsMap;
-	Common::Array<RoomStruct3> room3;
+	Common::Array<RoomObjElement> room3;
 	Common::Array<RoomConnector> connectors;
 
 	uint16 selectedObjIndex = 0;
@@ -76,7 +76,8 @@ public:
 
 	void update();
 
-	int getObjectAtPoint(int x, int y);
+	int checkCursorAndMoveableObjects();
+	int checkCursorAndStaticObjects(int x, int y);
 	int getObjectNumUnder6AtCursor();
 	void getWalkTargetForObjectType_maybe(int objId);
 	int getExitRoomNumberAtPoint(int x, int y);


Commit: 3bd3f149160d77f5a36329ae92a28e7bde8cf945
    https://github.com/scummvm/scummvm/commit/3bd3f149160d77f5a36329ae92a28e7bde8cf945
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Work on non-pointer cursor logic.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/debugconsole.cpp
    engines/darkseed/debugconsole.h
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h
    engines/darkseed/player.cpp
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 24584f542b5..5059341de6a 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -225,6 +225,89 @@ void DarkseedEngine::wait() {
 	}
 }
 
+static constexpr uint8 walkToDirTbl[] =
+	{0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+	 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+	 0x04, 0x04, 0x04, 0x01, 0x04, 0x04, 0x04, 0x00,
+	 0x04, 0x04, 0x04, 0x04, 0x01, 0x04, 0x01, 0x00,
+	 0x00, 0x00, 0x04, 0x01, 0x04, 0x04, 0x04, 0x04,
+	 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x00, 0x03,
+	 0x01, 0x04, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00,
+	 0x04, 0x01, 0x04, 0x04, 0x04, 0x00, 0x04, 0x04,
+	 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04,
+	 0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x04, 0x04,
+	 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03,
+	 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03,
+	 0x03, 0x03, 0x01, 0x04, 0x03, 0x00, 0x04, 0x00,
+	 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x04,
+	 0x04, 0x04, 0x03, 0x04, 0x04, 0x01, 0x00, 0x04,
+	 0x04, 0x04, 0x04, 0x03, 0x04, 0x04, 0x04, 0x01,
+	 0x04, 0x04, 0x03, 0x04, 0x04, 0x00, 0x01, 0x00,
+	 0x04, 0x04, 0x04, 0x03, 0x04, 0x01, 0x04, 0x00,
+	 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00,
+	 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x00, 0x04,
+	 0x00, 0x04, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04,
+	 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00,
+	 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x04, 0x04,
+	 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x04,
+	 0x04, 0x04, 0x01, 0x04, 0x03, 0x00, 0x04};
+
+static constexpr int16 walkToXTbl[] = {
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 212, 0, 0, 0, 253,
+	0, 0, 0, 0, 464, 0, 405, 325,
+	325, 325, 0, 505, 0, 0, 0, 0,
+	0, 0, 0, 0, 489, 0, 340, 300,
+	340, 0, 0, 0, 218, 0, 0, 391,
+	0, 308, 0, 0, 0, 484, 0, 0,
+	0, 0, 288, 288, 288, 0, 0, 0,
+	0, 0, 0, 0, 0, 437, 0, 0,
+	437, 0, 0, 0, 0, 0, 0, 338,
+	480, 159, 316, 387, 390, 466, 218, 331,
+	316, 230, 346, 0, 153, 534, 0, 156,
+	0, 0, 0, 0, 0, 0, 297, 0,
+	0, 0, 0, 201, 0, 457, 327, 0,
+	0, 0, 0, 223, 0, 0, 0, 477,
+	0, 0, 202, 0, 0, 221, 464, 369,
+	0, 0, 0, 179, 0, 142, 0, 156,
+	293, 359, 0, 260, 463, 269, 208, 156,
+	0, 0, 0, 0, 251, 0, 357, 0,
+	428, 0, 357, 0, 0, 0, 0, 0,
+	0, 0, 210, 244, 212, 202, 348, 0,
+	0, 0, 0, 0, 389, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 465, 0,
+	0, 0, 458, 0, 210, 260, 0
+};
+
+static constexpr uint8 walkToYTbl[] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0xcf,
+	 0x00, 0x00, 0x00, 0x00, 0xd8, 0x00, 0xaa, 0xe1,
+	 0xe1, 0xe1, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00,
+	 0x00, 0x00, 0x00, 0x00, 0xd5, 0x00, 0xd4, 0xb7,
+	 0xd9, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0xd3,
+	 0x00, 0xb8, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00,
+	 0x00, 0x00, 0xcd, 0xcd, 0xcd, 0x00, 0x00, 0x00,
+	 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00,
+	 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6,
+	 0xdf, 0xbc, 0xa2, 0xa0, 0xa1, 0xaa, 0xdd, 0xcd,
+	 0xd1, 0xd8, 0xe2, 0x00, 0xd7, 0xd5, 0x00, 0xaa,
+	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00,
+	 0x00, 0x00, 0x00, 0xb8, 0x00, 0xbd, 0xb4, 0x00,
+	 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xdb,
+	 0x00, 0x00, 0xee, 0x00, 0x00, 0xc5, 0xd9, 0xd8,
+	 0x00, 0x00, 0x00, 0xcc, 0x00, 0xd8, 0x00, 0xb6,
+	 0xc6, 0xc8, 0x00, 0xd3, 0xba, 0xd2, 0xd2, 0xaa,
+	 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0xd6, 0x00,
+	 0xe0, 0x00, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00,
+	 0x00, 0x00, 0xe8, 0xb9, 0xd7, 0xcf, 0xb2, 0x00,
+	 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00,
+	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00,
+	 0x00, 0x00, 0xec, 0x00, 0xe8, 0xd3, 0x00
+};
+
 void DarkseedEngine::handleInput() {
 	// FUN_2022_762b_handles_mouse_click_action
 	int currentRoomNumber = _room->_roomNumber;
@@ -261,9 +344,107 @@ void DarkseedEngine::handleInput() {
 						_player->calculateWalkTarget();
 						_player->playerFaceWalkTarget();
 					} else {
-						int objNum = getObjectUnderCursor();
-						if (objNum != -1) {
+						int roomObjIdx = _room->getObjectUnderCursor();
+						if (roomObjIdx != -1) {
+							// 2022:77ce
+							// TODO walk player to object.
+//							walkToSequence = 1;
+//							newPlayerFacingDirection = 255;
+//							cursorSequenceXPosition = curXPosition;
+//							cursorSequenceYPosition = curYPosition;
+							Common::Point currentCursorPos = _cursor.getPosition();
+							int objNum = _room->_roomObj[roomObjIdx].objNum;
+							if (walkToDirTbl[objNum] != 4) {
+								_player->playerNewFacingDirection_maybe = walkToDirTbl[objNum];
+								_cursor.updatePosition(walkToXTbl[objNum], walkToYTbl[objNum]);
+							}
+							if (objNum == 142 && _room->_roomNumber == 2) {
+								_player->playerNewFacingDirection_maybe = 0;
+								_cursor.updatePosition(347, 189);
+							} else if (objNum == 53 && _room->_roomNumber == 15) {
+								_player->playerNewFacingDirection_maybe = 0;
+								_cursor.updatePosition(369, 216);
+							} else if (objNum == 114) {
+								if (_cursor.getX() < 321) {
+									_player->playerNewFacingDirection_maybe = 3;
+									_cursor.updatePosition(169, 178);
+								} else {
+									_player->playerNewFacingDirection_maybe = 1;
+									_cursor.updatePosition(362, 198);
+								}
+							} else if (objNum == 189 || (objNum == 64 && _room->_roomNumber == 30)) {
+								_player->playerNewFacingDirection_maybe = 1;
+								_cursor.updatePosition(405, 208);
+							} else if (objNum == 50 || objNum == 85 || (objNum >= 163 && objNum <= 168)) {
+								_player->playerNewFacingDirection_maybe = 3;
+								_cursor.updatePosition(228, 211);
+							} else if (objNum == 51 || objNum == 187) {
+								_player->playerNewFacingDirection_maybe = 1;
+								_cursor.updatePosition(380, 211);
+							} else if (objNum == 116 && _actionMode == Unk19Action) {
+								_player->playerNewFacingDirection_maybe = 1;
+								_cursor.updatePosition(285, 233);
+							} else if (objNum == 137) {
+								_player->playerNewFacingDirection_maybe = 1;
+								if (_actionMode == Unk27Action) {
+									_cursor.updatePosition(354, 175);
+								} else {
+									_cursor.updatePosition(409, 173);
+								}
+							} else if (objNum == 112 || objNum == 111) {
+							_player->playerNewFacingDirection_maybe = 1;
+							_cursor.updatePosition(464, 191);
+							} else if (objNum == 138 || objNum == 7 || objNum == 152) {
+								_player->playerNewFacingDirection_maybe = 1;
+								_cursor.updatePosition(292, 208);
+							} else if (objNum == 22 || objNum == 42 ||
+									   (objNum == 35 && _objectVar[22] < 2 && _cursor.getY() > 40)) {
+								_player->playerNewFacingDirection_maybe = 1;
+								if (_objectVar[22] == 0 || _objectVar[22] == 1) {
+									_cursor.updatePosition(437, 203);
+								}
+								if (_objectVar[22] == 2) {
+									_cursor.updatePosition(427, 196);
+								}
+								if (_objectVar[22] > 2) {
+									_cursor.updatePosition(394, 175);
+								}
+							}
+
+							if (objNum == 102 && _objectVar[23] != 0 && _actionMode == HandAction) {
+								_player->playerNewFacingDirection_maybe = 0;
+								_cursor.updatePosition(331, 195);
+							} else if (objNum < 104 || objNum > 108) {
+								if (objNum == 78) {
+									if (_room->_roomNumber == 2) {
+										_player->playerNewFacingDirection_maybe = 3;
+										_cursor.updatePosition(152, 239);
+									} else {
+										_player->playerNewFacingDirection_maybe = 1;
+										_cursor.updatePosition(497, 220);
+									}
+								} else if (objNum == 59) {
+									if (_room->_roomNumber == 3) {
+										_player->playerNewFacingDirection_maybe = 3;
+										_cursor.updatePosition(145, 239);
+									} else {
+										_player->playerNewFacingDirection_maybe = 1;
+										_cursor.updatePosition(520, 229);
+									}
+								}
+							} else {
+								_player->playerNewFacingDirection_maybe = 3;
+								_cursor.updatePosition(_room->_roomObj[roomObjIdx].xOffset + 30, 206);
+							}
+							if (_room->_roomNumber == 34 || (_room->_roomNumber > 18 && _room->_roomNumber < 24)) {
+								_player->_walkTarget = _player->_position;
+							} else if (_cursor.getPosition() != _player->_position) {
+								_player->calculateWalkTarget();
+							}
 
+							_cursor.updatePosition(currentCursorPos.x, currentCursorPos.y);
+							_player->playerFaceWalkTarget();
+							_player->isPlayerWalking_maybe = true;
 						}
 					}
 				}
@@ -301,14 +482,14 @@ void DarkseedEngine::handleInput() {
 				_room->calculateScaledSpriteDimensions(_player->getWidth(), _player->getHeight(), _player->_position.y);
 
 				if (_player->isAtWalkTarget() && _player->BoolEnum_2c85_811c && !_player->isPlayerWalking_maybe) {
-					if (BoolByteEnum_2c85_9e67) {
+					if (useDoorTarget) {
 						_player->changeDirection(_player->_direction, targetPlayerDirection);
-						BoolByteEnum_2c85_9e67 = false;
+						useDoorTarget = false;
 						BoolByteEnum_2c85_8324 = true;
 						return;
 					}
 					_player->BoolEnum_2c85_811c = false;
-					if (BoolByteEnum_2c85_9e67 || BoolByteEnum_2c85_8324) {
+					if (useDoorTarget || BoolByteEnum_2c85_8324) {
 						for (int i = 0; i < _room->room1.size(); i++) {
 							RoomExit &roomExit = _room->room1[i];
 							if (roomExit.roomNumber != 0xff
@@ -318,13 +499,13 @@ void DarkseedEngine::handleInput() {
 								&& _player->_position.y - scaledSpriteHeight < roomExit.y + roomExit.height
 								&& roomExit.direction == _player->_direction) {
 								bool bVar = true;
-								if (currentRoomNumber == 0x40 && roomExit.roomNumber == 0x40) {
+								if (currentRoomNumber == 64 && roomExit.roomNumber == 64) {
 									bVar = false;
-									_console->printTosText(0x2bf);
+									_console->printTosText(703);
 								}
-								if (currentRoomNumber == 0x43 && roomExit.roomNumber == 0) {
+								if (currentRoomNumber == 67 && roomExit.roomNumber == 0) {
 									bVar = false;
-									_console->printTosText(0x386);
+									_console->printTosText(902);
 								}
 								// 2022:808a TODO
 //								if (currentRoomNumber == 0x3b)
@@ -893,11 +1074,6 @@ void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
 	}
 }
 
-int DarkseedEngine::getObjectUnderCursor() {
-	// TODO
-	return -1;
-}
-
 Common::String DarkseedEngine::getRoomFilePath(const Common::String &filename) {
 	if (isCdVersion()) {
 		return "room/" + filename;
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 6c2f96f9e56..b1138bbcd5d 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -52,7 +52,9 @@ struct DarkseedGameDescription;
 enum ActionMode {
 	PointerAction = 0,
 	HandAction = 2,
-	LookAction = 3
+	LookAction = 3,
+	Unk19Action = 19,
+	Unk27Action = 27,
 };
 
 class DarkseedEngine : public Engine {
@@ -77,7 +79,7 @@ public:
 	ActionMode _actionMode = PointerAction;
 	Player *_player = nullptr;
 	Sprites _sprites;
-	Objects _objects;
+	Objects _objectVar;
 	Inventory _inventory;
 
 	int _currentDay = 1;
@@ -112,7 +114,7 @@ public:
 	uint16 DAT_2c85_825c = 0;
 	uint16 DAT_2c85_819c = 0;
 	bool BoolEnum_2c85_985a = false;
-	bool BoolByteEnum_2c85_9e67 = false;
+	bool useDoorTarget = false;
 
 	uint16 DAT_2c85_81e0 = 0;
 
@@ -181,8 +183,6 @@ public:
 	void updateDisplay();
 	void setupOtherNspAnimation(int nspAnimIdx, int animId);
 
-	int getObjectUnderCursor();
-
 private:
 	void updateAnimation();
 	void advanceAnimationFrame(int nspAminIdx);
diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
index c6e7bf188ce..5e3b114e8bf 100644
--- a/engines/darkseed/debugconsole.cpp
+++ b/engines/darkseed/debugconsole.cpp
@@ -65,8 +65,11 @@ bool DebugConsole::Cmd_getvar(int argc, const char **argv) {
 		return true;
 	}
 
-	uint16 varIdx = atoi(argv[1]);
-	debugPrintf("Object Var: %d\n", g_engine->_objects.getVar(varIdx));
+	int16 varIdx = (int16)atoi(argv[1]);
+
+	if (validateObjVarIndex(varIdx)) {
+		debugPrintf("Object Var: %d\n", g_engine->_objectVar.getVar(varIdx));
+	}
 	return true;
 }
 
@@ -76,10 +79,24 @@ bool DebugConsole::Cmd_setvar(int argc, const char **argv) {
 		return true;
 	}
 
-	uint16 varIdx = atoi(argv[1]);
-	int16 newValue = atoi(argv[2]);
+	int16 varIdx = (int16)atoi(argv[1]);
+	int16 newValue = (int16)atoi(argv[2]);
+
+	if (validateObjVarIndex(varIdx)) {
+		g_engine->_objectVar[varIdx] = newValue;
+	}
+	return true;
+}
 
-	g_engine->_objects.setVar(varIdx, newValue);
+bool DebugConsole::validateObjVarIndex(int16 varIdx) {
+	if (varIdx >= Objects::MAX_OBJECTS) {
+		debugPrintf("Index must be less than %d\n", Objects::MAX_OBJECTS);
+		return false;
+	}
+	if (varIdx < 0) {
+		debugPrintf("Index cannot be negative\n");
+		return false;
+	}
 	return true;
 }
 
diff --git a/engines/darkseed/debugconsole.h b/engines/darkseed/debugconsole.h
index 62ac0138185..fdbf08b4a7b 100644
--- a/engines/darkseed/debugconsole.h
+++ b/engines/darkseed/debugconsole.h
@@ -36,6 +36,7 @@ private:
 	bool Cmd_dt(int argc, const char **argv);
 	bool Cmd_getvar(int argc, const char **argv);
 	bool Cmd_setvar(int argc, const char **argv);
+	bool validateObjVarIndex(int16 varIdx);
 public:
 	DebugConsole(TosText *tostext);
 	~DebugConsole() override;
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index d50751c9cba..30110b13297 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -21,13 +21,10 @@
 
 #include "objects.h"
 
-constexpr int MAX_OBJECTS = 199;
-
 Darkseed::Objects::Objects() {
 	_objectVar.resize(MAX_OBJECTS);
 	_objectRunningCode.resize(MAX_OBJECTS);
-	_moveObjectX.resize(MAX_OBJECTS);
-	_moveObjectY.resize(MAX_OBJECTS);
+	_moveObjectXY.resize(MAX_OBJECTS);
 	_moveObjectRoom.resize(MAX_OBJECTS); // The original only allocates 42 entries here but writes 199 in the save file!
 	reset();
 }
@@ -36,8 +33,8 @@ void Darkseed::Objects::reset() {
 	for (int i = 0; i < MAX_OBJECTS; i++) {
 		_objectVar[i] = 0;
 		_objectRunningCode[i] = 0;
-		_moveObjectX[i] = 0; // TODO verify this is the correct reset state for these XY vars.
-		_moveObjectY[i] = 0;
+		_moveObjectXY[i].x = 0; // TODO verify this is the correct reset state for these XY vars.
+		_moveObjectXY[i].y = 0;
 		_moveObjectRoom[i] = i < 42 ? 0xff : 0; // Hack for weird behaviour in original engine.
 	}
 	// Initial object state.
@@ -59,3 +56,23 @@ int16 Darkseed::Objects::getVar(uint16 varIdx) {
 	}
 	return _objectVar[varIdx];
 }
+
+Common::Point Darkseed::Objects::getMoveObjectPosition(uint8 objIdx) {
+	if (objIdx >= MAX_OBJECTS) {
+		error("getMoveObjectPosition: Object Index out of range! %d", objIdx);
+	}
+	return _moveObjectXY[objIdx];
+}
+
+int16 &Darkseed::Objects::operator[](uint16 varIdx) {
+	if (varIdx >= MAX_OBJECTS) {
+		error("getVar: Object Index out of range! %d", varIdx);
+	}
+	return _objectVar[varIdx];
+}
+const int16 &Darkseed::Objects::operator[](uint16 varIdx) const {
+	if (varIdx >= MAX_OBJECTS) {
+		error("getVar: Object Index out of range! %d", varIdx);
+	}
+	return _objectVar[varIdx];
+}
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 0bb3b698dae..d6e57203a19 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -23,22 +23,29 @@
 #define DARKSEED_OBJECTS_H
 
 #include "common/array.h"
+#include "common/rect.h"
 namespace Darkseed {
 
 class Objects {
 private:
 	Common::Array<int16> _objectVar;
 	Common::Array<int16> _objectRunningCode;
-	Common::Array<uint16> _moveObjectX;
-	Common::Array<uint16> _moveObjectY;
+	Common::Array<Common::Point> _moveObjectXY;
 	Common::Array<uint8> _moveObjectRoom;
 
 public:
+	static constexpr int MAX_MOVED_OBJECTS = 42;
+	static constexpr int MAX_OBJECTS = 199;
 	Objects();
 	void reset();
 
 	void setVar(uint16 varIdx, int16 newValue);
 	int16 getVar(uint16 varIdx);
+
+	Common::Point getMoveObjectPosition(uint8 objIdx);
+
+	int16 &operator[](uint16 varIdx);
+	const int16 &operator[](uint16 varIdx) const;
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 34fd8b0e031..8167db5b99b 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -162,7 +162,7 @@ void Darkseed::Player::calculateWalkTarget() {
 	numConnectorsInWalkPath = 0;
 	int selectedObjNum = 0;
 	if(g_engine->_actionMode == PointerAction) {
-		selectedObjNum = g_engine->_room->getObjectNumUnder6AtCursor();
+		selectedObjNum = g_engine->_room->getRoomExitAtCursor();
 	}
 
 	if (selectedObjNum == 0) {
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index ee0cb7dd754..22f964de48f 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -45,7 +45,7 @@ const static int roomDescriptionTextTbl[] = {
 Darkseed::Room::Room(int roomNumber) : _roomNumber(roomNumber) {
 	room1.resize(8);
 	walkableLocationsMap.resize(16);
-	room3.resize(30);
+	_roomObj.resize(30);
 
 	if(!load()) {
 		error("Failed to load room %d", roomNumber);
@@ -85,28 +85,28 @@ bool Darkseed::Room::load() {
 	}
 
 	for (int i = 0; i < 30; i++) {
-		room3[i].type = file.readUint16BE();
-		room3[i].objNum = file.readUint16BE();
-		room3[i].xOffset = file.readUint16BE();
-		room3[i].yOffset = file.readUint16BE();
-		room3[i].width = file.readUint16BE();
-		room3[i].height = file.readUint16BE();
-		room3[i].depth = file.readByte();
-		room3[i].spriteNum = file.readByte();
-
-		if (room3[i].spriteNum >= 0x29 && room3[i].type != 0 && room3[i].type != 1000) {
-			room3[i].height = 0x14;
-			room3[i].width = 0x14;
-			room3[i].type = 0;
+		_roomObj[i].type = file.readUint16BE();
+		_roomObj[i].objNum = file.readUint16BE();
+		_roomObj[i].xOffset = file.readUint16BE();
+		_roomObj[i].yOffset = file.readUint16BE();
+		_roomObj[i].width = file.readUint16BE();
+		_roomObj[i].height = file.readUint16BE();
+		_roomObj[i].depth = file.readByte();
+		_roomObj[i].spriteNum = file.readByte();
+
+		if (_roomObj[i].spriteNum >= 0x29 && _roomObj[i].type != 0 && _roomObj[i].type != 1000) {
+			_roomObj[i].height = 0x14;
+			_roomObj[i].width = 0x14;
+			_roomObj[i].type = 0;
 		}
 
-		if (room3[i].objNum == 0 && room3[i].type == 1) {
+		if (_roomObj[i].objNum == 0 && _roomObj[i].type == 1) {
 			if (connectors.size() == 0xc) {
 				error("Too many connectors in this room, max of %d", 0xc);
 			}
 			RoomConnector connector;
-			connector.x = room3[i].xOffset;
-			connector.y = room3[i].yOffset;
+			connector.x = _roomObj[i].xOffset;
+			connector.y = _roomObj[i].yOffset;
 
 			if (connector.x > 565) {
 				connector.x = 565;
@@ -123,18 +123,21 @@ bool Darkseed::Room::load() {
 
 			debug("Room Connector: %d %d", connector.x, connector.y);
 			connectors.push_back(connector);
-			room3[i].type = 0xff;
+			_roomObj[i].type = 0xff;
 		}
 	}
 
 	file.close();
 
+	_collisionType = 0;
 	if(!pic.load(picFilename)) {
 		return false;
 	}
 
 	_pal.load(g_engine->getPictureFilePath(Common::String::format("%s.pal", filenameBase.c_str())));
 
+	_locationSprites.load(Common::String::format("%s.nsp", filenameBase.c_str()));
+
 	return true;
 }
 
@@ -173,22 +176,23 @@ int Darkseed::Room::checkCursorAndMoveableObjects() {
 									 : g_engine->_cursor.getSprite();
 	bool hasObject = false;
 	int objNum = -1;
-	for (int i = 0; i < room3.size(); i++) {
-		if ((room3[i].type == 1 || room3[i].type == 3)
-			&& room3[i].xOffset <= cursorSprite.width + g_engine->_cursor.getX()
-			&& g_engine->_cursor.getX() <= room3[i].width + room3[i].xOffset
-			&& room3[i].yOffset <= cursorSprite.height + g_engine->_cursor.getY()
-			&& g_engine->_cursor.getY() <= room3[i].height + room3[i].yOffset
+	_collisionType = 0;
+	for (int i = 0; i < _roomObj.size(); i++) {
+		if ((_roomObj[i].type == 1 || _roomObj[i].type == 3)
+			&& _roomObj[i].xOffset <= cursorSprite.width + g_engine->_cursor.getX()
+			&& g_engine->_cursor.getX() <= _roomObj[i].width + _roomObj[i].xOffset
+			&& _roomObj[i].yOffset <= cursorSprite.height + g_engine->_cursor.getY()
+			&& g_engine->_cursor.getY() <= _roomObj[i].height + _roomObj[i].yOffset
 		) {
-			if (room3[i].objNum == 25) {
-				if (g_engine->_objects.getVar(80) < 3) {
+			if (_roomObj[i].objNum == 25) {
+				if (g_engine->_objectVar.getVar(80) < 3) {
 					hasObject = false;
 				} else {
 					hasObject = true;
 				}
 			}
 
-			if (room3[i].objNum == 14 && g_engine->_cursor.getY() > 40 && g_engine->_objects.getVar(86) == 0) {
+			if (_roomObj[i].objNum == 14 && g_engine->_cursor.getY() > 40 && g_engine->_objectVar.getVar(86) == 0) {
 				hasObject = false;
 			}
 
@@ -206,38 +210,39 @@ int Darkseed::Room::checkCursorAndStaticObjects(int x, int y) {
 									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
 									 : g_engine->_cursor.getSprite();
 	bool hasObject = false;
-	for (int i = 0; i < room3.size(); i++) {
-		if (room3[i].type == 0
-			&& room3[i].xOffset <= cursorSprite.width + g_engine->_cursor.getX()
-			&& g_engine->_cursor.getX() <= room3[i].width + room3[i].xOffset
-			&& room3[i].yOffset <= cursorSprite.height + g_engine->_cursor.getY()
-			&& g_engine->_cursor.getY() <= room3[i].height + room3[i].yOffset
+	_collisionType = 0;
+	for (int i = 0; i < _roomObj.size(); i++) {
+		if (_roomObj[i].type == 0
+			&& _roomObj[i].xOffset <= cursorSprite.width + g_engine->_cursor.getX()
+			&& g_engine->_cursor.getX() <= _roomObj[i].width + _roomObj[i].xOffset
+			&& _roomObj[i].yOffset <= cursorSprite.height + g_engine->_cursor.getY()
+			&& g_engine->_cursor.getY() <= _roomObj[i].height + _roomObj[i].yOffset
 		) {
-			if (actionMode != PointerAction && room3[i].objNum >= 5) {
+			if (actionMode != PointerAction && _roomObj[i].objNum >= 5) {
 				hasObject = true;
 			}
 
-			if (actionMode == PointerAction && room3[i].objNum < 6) {
+			if (actionMode == PointerAction && _roomObj[i].objNum < 6) {
 				hasObject = true;
 			}
 
-			if (room3[i].objNum == 59 || room3[i].objNum == 78) {
-				if (g_engine->_objects.getVar(34) == 1) {
+			if (_roomObj[i].objNum == 59 || _roomObj[i].objNum == 78) {
+				if (g_engine->_objectVar.getVar(34) == 1) {
 					hasObject = true;
 				} else {
 					hasObject = false;
 				}
 			}
 
-			if (room3[i].objNum == 0x19 && hasObject) {
-				if (g_engine->_objects.getVar(80) < 2) {
+			if (_roomObj[i].objNum == 0x19 && hasObject) {
+				if (g_engine->_objectVar.getVar(80) < 2) {
 					hasObject = false;
 				} else {
 					hasObject = true;
 				}
 			}
 
-			if (room3[i].objNum == 0x74 && hasObject && (int)actionMode != 0x13) {
+			if (_roomObj[i].objNum == 0x74 && hasObject && (int)actionMode != 0x13) {
 				hasObject = false;
 			}
 
@@ -249,14 +254,52 @@ int Darkseed::Room::checkCursorAndStaticObjects(int x, int y) {
 	return -1;
 }
 
+int Darkseed::Room::CheckCursorAndMovedObjects() {
+	ActionMode actionMode = g_engine->_actionMode;
+	const Sprite &cursorSprite = (actionMode == LookAction)
+									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
+									 : g_engine->_cursor.getSprite();
+	_collisionType = 1;
+	for (int i = 0; i < Objects::MAX_MOVED_OBJECTS; i++) {
+		Common::Point movedObjPos = g_engine->_objectVar.getMoveObjectPosition(i);
+		int16 spriteWidth = 0;
+		int16 spriteHeight = 0;
+		if (i == 22) {
+			uint8 spriteIdx = g_engine->_objectVar.getVar(5) != 0 ? 1 : 0;
+			const Sprite &sprite = _locationSprites.getSpriteAt(spriteIdx);
+			spriteWidth = sprite.width;
+			spriteHeight = sprite.height;
+		} else {
+			const Sprite &sprite = g_engine->_baseSprites.getSpriteAt(i);
+			spriteWidth = sprite.width;
+			spriteHeight = sprite.height;
+		}
+		calculateScaledSpriteDimensions(spriteWidth, spriteHeight, movedObjPos.y);
+
+		if (
+			((spriteWidth / 2 + movedObjPos.x) - g_engine->scaledSpriteWidth / 2 <= cursorSprite.width + g_engine->_cursor.getX()) &&
+			(g_engine->_cursor.getX() <= ((spriteWidth / 2 + movedObjPos.x) - g_engine->scaledSpriteWidth / 2) + g_engine->scaledSpriteWidth) &&
+			((movedObjPos.y + spriteHeight) - g_engine->scaledSpriteHeight <= cursorSprite.height + g_engine->_cursor.getY()) &&
+			g_engine->_cursor.getY() <= movedObjPos.y + spriteHeight
+		) {
+			return i;
+		}
+	}
+	return -1;
+}
+
 void Darkseed::Room::update() {
 	if (g_engine->_actionMode == HandAction) {
 		int moveableObj = checkCursorAndMoveableObjects();
 		if (moveableObj == -1) {
 			int objectUnderCursor = checkCursorAndStaticObjects(g_engine->_cursor.getX(), g_engine->_cursor.getY());
 			if (objectUnderCursor == -1) {
-				// TODO CheckCursorAndMovedObjects();
-				g_engine->_cursor.setCursorType(Hand);
+				int movedObject = CheckCursorAndMovedObjects();
+				if (movedObject == -1) {
+					g_engine->_cursor.setCursorType(Hand);
+				} else {
+					g_engine->_cursor.setCursorType(HandPointing);
+				}
 			} else {
 				g_engine->_cursor.setCursorType(HandPointing);
 			}
@@ -264,10 +307,48 @@ void Darkseed::Room::update() {
 			g_engine->_cursor.setCursorType(HandPointing);
 		}
 	} else if (g_engine->_actionMode == LookAction) {
+		if (checkCursorAndMoveableObjects() != -1 || CheckCursorAndMovedObjects() != -1) {
+			g_engine->_cursor.setCursorType(ExclamationMark);
+		} else {
+			int objIdx = checkCursorAndStaticObjects(0,0);
+			if (objIdx != -1 && _roomObj[objIdx].objNum > 7) {
+				g_engine->_cursor.setCursorType(ExclamationMark);
+			} else {
+				g_engine->_cursor.setCursorType(Look);
+			}
+		}
+	} else {
+		if (g_engine->_actionMode != PointerAction) {
+			g_engine->_cursor.setCursorType(Pointer);
+		}
 
-	} else if (g_engine->_actionMode == PointerAction) {
 		int objectUnderCursor = checkCursorAndStaticObjects(g_engine->_cursor.getX(), g_engine->_cursor.getY());
-		g_engine->_cursor.setCursorType(objectUnderCursor != -1 ? ConnectorEntrance : Pointer);
+		if ((objectUnderCursor == -1 || _roomObj[objectUnderCursor].objNum > 5 || _roomObj[objectUnderCursor].type != 0) &&
+			(g_engine->_objectVar[59] != 2 || _roomObj[objectUnderCursor].objNum != 59) &&
+			(g_engine->_objectVar[78] != 2 || _roomObj[objectUnderCursor].objNum != 78)
+			) {
+			g_engine->_cursor.setCursorType(Pointer);
+		} else {
+			int roomExitObjNum = getRoomExitAtCursor();
+			uint16 targetRoomNumber = getDoorTargetRoom(roomExitObjNum);
+			if ((((((_roomNumber == 59) && (g_engine->_objectVar[190] < 2)) ||
+				   ((_roomNumber == 61 && ((g_engine->_objectVar[22] < 3 && (targetRoomNumber == 13)))))) ||
+				  ((_roomNumber == 7 && ((targetRoomNumber == 38 && (g_engine->_objectVar[137] == 0)))))) ||
+				 ((((_roomNumber == 7 && ((targetRoomNumber == 38 && (g_engine->_objectVar[57] == 1)))) ||
+					((_roomNumber == 46 && ((targetRoomNumber == 60 && (g_engine->_objectVar[57] == 1)))))) ||
+				   ((((_roomNumber == 13 && ((targetRoomNumber == 31 && (g_engine->_objectVar[23] != 1)))) ||
+					  ((_roomNumber == 2 && ((targetRoomNumber == 0 && (g_engine->_objectVar[78] != 2)))))) ||
+					 ((_roomNumber == 0 && ((targetRoomNumber == 2 && (g_engine->_objectVar[78] != 2)))))))))) ||
+				(((_roomNumber == 32 && ((targetRoomNumber == 13 && (g_engine->_objectVar[23] != 1)))) ||
+				  (((((_roomNumber == 13 && ((targetRoomNumber == 32 && (g_engine->_objectVar[23] != 1)))) ||
+					  ((_roomNumber == 39 && ((targetRoomNumber == 46 && (g_engine->_objectVar[117] == 0)))))) ||
+					 ((_roomNumber == 3 && ((targetRoomNumber == 9 && (g_engine->_objectVar[59] != 2)))))) ||
+					((_roomNumber == 9 && ((targetRoomNumber == 3 && (g_engine->_objectVar[59] != 2)))))))))) {
+				g_engine->_cursor.setCursorType(Pointer);
+			} else {
+				g_engine->_cursor.setCursorType(ConnectorEntrance);
+			}
+		}
 	}
 }
 
@@ -279,10 +360,10 @@ int Darkseed::Room::getExitRoomNumberAtPoint(int x, int y) {
 	for (int i = 0; i < room1.size(); i++) {
 		if (
 			room1[i].roomNumber != 0xff
-			&& room3[obj].xOffset <= room1[i].x
-			&& room1[i].x <= room3[obj].width + room3[obj].xOffset
-			&& room3[obj].yOffset <= room1[i].y
-			&& room1[i].y <= room3[obj].yOffset + room3[obj].height
+			&& _roomObj[obj].xOffset <= room1[i].x
+			&& room1[i].x <= _roomObj[obj].width + _roomObj[obj].xOffset
+			&& _roomObj[obj].yOffset <= room1[i].y
+			&& room1[i].y <= _roomObj[obj].yOffset + _roomObj[obj].height
 			) {
 			return room1[i].roomNumber;
 		}
@@ -355,31 +436,31 @@ void Darkseed::Room::printRoomDescriptionText() const {
 	}
 }
 
-int Darkseed::Room::getObjectNumUnder6AtCursor() {
-	for (int i = 0; i < room3.size(); i++) {
-		Common::Rect roomRect(room3[i].xOffset, room3[i].yOffset, room3[i].xOffset + room3[i].width, room3[i].yOffset + room3[i].height);
-		if (room3[i].type == 0 && room3[i].objNum < 6 && roomRect.contains(g_engine->_cursor.getPosition())) {
+int Darkseed::Room::getRoomExitAtCursor() {
+	for (int i = 0; i < _roomObj.size(); i++) {
+		Common::Rect roomRect(_roomObj[i].xOffset, _roomObj[i].yOffset, _roomObj[i].xOffset + _roomObj[i].width, _roomObj[i].yOffset + _roomObj[i].height);
+		if (_roomObj[i].type == 0 && _roomObj[i].objNum < 6 && roomRect.contains(g_engine->_cursor.getPosition())) {
 			selectedObjIndex = i;
-			return room3[i].objNum;
+			return _roomObj[i].objNum;
 		}
 	}
 	return 0;
 }
 
 void Darkseed::Room::getWalkTargetForObjectType_maybe(int objId) {
-	for (int i = 0; i < room3.size(); i++) {
-		if (room3[i].objNum == objId && room3[i].type == 4) {
-			g_engine->_player->_walkTarget.x = room3[i].xOffset;
-			g_engine->_player->_walkTarget.y = room3[i].yOffset;
+	for (int i = 0; i < _roomObj.size(); i++) {
+		if (_roomObj[i].objNum == objId && _roomObj[i].type == 4) {
+			g_engine->_player->_walkTarget.x = _roomObj[i].xOffset;
+			g_engine->_player->_walkTarget.y = _roomObj[i].yOffset;
 			for (int j = 0; j < room1.size(); j++) {
 				if (room1[j].roomNumber != 0xff
-					&& room3[selectedObjIndex].xOffset < room1[j].x
-					&& room1[j].x < room3[selectedObjIndex].xOffset + room3[selectedObjIndex].width
-					&& room3[selectedObjIndex].yOffset < room1[j].y
-					&& room1[j].y < room3[selectedObjIndex].yOffset + room3[selectedObjIndex].height
+					&& _roomObj[selectedObjIndex].xOffset < room1[j].x
+					&& room1[j].x < _roomObj[selectedObjIndex].xOffset + _roomObj[selectedObjIndex].width
+					&& _roomObj[selectedObjIndex].yOffset < room1[j].y
+					&& room1[j].y < _roomObj[selectedObjIndex].yOffset + _roomObj[selectedObjIndex].height
 					) {
 					if (_roomNumber != 0x3d || room1[j].roomNumber == 5 || g_engine->trunkPushCounter > 2) {
-						g_engine->BoolByteEnum_2c85_9e67 = true;
+						g_engine->useDoorTarget = true;
 					}
 					g_engine->targetRoomNumber = room1[j].roomNumber;
 					g_engine->targetPlayerDirection = room1[j].direction;
@@ -444,3 +525,33 @@ void Darkseed::Room::calculateScaledSpriteDimensions(int width, int height, int
 	g_engine->scaledSpriteWidth = (width * g_engine->scaledWalkSpeed_maybe) / 1000;
 	g_engine->scaledSpriteHeight = (height * g_engine->scaledWalkSpeed_maybe) / 1000;
 }
+
+uint16 Darkseed::Room::getDoorTargetRoom(int objId) {
+	for (int i = 0; i < _roomObj.size(); i++) {
+		if (_roomObj[i].objNum == objId && _roomObj[i].type == 4) {
+			for (int j = 0; j < room1.size(); j++) {
+				if (room1[j].roomNumber != 0xff
+					&& _roomObj[selectedObjIndex].xOffset < room1[j].x
+					&& room1[j].x < _roomObj[selectedObjIndex].xOffset + _roomObj[selectedObjIndex].width
+					&& _roomObj[selectedObjIndex].yOffset < room1[j].y
+					&& room1[j].y < _roomObj[selectedObjIndex].yOffset + _roomObj[selectedObjIndex].height
+				) {
+					return room1[j].roomNumber;
+				}
+			}
+		}
+	}
+	return g_engine->targetRoomNumber; //TODO is this a safe fallback if no door exists?
+}
+
+int Darkseed::Room::getObjectUnderCursor() {
+	_collisionType = 0;
+	int objIdx = checkCursorAndMoveableObjects();
+	if (objIdx == -1) {
+		objIdx = CheckCursorAndMovedObjects();
+		if (objIdx == -1) {
+			objIdx = checkCursorAndStaticObjects(0,0);
+		}
+	}
+	return objIdx;
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index f2e2ab7352a..cc9d8522f96 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -24,6 +24,7 @@
 
 #include "pal.h"
 #include "pic.h"
+#include "nsp.h"
 #include "common/rect.h"
 
 namespace Darkseed {
@@ -62,13 +63,16 @@ public:
 	int _roomNumber;
 	Pic pic;
 	Pal _pal;
+	Nsp _locationSprites;
 
 	Common::Array<RoomExit> room1;
 	Common::Array<RoomStruct2> walkableLocationsMap;
-	Common::Array<RoomObjElement> room3;
+	Common::Array<RoomObjElement> _roomObj;
 	Common::Array<RoomConnector> connectors;
 
 	uint16 selectedObjIndex = 0;
+	int16 _collisionType = 0;
+
 public:
 	explicit Room(int roomNumber);
 
@@ -78,8 +82,11 @@ public:
 
 	int checkCursorAndMoveableObjects();
 	int checkCursorAndStaticObjects(int x, int y);
-	int getObjectNumUnder6AtCursor();
+	int CheckCursorAndMovedObjects();
+	int getRoomExitAtCursor();
 	void getWalkTargetForObjectType_maybe(int objId);
+	int getObjectUnderCursor();
+	uint16 getDoorTargetRoom(int objId);
 	int getExitRoomNumberAtPoint(int x, int y);
 	bool exitRoom();
 	Common::String getRoomFilenameBase(int roomNumber);


Commit: b62b638f90999e529a9910ae54875cc8d6f8358b
    https://github.com/scummvm/scummvm/commit/b62b638f90999e529a9910ae54875cc8d6f8358b
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added basic support for look code.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 5059341de6a..84876636160 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -349,7 +349,7 @@ void DarkseedEngine::handleInput() {
 							// 2022:77ce
 							// TODO walk player to object.
 //							walkToSequence = 1;
-//							newPlayerFacingDirection = 255;
+							_player->playerNewFacingDirection_maybe = -1;
 //							cursorSequenceXPosition = curXPosition;
 //							cursorSequenceYPosition = curYPosition;
 							Common::Point currentCursorPos = _cursor.getPosition();
@@ -549,6 +549,21 @@ void DarkseedEngine::handleInput() {
 					_player->BoolEnum_2c85_811c = false;
 					_player->isPlayerWalking_maybe = false;
 					// TODO complete at final destination logic. 2022:879d
+//					if (walkToSequence != 0) {
+//						walkToSequence = 0;
+//						curXPosition = cursorSequenceXPosition;
+//						curYPosition = cursorSequenceYPosition;
+//					}
+					int objIdx = _room->getObjectUnderCursor();
+					int objType = _room->_roomObj[objIdx].type;
+					int objNum = _room->_roomObj[objIdx].objNum;
+					if (objIdx != -1 && ((objType != 4 && objType != 0 && objType < 10) || objNum > 5 || _room->_collisionType != 0)) {
+						if (_room->_collisionType == 0) {
+							handleObjCollision(objNum);
+						} else {
+							handleObjCollision(objIdx); // TODO is this correct?
+						}
+					}
 				}
 				if (!isPlayingAnimation_maybe) {
 					// walk to destination point
@@ -1088,4 +1103,44 @@ Common::String DarkseedEngine::getPictureFilePath(const Common::String &filename
 	return filename;
 }
 
+void DarkseedEngine::handleObjCollision(int objNum) {
+	if (objNum == 35 && _objectVar[22] < 2 && _cursor.getY() > 40) {
+		objNum = 22;
+	}
+	if (_actionMode == LookAction || _actionMode == HandAction || objNum != 115) {
+		if (_cursor.getY() < 10 && _actionMode > LookAction) {
+			// TODO handle inventory
+			// 171d:53c3
+		} else {
+			switch (_actionMode) {
+			case HandAction:
+				break;
+			case LookAction:
+				eyeCode(objNum);
+				break;
+			// TODO lots of extra switch cases here for inventory usages.
+			default:
+				break;
+			}
+		}
+	} else {
+		// TODO
+		// 171d:51dc
+	}
+}
+
+void DarkseedEngine::eyeCode(int objNum) {
+	// TODO lots of custom eye code here.
+	if (_cursor.getY() > 39 && objNum != 77) {
+		int eyeTosIdx = _objectVar.getEyeDescriptionTosIdx(objNum);
+		if (eyeTosIdx < 979 && eyeTosIdx != 0)  {
+			_console->printTosText(eyeTosIdx);
+		}
+//		else if (978 < *(int *)((int)_eyedescriptions + objNum * 2)) {
+//			genericresponse(3,objNum,*(undefined2 *)((int)_eyedescriptions + objNum * 2));
+//		}
+		return;
+	}
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index b1138bbcd5d..91658fc4164 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -193,6 +193,9 @@ private:
 	void wait();
 	void handlePointerAction();
 	void changeToRoom(int newRoomNumber);
+	void handleObjCollision(int objNum);
+
+	void eyeCode(int objNum);
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index 30110b13297..7860444ecb6 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -76,3 +76,63 @@ const int16 &Darkseed::Objects::operator[](uint16 varIdx) const {
 	}
 	return _objectVar[varIdx];
 }
+
+static constexpr uint16 eyeDescriptionsTbl[] = {
+	0, 0, 0, 0,
+	0, 0, 0, 513,
+	0, 421, 0, 521,
+	0, 0, 713, 0,
+	791, 812, 0, 743,
+	0, 0, 661, 166,
+	0, 0, 0, 0,
+	500, 0, 0, 423,
+	425, 427, 418, 667,
+	503, 505, 507, 509,
+	511, 755, 652, 0,
+	728, 0, 0, 43,
+	0, 0, 0, 0,
+	192, 0, 0, 0,
+	0, 893, 845, 0,
+	0, 452, 721, 0,
+	483, 0, 466, 466,
+	466, 0, 0, 705,
+	0, 0, 0, 0,
+	0, 0, 0, 829,
+	552, 0, 0, 0,
+	0, 0, 711, 608,
+	610, 606, 604, 602,
+	600, 598, 596, 594,
+	592, 590, 588, 0,
+	0, 732, 166, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 241,
+	231, 750, 815, 826,
+	838, 794, 797, 806,
+	802, 440, 448, 117,
+	259, 271, 305, 90,
+	161, 136, 376, 398,
+	414, 474, 477, 480,
+	0, 0, 999, 252,
+	0, 0, 170, 182,
+	212, 219, 284, 315,
+	328, 337, 346, 356,
+	515, 526, 533, 0,
+	547, 561, 570, 575,
+	613, 615, 620, 624,
+	636, 638, 641, 643,
+	645, 0, 673, 677,
+	680, 683, 688, 717,
+	726, 746, 0, 759,
+	765, 780, 787, 818,
+	822, 824, 0, 855,
+	862, 0, 880, 887,
+	891, 900, 0, 724,
+	671, 321, 163
+};
+
+int Darkseed::Objects::getEyeDescriptionTosIdx(uint16 objNum) {
+	if (objNum >= MAX_OBJECTS) {
+		error("getEyeDescriptionTosIdx: Object Index out of range! %d", objNum);
+	}
+	return eyeDescriptionsTbl[objNum];
+}
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index d6e57203a19..67a68d67787 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -43,6 +43,7 @@ public:
 	int16 getVar(uint16 varIdx);
 
 	Common::Point getMoveObjectPosition(uint8 objIdx);
+	int getEyeDescriptionTosIdx(uint16 objNum);
 
 	int16 &operator[](uint16 varIdx);
 	const int16 &operator[](uint16 varIdx) const;


Commit: cc96f636def426a92211ca63d1bc4efdd53a39a8
    https://github.com/scummvm/scummvm/commit/cc96f636def426a92211ca63d1bc4efdd53a39a8
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: More work on player pathfinding.

Changed paths:
    engines/darkseed/cursor.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h
    engines/darkseed/player.cpp
    engines/darkseed/player.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/cursor.h b/engines/darkseed/cursor.h
index 8d22a9e5902..b29c7de6f82 100644
--- a/engines/darkseed/cursor.h
+++ b/engines/darkseed/cursor.h
@@ -48,6 +48,8 @@ public:
 	CursorType getCursorType() { return _currentCursorType; }
 
 	Common::Point &getPosition() { return _position; }
+	void setPosition(Common::Point &position) { _position = position; }
+
 	int16 getX() const { return _position.x; }
 	int16 getY() const { return _position.y; }
 
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 84876636160..79fd3ab1416 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -323,7 +323,7 @@ void DarkseedEngine::handleInput() {
 			if (currentRoomNumber == 0x39 &&_previousRoomNumber == 0x36) {
 				_player->updateSprite();
 			} else {
-				if (_player->isAtWalkTarget() && !_player->BoolEnum_2c85_811c) {
+				if (_player->isAtWalkTarget() && !_player->_heroMoving) {
 					_player->updateSprite();
 				} else {
 					if (counter_2c85_888b >= 0 && !_player->isAtWalkTarget()) {
@@ -348,10 +348,9 @@ void DarkseedEngine::handleInput() {
 						if (roomObjIdx != -1) {
 							// 2022:77ce
 							// TODO walk player to object.
-//							walkToSequence = 1;
+							_player->_walkToSequence = true;
+							_player->_walkToSequencePoint = _cursor.getPosition();
 							_player->playerNewFacingDirection_maybe = -1;
-//							cursorSequenceXPosition = curXPosition;
-//							cursorSequenceYPosition = curYPosition;
 							Common::Point currentCursorPos = _cursor.getPosition();
 							int objNum = _room->_roomObj[roomObjIdx].objNum;
 							if (walkToDirTbl[objNum] != 4) {
@@ -461,7 +460,8 @@ void DarkseedEngine::handleInput() {
 					}
 					_cursor.setCursorType((CursorType)_actionMode);
 				}
-				if (_player->isAtWalkTarget() && _player->BoolEnum_2c85_811c && _player->walkPathIndex != 0xff) {
+				if (_player->isAtWalkTarget() && _player->_heroMoving && _player->walkPathIndex != -1) {
+					_player->walkToNextConnector();
 //					if (walkPathIndex + 1 < numConnectorsInWalkPath) {
 //						walkPathIndex = walkPathIndex + 1;
 //						walkTargetX = *(uint *)((int)roomConnectorXPositionTbl +
@@ -481,15 +481,15 @@ void DarkseedEngine::handleInput() {
 				}
 				_room->calculateScaledSpriteDimensions(_player->getWidth(), _player->getHeight(), _player->_position.y);
 
-				if (_player->isAtWalkTarget() && _player->BoolEnum_2c85_811c && !_player->isPlayerWalking_maybe) {
+				if (_player->isAtWalkTarget() && _player->_heroMoving && !_player->isPlayerWalking_maybe) {
 					if (useDoorTarget) {
 						_player->changeDirection(_player->_direction, targetPlayerDirection);
 						useDoorTarget = false;
-						BoolByteEnum_2c85_8324 = true;
+						_doorEnabled = true;
 						return;
 					}
-					_player->BoolEnum_2c85_811c = false;
-					if (useDoorTarget || BoolByteEnum_2c85_8324) {
+					_player->_heroMoving = false;
+					if (useDoorTarget || _doorEnabled) {
 						for (int i = 0; i < _room->room1.size(); i++) {
 							RoomExit &roomExit = _room->room1[i];
 							if (roomExit.roomNumber != 0xff
@@ -512,7 +512,7 @@ void DarkseedEngine::handleInput() {
 								if (bVar) {
 									if (currentRoomNumber != 0x22 && (currentRoomNumber < 0x13 || currentRoomNumber > 0x17)) {
 										_player->_playerIsChangingDirection = false;
-										_player->BoolEnum_2c85_811c = false;
+										_player->_heroMoving = false;
 										_player->updateSprite();
 										updateDisplay();
 										_previousRoomNumber = currentRoomNumber;
@@ -546,22 +546,25 @@ void DarkseedEngine::handleInput() {
 						_player->playerNewFacingDirection_maybe = -1;
 						return;
 					}
-					_player->BoolEnum_2c85_811c = false;
+					_player->_heroMoving = false;
 					_player->isPlayerWalking_maybe = false;
 					// TODO complete at final destination logic. 2022:879d
-//					if (walkToSequence != 0) {
-//						walkToSequence = 0;
-//						curXPosition = cursorSequenceXPosition;
-//						curYPosition = cursorSequenceYPosition;
-//					}
+					Common::Point currentCursorPos = _cursor.getPosition();
+					if (_player->_walkToSequence) {
+						_cursor.setPosition(_player->_walkToSequencePoint);
+						_player->_walkToSequence = false;
+					}
 					int objIdx = _room->getObjectUnderCursor();
+					_cursor.setPosition(currentCursorPos);
+					if (objIdx != -1) {
 					int objType = _room->_roomObj[objIdx].type;
 					int objNum = _room->_roomObj[objIdx].objNum;
-					if (objIdx != -1 && ((objType != 4 && objType != 0 && objType < 10) || objNum > 5 || _room->_collisionType != 0)) {
-						if (_room->_collisionType == 0) {
-							handleObjCollision(objNum);
-						} else {
-							handleObjCollision(objIdx); // TODO is this correct?
+						if (((objType != 4 && objType != 0 && objType < 10) || objNum > 5 || _room->_collisionType != 0)) {
+							if (_room->_collisionType == 0) {
+								handleObjCollision(objNum);
+							} else {
+								handleObjCollision(objIdx); // TODO is this correct?
+							}
 						}
 					}
 				}
@@ -622,7 +625,7 @@ void DarkseedEngine::handleInput() {
 									local_6--;
 								} else {
 									_player->_position.x -= local_6;
-									_player->BoolEnum_2c85_811c = true;
+									_player->_heroMoving = true;
 									bVar1 = true;
 								}
 							}
@@ -637,7 +640,7 @@ void DarkseedEngine::handleInput() {
 									local_6--;
 								} else {
 									_player->_position.x += local_6;
-									_player->BoolEnum_2c85_811c = true;
+									_player->_heroMoving = true;
 									bVar1 = true;
 								}
 							}
@@ -657,7 +660,7 @@ void DarkseedEngine::handleInput() {
 									local_4--;
 								} else {
 									_player->_position.y -= local_4;
-									_player->BoolEnum_2c85_811c = true;
+									_player->_heroMoving = true;
 									bVar2 = true;
 								}
 							}
@@ -672,7 +675,7 @@ void DarkseedEngine::handleInput() {
 									local_4--;
 								} else {
 									_player->_position.y += local_4;
-									_player->BoolEnum_2c85_811c = true;
+									_player->_heroMoving = true;
 									bVar2 = true;
 								}
 							}
@@ -681,7 +684,7 @@ void DarkseedEngine::handleInput() {
 						if (!bVar1 || !bVar2) {
 							_player->_walkTarget = _player->_position;
 						}
-						BoolByteEnum_2c85_8324 = false;
+						_doorEnabled = false;
 						if (_player->_isAutoWalkingToBed && _player->isAtWalkTarget()) {
 							_player->updateBedAutoWalkSequence();
 						}
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 91658fc4164..517c35d2d46 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -110,7 +110,7 @@ public:
 	int spriteAnimCountdownTimer[20];
 
 	// Unknown variables
-	bool BoolByteEnum_2c85_8324 = false;
+	bool _doorEnabled = false;
 	uint16 DAT_2c85_825c = 0;
 	uint16 DAT_2c85_819c = 0;
 	bool BoolEnum_2c85_985a = false;
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index 7860444ecb6..35273bc31e4 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -136,3 +136,10 @@ int Darkseed::Objects::getEyeDescriptionTosIdx(uint16 objNum) {
 	}
 	return eyeDescriptionsTbl[objNum];
 }
+
+int Darkseed::Objects::getMoveObjectRoom(uint16 idx) {
+	if (idx >= MAX_OBJECTS) {
+		error("getMoveObjectRoom: index out of range.");
+	}
+	return _moveObjectRoom[idx];
+}
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 67a68d67787..608e8f7ec29 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -45,6 +45,8 @@ public:
 	Common::Point getMoveObjectPosition(uint8 objIdx);
 	int getEyeDescriptionTosIdx(uint16 objNum);
 
+	int getMoveObjectRoom(uint16 idx);
+
 	int16 &operator[](uint16 varIdx);
 	const int16 &operator[](uint16 varIdx) const;
 };
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 8167db5b99b..9ac72353e09 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -20,11 +20,13 @@
 */
 
 #include "player.h"
+#include "common/math.h"
 #include "darkseed.h"
 
 Darkseed::Player::Player() {
 	_cPlayerSprites.load("cplayer.nsp");
 	_gPlayerSprites.load("gplayer.nsp");
+	_connectorList.resize(Room::MAX_CONNECTORS);
 }
 
 const Darkseed::Sprite &Darkseed::Player::getSprite(int frameNo) {
@@ -45,7 +47,7 @@ void Darkseed::Player::updateSprite() {
 		if ((_direction == 3) || (_direction == 1)) {
 			g_engine->player_sprite_related_2c85_82f3 = BYTE_ARRAY_2c85_41eb[_direction];
 		}
-		if (_position.x == _walkTarget.x && _position.y == _walkTarget.y && !BoolEnum_2c85_811c) {
+		if (_position.x == _walkTarget.x && _position.y == _walkTarget.y && !_heroMoving) {
 			_frameIdx = playerSpriteIndexDirectionTbl[_direction];
 		} else {
 			_frameIdx = playerWalkFrameIdx + walkFrameOffsetTbl[_direction];
@@ -156,7 +158,7 @@ void Darkseed::Player::playerFaceWalkTarget() {
 }
 
 void Darkseed::Player::calculateWalkTarget() {
-	BoolEnum_2c85_811c = true;
+	_heroMoving = true;
 	playerWalkFrameIdx = 0;
 	walkPathIndex = -1;
 	numConnectorsInWalkPath = 0;
@@ -191,11 +193,20 @@ void Darkseed::Player::calculateWalkTarget() {
 		for (; !g_engine->_room->canWalkAtLocation(_walkTarget.x, ty) && ty <= 0xe9;) {
 			ty += 4;
 		}
-		if (ty < 0xeb) {
+		if (ty < 235) {
 			_walkTarget.y = ty;
 		}
 	}
 
+	if (g_engine->_room->canWalkInLineToTarget(_position.x, _position.y, _walkTarget.x, _walkTarget.y)) {
+		return;
+	}
+
+	if (!g_engine->_room->canWalkAtLocation(_walkTarget.x, _walkTarget.y)) {
+		// TODO find closest connector
+	} else {
+		createConnectorPathToDest();
+	}
 	// TODO more logic here.
 }
 
@@ -277,3 +288,90 @@ void Darkseed::Player::updatePlayerPositionAfterRoomChange() {
 void Darkseed::Player::updateBedAutoWalkSequence() {
 	// TODO updateBedAutoWalkSequence.
 }
+
+void Darkseed::Player::createConnectorPathToDest() {
+	constexpr Common::Point noConnectorFound(-1,-1);
+	Common::Point origWalkTarget = _walkTarget;
+	if (g_engine->_room->_roomNumber != 5 || _position.x > 320) {
+		_walkTarget = _position;
+	}
+	numConnectorsInWalkPath = 0;
+	Common::Point connector;
+	if (!g_engine->_room->canWalkAtLocation(_position.x, _position.y)) {
+		connector = getClosestUnusedConnector(_position.x, _position.y);
+	} else {
+		connector = getClosestUnusedConnector(_position.x, _position.y, true);
+	}
+	if (connector == noConnectorFound) {
+		if (g_engine->_room->_roomNumber != 5 || _position.x > 320) {
+			_walkTarget = origWalkTarget;
+		}
+		return;
+	}
+
+	walkPathIndex = 0;
+	_connectorList[numConnectorsInWalkPath] = connector;
+	numConnectorsInWalkPath++;
+
+	while (numConnectorsInWalkPath < Room::MAX_CONNECTORS && connector != noConnectorFound) {
+		if (g_engine->_room->canWalkInLineToTarget(connector.x, connector.y, _walkTarget.x, _walkTarget.y)) {
+			break;
+		}
+		connector = getClosestUnusedConnector(connector.x, connector.y, true);
+		if (connector == _walkTarget) {
+			break;
+		}
+		if (connector != noConnectorFound) {
+			_connectorList[numConnectorsInWalkPath] = connector;
+			numConnectorsInWalkPath++;
+		}
+	}
+
+	if (g_engine->_room->_roomNumber != 5 || _position.x > 320) {
+//		FlipConnectorList();
+		_walkTarget = origWalkTarget;
+	}
+	// Optimize();
+	if (g_engine->_room->_roomNumber == 5 && _position.x < 321) {
+		_finalTarget = _walkTarget;
+	} else {
+		_finalTarget = origWalkTarget;
+	}
+	_walkTarget = _connectorList[0];
+}
+
+Common::Point Darkseed::Player::getClosestUnusedConnector(int16 x, int16 y, bool mustHaveCleanLine) {
+	Common::Point closestPoint = {-1, -1};
+	int closestDist = 5000;
+	for (auto &roomConnector : g_engine->_room->_connectors) {
+		bool containsPoint = false;
+		for (int i = 0; i < numConnectorsInWalkPath; i++) {
+			if (_connectorList[i] == roomConnector) {
+				containsPoint = true;
+			}
+		}
+		if (!containsPoint) {
+			int dist = Common::hypotenuse(ABS(roomConnector.x - x), ABS(roomConnector.y - y));
+			if (dist < closestDist) {
+				if (!mustHaveCleanLine || g_engine->_room->canWalkInLineToTarget(x, y, roomConnector.x, roomConnector.y)) {
+					closestPoint = roomConnector;
+				}
+			}
+		}
+	}
+	return closestPoint;
+}
+
+void Darkseed::Player::walkToNextConnector() {
+	if (walkPathIndex == -1) {
+		return;
+	}
+	if (walkPathIndex + 1 < numConnectorsInWalkPath) {
+		walkPathIndex++;
+		_walkTarget = _connectorList[walkPathIndex];
+	} else {
+		_walkTarget = _finalTarget;
+		walkPathIndex = -1;
+	}
+	playerFaceWalkTarget();
+}
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index a311d835158..a934482d642 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -39,6 +39,8 @@ public:
 	Common::Point _position;
 	Common::Point _positionLong; // the original sometimes seems to use a long (4 byte) version of the location
 	Common::Point _walkTarget;
+	Common::Point _finalTarget;
+
 	int16 playerSpriteWalkIndex_maybe = 0;
 	int16 playerWalkFrameDeltaOffset = 0;
 	int16 playerNewFacingDirection_maybe = 0;
@@ -46,9 +48,12 @@ public:
 	bool isPlayerWalking_maybe = false; // player is pathfinding to some destination?
 	bool _playerIsChangingDirection = false;
 	bool _isAutoWalkingToBed = false;
-	bool BoolEnum_2c85_811c = false; // maybe set to true while player is walking around the room.
+	bool _heroMoving = false; // maybe set to true while player is walking around the room.
 	int walkPathIndex = -1;
 	uint16 numConnectorsInWalkPath = 0;
+	Common::Array<Common::Point> _connectorList;
+	bool _walkToSequence = false;
+	Common::Point _walkToSequencePoint;
 
 public:
 	Player();
@@ -67,6 +72,11 @@ public:
 	int getHeight();
 	void updatePlayerPositionAfterRoomChange();
 	void updateBedAutoWalkSequence();
+	void walkToNextConnector();
+
+private:
+	void createConnectorPathToDest();
+	Common::Point getClosestUnusedConnector(int16 x, int16 y, bool mustHaveCleanLine = false);
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 22f964de48f..268b0f661c1 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -101,10 +101,10 @@ bool Darkseed::Room::load() {
 		}
 
 		if (_roomObj[i].objNum == 0 && _roomObj[i].type == 1) {
-			if (connectors.size() == 0xc) {
-				error("Too many connectors in this room, max of %d", 0xc);
+			if (_connectors.size() == MAX_CONNECTORS) {
+				error("Too many connectors in this room, max of %d", MAX_CONNECTORS);
 			}
-			RoomConnector connector;
+			Common::Point connector;
 			connector.x = _roomObj[i].xOffset;
 			connector.y = _roomObj[i].yOffset;
 
@@ -122,7 +122,7 @@ bool Darkseed::Room::load() {
 			}
 
 			debug("Room Connector: %d %d", connector.x, connector.y);
-			connectors.push_back(connector);
+			_connectors.push_back(connector);
 			_roomObj[i].type = 0xff;
 		}
 	}
@@ -261,28 +261,29 @@ int Darkseed::Room::CheckCursorAndMovedObjects() {
 									 : g_engine->_cursor.getSprite();
 	_collisionType = 1;
 	for (int i = 0; i < Objects::MAX_MOVED_OBJECTS; i++) {
-		Common::Point movedObjPos = g_engine->_objectVar.getMoveObjectPosition(i);
-		int16 spriteWidth = 0;
-		int16 spriteHeight = 0;
-		if (i == 22) {
-			uint8 spriteIdx = g_engine->_objectVar.getVar(5) != 0 ? 1 : 0;
-			const Sprite &sprite = _locationSprites.getSpriteAt(spriteIdx);
-			spriteWidth = sprite.width;
-			spriteHeight = sprite.height;
-		} else {
-			const Sprite &sprite = g_engine->_baseSprites.getSpriteAt(i);
-			spriteWidth = sprite.width;
-			spriteHeight = sprite.height;
-		}
-		calculateScaledSpriteDimensions(spriteWidth, spriteHeight, movedObjPos.y);
+		if (g_engine->_objectVar.getMoveObjectRoom(i) == _roomNumber) {
+			Common::Point movedObjPos = g_engine->_objectVar.getMoveObjectPosition(i);
+			int16 spriteWidth = 0;
+			int16 spriteHeight = 0;
+			if (i == 22) {
+				uint8 spriteIdx = g_engine->_objectVar.getVar(5) != 0 ? 1 : 0;
+				const Sprite &sprite = _locationSprites.getSpriteAt(spriteIdx);
+				spriteWidth = sprite.width;
+				spriteHeight = sprite.height;
+			} else {
+				const Sprite &sprite = g_engine->_baseSprites.getSpriteAt(i);
+				spriteWidth = sprite.width;
+				spriteHeight = sprite.height;
+			}
+			calculateScaledSpriteDimensions(spriteWidth, spriteHeight, movedObjPos.y);
 
-		if (
-			((spriteWidth / 2 + movedObjPos.x) - g_engine->scaledSpriteWidth / 2 <= cursorSprite.width + g_engine->_cursor.getX()) &&
-			(g_engine->_cursor.getX() <= ((spriteWidth / 2 + movedObjPos.x) - g_engine->scaledSpriteWidth / 2) + g_engine->scaledSpriteWidth) &&
-			((movedObjPos.y + spriteHeight) - g_engine->scaledSpriteHeight <= cursorSprite.height + g_engine->_cursor.getY()) &&
-			g_engine->_cursor.getY() <= movedObjPos.y + spriteHeight
-		) {
-			return i;
+			if (
+				((spriteWidth / 2 + movedObjPos.x) - g_engine->scaledSpriteWidth / 2 <= cursorSprite.width + g_engine->_cursor.getX()) &&
+				(g_engine->_cursor.getX() <= ((spriteWidth / 2 + movedObjPos.x) - g_engine->scaledSpriteWidth / 2) + g_engine->scaledSpriteWidth) &&
+				((movedObjPos.y + spriteHeight) - g_engine->scaledSpriteHeight <= cursorSprite.height + g_engine->_cursor.getY()) &&
+				g_engine->_cursor.getY() <= movedObjPos.y + spriteHeight) {
+				return i;
+			}
 		}
 	}
 	return -1;
@@ -387,46 +388,180 @@ bool Darkseed::Room::canWalkAtLocation(int x, int y) {
 	return (walkableLocationsMap[t / 8].strip[(y - 40) / 5] >> (7 - (t % 8) & 0x1f) & 1);
 }
 
-bool Darkseed::Room::canWalkInLineToTarget(int x, int y, int targetX, int targetY) {
-	int iVar2 = targetX - x;
-	int iVar3 = targetY - y;
-
-	if (iVar2 < 0 || iVar3 > 0) {
-		if (iVar2 < 1 && iVar3 < 1) {
-			if (-iVar2 <= -iVar3) {
-				int iVar4 = 0;
-				do {
-					if (x == targetX) {
-						return true;
+bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int destY) {
+	int iVar1;
+	int iVar2;
+	int iVar4;
+
+	iVar1 = destX - srcX;
+	destY = destY - srcY;
+	iVar4 = 0;
+	if ((iVar1 < 0) || (0 < destY)) {
+		if ((iVar1 < 1) && (destY < 1)) {
+			iVar2 = -iVar1;
+			if (-iVar1 <= -destY) { //destY == iVar1 || SBORROW2(iVar2,-destY) != iVar2 + destY < 0) { //-iVar1 <= -destY
+				while (srcX != destX) {
+					iVar4 = iVar4 - iVar1;
+					if (-iVar4 == destY || -destY < iVar4) {
+						iVar4 = iVar4 + destY;
+						srcX = srcX + -1;
 					}
-					iVar4 -= iVar2;
-					if (-iVar4 == iVar3 || -iVar3 < iVar4) {
-						iVar4 += iVar3;
-						x--;
+					srcY = srcY + -1;
+					iVar2 = canWalkAtLocation(srcX,srcY);
+					if (iVar2 == 0) {
+						return 0;
 					}
-					y--;
-				} while (canWalkAtLocation(x, y));
+				}
 			}
-		} else {
-			int iVar4 = 0;
-			do {
-				if (x == targetX) {
-					return true;
+			else {
+				while (srcX != destX) {
+					iVar4 = iVar4 - destY;
+					if (-iVar4 == iVar1 || -iVar1 < iVar4) {
+						iVar4 = iVar4 + iVar1;
+						srcY = srcY + -1;
+					}
+					srcX = srcX + -1;
+					iVar2 = canWalkAtLocation(srcX,srcY);
+					if (iVar2 == 0) {
+						return 0;
+					}
 				}
-				iVar4 -= iVar3;
-				if (-iVar4 == iVar2 || -iVar2 < iVar4) {
-					iVar4 += iVar2;
-					y--;
+			}
+		}
+		else if ((iVar1 < 1) && (0 < destY)) {
+			iVar2 = -iVar1;
+			if (-destY == iVar1 || iVar2 < destY) {
+				while (srcX != destX) {
+					iVar4 = iVar4 - iVar1;
+					if (destY <= iVar4) {
+						iVar4 = iVar4 - destY;
+						srcX = srcX + -1;
+					}
+					srcY = srcY + 1;
+					iVar2 = canWalkAtLocation(srcX,srcY);
+					if (iVar2 == 0) {
+						return 0;
+					}
+				}
+			}
+			else {
+				while (srcX != destX) {
+					iVar4 = iVar4 + destY;
+					if (-iVar4 == iVar1 || -iVar1 < iVar4) {
+						iVar4 = iVar4 + iVar1;
+						srcY = srcY + 1;
+					}
+					srcX = srcX + -1;
+					iVar2 = canWalkAtLocation(srcX,srcY);
+					if (iVar2 == 0) {
+						return 0;
+					}
 				}
-				x--;
-			} while (canWalkAtLocation(x, y));
+			}
+		}
+		else {
+			iVar2 = iVar1;
+			if (destY < iVar1) {
+				while (srcX != destX) {
+					iVar4 = iVar4 + destY;
+					if (iVar1 <= iVar4) {
+						iVar4 = iVar4 - iVar1;
+						srcY = srcY + 1;
+					}
+					srcX = srcX + 1;
+					iVar2 = canWalkAtLocation(srcX,srcY);
+					if (iVar2 == 0) {
+						return 0;
+					}
+				}
+			}
+			else {
+				while (srcX != destX) {
+					iVar4 = iVar4 + iVar1;
+					if (destY <= iVar4) {
+						iVar4 = iVar4 - destY;
+						srcX = srcX + 1;
+					}
+					srcY = srcY + 1;
+					iVar2 = canWalkAtLocation(srcX,srcY);
+					if (iVar2 == 0) {
+						return 0;
+					}
+				}
+			}
 		}
-	} else if (-iVar3 < iVar2) {
-
-	} else {
-
 	}
-	return false;
+	else {
+		iVar2 = -destY;
+		if (iVar2 < iVar1) {
+			while (srcX != destX) {
+				iVar4 = iVar4 - destY;
+				if (iVar1 <= iVar4) {
+					iVar4 = iVar4 - iVar1;
+					srcY = srcY + -1;
+				}
+				srcX = srcX + 1;
+				iVar2 = canWalkAtLocation(srcX,srcY);
+				if (iVar2 == 0) {
+					return 0;
+				}
+			}
+		}
+		else {
+			while (srcX != destX) {
+				iVar4 = iVar4 + iVar1;
+				if (-iVar4 == destY || -destY < iVar4) {
+					iVar4 = iVar4 + destY;
+					srcX = srcX + 1;
+				}
+				srcY = srcY + -1;
+				iVar2 = canWalkAtLocation(srcX,srcY);
+				if (iVar2 == 0) {
+					return 0;
+				}
+			}
+		}
+	}
+	return true;
+//	int iVar2 = targetX - x;
+//	int iVar3 = targetY - y;
+//
+//	if (iVar2 < 0 || iVar3 > 0) {
+//		if (iVar2 < 1 && iVar3 < 1) {
+//			if (-iVar2 <= -iVar3) {
+//				int iVar4 = 0;
+//				do {
+//					if (x == targetX) {
+//						return true;
+//					}
+//					iVar4 -= iVar2;
+//					if (-iVar4 == iVar3 || -iVar3 < iVar4) {
+//						iVar4 += iVar3;
+//						x--;
+//					}
+//					y--;
+//				} while (canWalkAtLocation(x, y));
+//			}
+//		} else {
+//			int iVar4 = 0;
+//			do {
+//				if (x == targetX) {
+//					return true;
+//				}
+//				iVar4 -= iVar3;
+//				if (-iVar4 == iVar2 || -iVar2 < iVar4) {
+//					iVar4 += iVar2;
+//					y--;
+//				}
+//				x--;
+//			} while (canWalkAtLocation(x, y));
+//		}
+//	} else if (-iVar3 < iVar2) {
+//
+//	} else {
+//
+//	}
+//	return false;
 }
 
 void Darkseed::Room::printRoomDescriptionText() const {
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index cc9d8522f96..ca39ffc190e 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -53,13 +53,9 @@ struct RoomObjElement {
 	uint8 spriteNum = 0;
 };
 
-struct RoomConnector {
-	uint16 x = 0;
-	uint16 y = 0;
-};
-
 class Room {
 public:
+	static constexpr int MAX_CONNECTORS = 12;
 	int _roomNumber;
 	Pic pic;
 	Pal _pal;
@@ -68,7 +64,7 @@ public:
 	Common::Array<RoomExit> room1;
 	Common::Array<RoomStruct2> walkableLocationsMap;
 	Common::Array<RoomObjElement> _roomObj;
-	Common::Array<RoomConnector> connectors;
+	Common::Array<Common::Point> _connectors;
 
 	uint16 selectedObjIndex = 0;
 	int16 _collisionType = 0;


Commit: 7f5cf5527f3e59bb7d8e3222b721319a52815522
    https://github.com/scummvm/scummvm/commit/7f5cf5527f3e59bb7d8e3222b721319a52815522
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fixed spinning in a circle bug.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/player.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 79fd3ab1416..27aaaf92aa4 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -350,55 +350,55 @@ void DarkseedEngine::handleInput() {
 							// TODO walk player to object.
 							_player->_walkToSequence = true;
 							_player->_walkToSequencePoint = _cursor.getPosition();
-							_player->playerNewFacingDirection_maybe = -1;
+							_player->_sequenceRotation = -1;
 							Common::Point currentCursorPos = _cursor.getPosition();
 							int objNum = _room->_roomObj[roomObjIdx].objNum;
 							if (walkToDirTbl[objNum] != 4) {
-								_player->playerNewFacingDirection_maybe = walkToDirTbl[objNum];
+								_player->_sequenceRotation = walkToDirTbl[objNum];
 								_cursor.updatePosition(walkToXTbl[objNum], walkToYTbl[objNum]);
 							}
 							if (objNum == 142 && _room->_roomNumber == 2) {
-								_player->playerNewFacingDirection_maybe = 0;
+								_player->_sequenceRotation = 0;
 								_cursor.updatePosition(347, 189);
 							} else if (objNum == 53 && _room->_roomNumber == 15) {
-								_player->playerNewFacingDirection_maybe = 0;
+								_player->_sequenceRotation = 0;
 								_cursor.updatePosition(369, 216);
 							} else if (objNum == 114) {
 								if (_cursor.getX() < 321) {
-									_player->playerNewFacingDirection_maybe = 3;
+									_player->_sequenceRotation = 3;
 									_cursor.updatePosition(169, 178);
 								} else {
-									_player->playerNewFacingDirection_maybe = 1;
+									_player->_sequenceRotation = 1;
 									_cursor.updatePosition(362, 198);
 								}
 							} else if (objNum == 189 || (objNum == 64 && _room->_roomNumber == 30)) {
-								_player->playerNewFacingDirection_maybe = 1;
+								_player->_sequenceRotation = 1;
 								_cursor.updatePosition(405, 208);
 							} else if (objNum == 50 || objNum == 85 || (objNum >= 163 && objNum <= 168)) {
-								_player->playerNewFacingDirection_maybe = 3;
+								_player->_sequenceRotation = 3;
 								_cursor.updatePosition(228, 211);
 							} else if (objNum == 51 || objNum == 187) {
-								_player->playerNewFacingDirection_maybe = 1;
+								_player->_sequenceRotation = 1;
 								_cursor.updatePosition(380, 211);
 							} else if (objNum == 116 && _actionMode == Unk19Action) {
-								_player->playerNewFacingDirection_maybe = 1;
+								_player->_sequenceRotation = 1;
 								_cursor.updatePosition(285, 233);
 							} else if (objNum == 137) {
-								_player->playerNewFacingDirection_maybe = 1;
+								_player->_sequenceRotation = 1;
 								if (_actionMode == Unk27Action) {
 									_cursor.updatePosition(354, 175);
 								} else {
 									_cursor.updatePosition(409, 173);
 								}
 							} else if (objNum == 112 || objNum == 111) {
-							_player->playerNewFacingDirection_maybe = 1;
+							_player->_sequenceRotation = 1;
 							_cursor.updatePosition(464, 191);
 							} else if (objNum == 138 || objNum == 7 || objNum == 152) {
-								_player->playerNewFacingDirection_maybe = 1;
+								_player->_sequenceRotation = 1;
 								_cursor.updatePosition(292, 208);
 							} else if (objNum == 22 || objNum == 42 ||
 									   (objNum == 35 && _objectVar[22] < 2 && _cursor.getY() > 40)) {
-								_player->playerNewFacingDirection_maybe = 1;
+								_player->_sequenceRotation = 1;
 								if (_objectVar[22] == 0 || _objectVar[22] == 1) {
 									_cursor.updatePosition(437, 203);
 								}
@@ -411,28 +411,28 @@ void DarkseedEngine::handleInput() {
 							}
 
 							if (objNum == 102 && _objectVar[23] != 0 && _actionMode == HandAction) {
-								_player->playerNewFacingDirection_maybe = 0;
+								_player->_sequenceRotation = 0;
 								_cursor.updatePosition(331, 195);
 							} else if (objNum < 104 || objNum > 108) {
 								if (objNum == 78) {
 									if (_room->_roomNumber == 2) {
-										_player->playerNewFacingDirection_maybe = 3;
+										_player->_sequenceRotation = 3;
 										_cursor.updatePosition(152, 239);
 									} else {
-										_player->playerNewFacingDirection_maybe = 1;
+										_player->_sequenceRotation = 1;
 										_cursor.updatePosition(497, 220);
 									}
 								} else if (objNum == 59) {
 									if (_room->_roomNumber == 3) {
-										_player->playerNewFacingDirection_maybe = 3;
+										_player->_sequenceRotation = 3;
 										_cursor.updatePosition(145, 239);
 									} else {
-										_player->playerNewFacingDirection_maybe = 1;
+										_player->_sequenceRotation = 1;
 										_cursor.updatePosition(520, 229);
 									}
 								}
 							} else {
-								_player->playerNewFacingDirection_maybe = 3;
+								_player->_sequenceRotation = 3;
 								_cursor.updatePosition(_room->_roomObj[roomObjIdx].xOffset + 30, 206);
 							}
 							if (_room->_roomNumber == 34 || (_room->_roomNumber > 18 && _room->_roomNumber < 24)) {
@@ -462,19 +462,6 @@ void DarkseedEngine::handleInput() {
 				}
 				if (_player->isAtWalkTarget() && _player->_heroMoving && _player->walkPathIndex != -1) {
 					_player->walkToNextConnector();
-//					if (walkPathIndex + 1 < numConnectorsInWalkPath) {
-//						walkPathIndex = walkPathIndex + 1;
-//						walkTargetX = *(uint *)((int)roomConnectorXPositionTbl +
-//												*(int *)((int)walkPathConnectorList + walkPathIndex * 2) * 2);
-//						walkTargetY = *(uint *)((int)roomConnectorYPositionTbl +
-//												*(int *)((int)walkPathConnectorList + walkPathIndex * 2) * 2);
-//					}
-//					else {
-//						walkTargetX = DAT_2c85_6dd7;
-//						walkTargetY = DAT_2c85_6df1;
-//						walkPathIndex = 0xff;
-//					}
-//					playerFaceWalkTarget();
 				}
 				if (_isLeftMouseClicked && _cursor.getY() < 0x29) {
 					// TODO handle inventory click.
@@ -540,10 +527,10 @@ void DarkseedEngine::handleInput() {
 					}
 				}
 				if (_player->isAtWalkTarget() && _player->isPlayerWalking_maybe) {
-					if (_player->playerNewFacingDirection_maybe != -1) {
-						_player->changeDirection(_player->_direction, _player->playerNewFacingDirection_maybe);
+					if (_player->_sequenceRotation != -1) {
+						_player->changeDirection(_player->_direction, _player->_sequenceRotation);
 						_player->updateSprite();
-						_player->playerNewFacingDirection_maybe = -1;
+						_player->_sequenceRotation = -1;
 						return;
 					}
 					_player->_heroMoving = false;
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index a934482d642..1ba3126ccb7 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -52,6 +52,7 @@ public:
 	int walkPathIndex = -1;
 	uint16 numConnectorsInWalkPath = 0;
 	Common::Array<Common::Point> _connectorList;
+	int16 _sequenceRotation = -1;
 	bool _walkToSequence = false;
 	Common::Point _walkToSequencePoint;
 


Commit: b1798d9b1b14351f899b90c6626280aeb10b360c
    https://github.com/scummvm/scummvm/commit/b1798d9b1b14351f899b90c6626280aeb10b360c
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Working on pathfinding

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/player.cpp
    engines/darkseed/player.h
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 27aaaf92aa4..3adca07f256 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -193,6 +193,7 @@ void DarkseedEngine::gameloop() {
 		_frame.draw();
 		_room->draw();
 		_sprites.drawSprites();
+		_player->draw();
 		_console->draw();
 		_cursor.draw();
 		_screen->makeAllDirty();
@@ -557,7 +558,6 @@ void DarkseedEngine::handleInput() {
 				}
 				if (!isPlayingAnimation_maybe) {
 					// walk to destination point
-					Common::Point origPlayerPosition = _player->_position;
 					int walkXDelta = 0;
 					int walkYDelta = 0;
 					int local_a = scaledWalkSpeed_maybe * 16;
@@ -633,10 +633,10 @@ void DarkseedEngine::handleInput() {
 							}
 						}
 						if (_player->_walkTarget.y < _player->_position.y) {
-							if (_player->_position.y - _player->_walkTarget.y <= walkYDelta) {
-								local_4 = _player->_position.y - _player->_walkTarget.y;
-							} else {
+							if (walkYDelta < _player->_position.y - _player->_walkTarget.y) {
 								local_4 = walkYDelta;
+							} else {
+								local_4 = _player->_position.y - _player->_walkTarget.y;
 							}
 							while (!bVar2 && local_4 > 0) {
 								int local_34 = (_player->_position.y - local_4) - 1;
@@ -652,10 +652,10 @@ void DarkseedEngine::handleInput() {
 								}
 							}
 						} else if (_player->_position.y < _player->_walkTarget.y) {
-							if (_player->_walkTarget.y - _player->_position.y <= walkYDelta) {
-								local_4 = _player->_walkTarget.y - _player->_position.y;
-							} else {
+							if (walkYDelta < _player->_walkTarget.y - _player->_position.y) {
 								local_4 = walkYDelta;
+							} else {
+								local_4 = _player->_walkTarget.y - _player->_position.y;
 							}
 							while (!bVar2 && local_4 > 0) {
 								if (!_room->canWalkAtLocation(_player->_position.x, _player->_position.y + local_4 + 2)) {
@@ -680,27 +680,29 @@ void DarkseedEngine::handleInput() {
 							if (_player->_position.x - _player->_walkTarget.x < walkXDelta) {
 								walkXDelta = _player->_position.x - _player->_walkTarget.x;
 							}
-							_player->_position.x -= walkXDelta;
+							_player->_positionLong.x -= walkXDelta;
 						} else if (_player->_position.x < _player->_walkTarget.x) {
 							if (_player->_walkTarget.x - _player->_position.x < walkXDelta) {
 								walkXDelta = _player->_walkTarget.x - _player->_position.x;
 							}
-							_player->_position.x += walkXDelta;
+							_player->_positionLong.x += walkXDelta;
 						}
 						if (_player->_walkTarget.y < _player->_position.y) {
 							if (_player->_position.y - _player->_walkTarget.y < walkYDelta) {
 								walkYDelta = _player->_position.y - _player->_walkTarget.y;
 							}
-							_player->_position.y -= walkYDelta;
+							_player->_positionLong.y -= walkYDelta;
 						} else if (_player->_position.y < _player->_walkTarget.y) {
 							if (_player->_walkTarget.y - _player->_position.y < walkYDelta) {
 								walkYDelta = _player->_walkTarget.y - _player->_position.y;
 							}
-							_player->_position.y += walkYDelta;
+							_player->_positionLong.y += walkYDelta;
 						}
-						if (!_room->canWalkAtLocation(_player->_position.x, _player->_position.y)) {
-							_player->_position = origPlayerPosition;
-							_player->_walkTarget = origPlayerPosition;
+						if (!_room->canWalkAtLocation(_player->_positionLong.x, _player->_positionLong.y)) {
+							_player->_walkTarget = _player->_position;
+							_player->_positionLong = _player->_position;
+						} else {
+							_player->_position = _player->_positionLong;
 						}
 					}
 				}
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 517c35d2d46..f0d3ed2ed55 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -123,6 +123,8 @@ public:
 	uint8 targetPlayerDirection = 0; // related to changing rooms.
 
 	uint8 systemTimerCounter = 0;
+
+	bool _debugShowWalkPath = false;
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	~DarkseedEngine() override;
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 9ac72353e09..2f21ea7f2d7 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -203,7 +203,10 @@ void Darkseed::Player::calculateWalkTarget() {
 	}
 
 	if (!g_engine->_room->canWalkAtLocation(_walkTarget.x, _walkTarget.y)) {
-		// TODO find closest connector
+		Common::Point connector = getClosestUnusedConnector(_walkTarget.x, _walkTarget.y);
+		if (connector.x == -1 && connector.y == -1) {
+			return;
+		}
 	} else {
 		createConnectorPathToDest();
 	}
@@ -292,15 +295,17 @@ void Darkseed::Player::updateBedAutoWalkSequence() {
 void Darkseed::Player::createConnectorPathToDest() {
 	constexpr Common::Point noConnectorFound(-1,-1);
 	Common::Point origWalkTarget = _walkTarget;
+	Common::Point startPoint = _position;
 	if (g_engine->_room->_roomNumber != 5 || _position.x > 320) {
+		startPoint = _walkTarget;
 		_walkTarget = _position;
 	}
 	numConnectorsInWalkPath = 0;
 	Common::Point connector;
-	if (!g_engine->_room->canWalkAtLocation(_position.x, _position.y)) {
-		connector = getClosestUnusedConnector(_position.x, _position.y);
+	if (!g_engine->_room->canWalkAtLocation(startPoint.x, startPoint.y)) {
+		connector = getClosestUnusedConnector(startPoint.x, startPoint.y);
 	} else {
-		connector = getClosestUnusedConnector(_position.x, _position.y, true);
+		connector = getClosestUnusedConnector(startPoint.x, startPoint.y, true);
 	}
 	if (connector == noConnectorFound) {
 		if (g_engine->_room->_roomNumber != 5 || _position.x > 320) {
@@ -328,10 +333,10 @@ void Darkseed::Player::createConnectorPathToDest() {
 	}
 
 	if (g_engine->_room->_roomNumber != 5 || _position.x > 320) {
-//		FlipConnectorList();
+		reverseConnectorList();
 		_walkTarget = origWalkTarget;
 	}
-	// Optimize();
+	OptimisePath();
 	if (g_engine->_room->_roomNumber == 5 && _position.x < 321) {
 		_finalTarget = _walkTarget;
 	} else {
@@ -351,7 +356,7 @@ Common::Point Darkseed::Player::getClosestUnusedConnector(int16 x, int16 y, bool
 			}
 		}
 		if (!containsPoint) {
-			int dist = Common::hypotenuse(ABS(roomConnector.x - x), ABS(roomConnector.y - y));
+			int dist = Common::hypotenuse((roomConnector.x - x), (roomConnector.y - y));
 			if (dist < closestDist) {
 				if (!mustHaveCleanLine || g_engine->_room->canWalkInLineToTarget(x, y, roomConnector.x, roomConnector.y)) {
 					closestPoint = roomConnector;
@@ -375,3 +380,43 @@ void Darkseed::Player::walkToNextConnector() {
 	}
 	playerFaceWalkTarget();
 }
+
+void Darkseed::Player::draw() {
+	if (g_engine->_debugShowWalkPath) {
+		if (walkPathIndex != -1) {
+			for (int i = walkPathIndex; i < numConnectorsInWalkPath; i++) {
+				if (i == walkPathIndex) {
+					g_engine->_screen->drawLine(_position.x, _position.y, _connectorList[i].x, _connectorList[i].y, 2);
+				} else {
+					g_engine->_screen->drawLine(_connectorList[i].x, _connectorList[i].y, _connectorList[i-1].x, _connectorList[i-1].y, 2);
+				}
+			}
+			g_engine->_screen->drawLine(_connectorList[numConnectorsInWalkPath-1].x, _connectorList[numConnectorsInWalkPath-1].y, _finalTarget.x, _finalTarget.y, 2);
+		}
+	}
+}
+
+void Darkseed::Player::reverseConnectorList() {
+	Common::Array<Common::Point> tempList;
+	tempList.resize(numConnectorsInWalkPath);
+
+	for (int i = 0; i < numConnectorsInWalkPath; i++) {
+		tempList[i] = _connectorList[numConnectorsInWalkPath - 1 - i];
+	}
+
+	for (int i = 0; i < numConnectorsInWalkPath; i++) {
+		_connectorList[i] = tempList[i];
+	}
+}
+
+void Darkseed::Player::OptimisePath() {
+	if (g_engine->_room->_roomNumber != 7 && g_engine->_room->_roomNumber != 32) {
+		while (numConnectorsInWalkPath > 1) {
+			if(g_engine->_room->canWalkInLineToTarget(_connectorList[numConnectorsInWalkPath - 2].x, _connectorList[numConnectorsInWalkPath - 2].y, _walkTarget.x, _walkTarget.y)) {
+				numConnectorsInWalkPath--;
+			} else {
+				break;
+			}
+		}
+	}
+}
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index 1ba3126ccb7..e78802d2377 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -78,6 +78,8 @@ public:
 private:
 	void createConnectorPathToDest();
 	Common::Point getClosestUnusedConnector(int16 x, int16 y, bool mustHaveCleanLine = false);
+	void reverseConnectorList();
+	void OptimisePath();
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 268b0f661c1..08cc1a82e96 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -156,17 +156,19 @@ void Darkseed::Room::draw() {
 	pic.draw(0x45, 0x28);
 
 	// print walkable area map.
-//	for (int y = 0x28; y < pic.getHeight() + 0x28; y++) {
-//		for (int x = 0x45; x < pic.getWidth() + 0x45; x++) {
-//			if (canWalkAtLocation(x, y)) {
-//				g_engine->_screen->drawLine(x, y, x, y, 14);
-//			}
-//		}
-//	}
-//
-//	for (int i = 0; i < connectors.size(); i++) {
-//		g_engine->_baseSprites.getSpriteAt(0).draw(connectors[i].x, connectors[i].y);
-//	}
+	if (g_engine->_debugShowWalkPath) {
+		for (int y = 0x28; y < pic.getHeight() + 0x28; y++) {
+			for (int x = 0x45; x < pic.getWidth() + 0x45; x++) {
+				if (canWalkAtLocation(x, y)) {
+					g_engine->_screen->drawLine(x, y, x, y, 14);
+				}
+			}
+		}
+
+		for (int i = 0; i < _connectors.size(); i++) {
+			g_engine->_baseSprites.getSpriteAt(0).draw(_connectors[i].x, _connectors[i].y);
+		}
+	}
 }
 
 int Darkseed::Room::checkCursorAndMoveableObjects() {
@@ -609,7 +611,7 @@ void Darkseed::Room::getWalkTargetForObjectType_maybe(int objId) {
 	g_engine->_player->_walkTarget.y = g_engine->_cursor.getY();
 }
 
-static const int room_sprite_related_2c85_41e[] = {
+static const int scaleTbl[] = {
 	 1000,          1000,          1000,          1000,
 	 1000,          1000,          1000,          1000,
 	 1000,          1000,           400,           750,
@@ -656,7 +658,7 @@ void Darkseed::Room::calculateScaledSpriteDimensions(int width, int height, int
 	if (local_6 <= 0) {
 		local_6 = 0;
 	}
-	g_engine->scaledWalkSpeed_maybe = room_sprite_related_2c85_41e[_roomNumber] - ((room_sprite_related_2c85_4303[_roomNumber] * local_6) / 5);
+	g_engine->scaledWalkSpeed_maybe = scaleTbl[_roomNumber] - ((room_sprite_related_2c85_4303[_roomNumber] * local_6) / 5);
 	g_engine->scaledSpriteWidth = (width * g_engine->scaledWalkSpeed_maybe) / 1000;
 	g_engine->scaledSpriteHeight = (height * g_engine->scaledWalkSpeed_maybe) / 1000;
 }


Commit: d131a15c290717ce1cb1116b14e8dd06c5a33a16
    https://github.com/scummvm/scummvm/commit/d131a15c290717ce1cb1116b14e8dd06c5a33a16
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix pathfinder closest connector logic

Changed paths:
    engines/darkseed/player.cpp


diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 2f21ea7f2d7..8ff265fb969 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -360,6 +360,7 @@ Common::Point Darkseed::Player::getClosestUnusedConnector(int16 x, int16 y, bool
 			if (dist < closestDist) {
 				if (!mustHaveCleanLine || g_engine->_room->canWalkInLineToTarget(x, y, roomConnector.x, roomConnector.y)) {
 					closestPoint = roomConnector;
+					closestDist = dist;
 				}
 			}
 		}


Commit: a0f47c00d3dc30f687b1d06af77a50e42f05a239
    https://github.com/scummvm/scummvm/commit/a0f47c00d3dc30f687b1d06af77a50e42f05a239
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: debug added enablePathfinderOverlay to toggle the pathfinder debug overlay.

Changed paths:
    engines/darkseed/debugconsole.cpp
    engines/darkseed/debugconsole.h


diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
index 5e3b114e8bf..1a0daff6d22 100644
--- a/engines/darkseed/debugconsole.cpp
+++ b/engines/darkseed/debugconsole.cpp
@@ -29,6 +29,7 @@ DebugConsole::DebugConsole(TosText *tosText) : GUI::Debugger(), tosText(tosText)
 	registerCmd("dt",   WRAP_METHOD(DebugConsole, Cmd_dt));
 	registerCmd("getvar",   WRAP_METHOD(DebugConsole, Cmd_getvar));
 	registerCmd("setvar",   WRAP_METHOD(DebugConsole, Cmd_setvar));
+	registerCmd("enablePathfinderOverlay",   WRAP_METHOD(DebugConsole, Cmd_enablePathfinderOverlay));
 }
 
 DebugConsole::~DebugConsole() {
@@ -88,6 +89,20 @@ bool DebugConsole::Cmd_setvar(int argc, const char **argv) {
 	return true;
 }
 
+bool DebugConsole::Cmd_enablePathfinderOverlay(int argc, const char **argv) {
+	if (argc != 2) {
+		debugPrintf("Usage: enablePathfinderOverlay <true | t | false | f>\n");
+		return true;
+	}
+
+	if (!strcmp(argv[1], "true") || !strcmp(argv[1], "t")) {
+		g_engine->_debugShowWalkPath = true;
+	} else if (!strcmp(argv[1], "false") || !strcmp(argv[1], "f")) {
+		g_engine->_debugShowWalkPath = false;
+	}
+		return true;
+}
+
 bool DebugConsole::validateObjVarIndex(int16 varIdx) {
 	if (varIdx >= Objects::MAX_OBJECTS) {
 		debugPrintf("Index must be less than %d\n", Objects::MAX_OBJECTS);
diff --git a/engines/darkseed/debugconsole.h b/engines/darkseed/debugconsole.h
index fdbf08b4a7b..09bcdeceb3a 100644
--- a/engines/darkseed/debugconsole.h
+++ b/engines/darkseed/debugconsole.h
@@ -36,6 +36,7 @@ private:
 	bool Cmd_dt(int argc, const char **argv);
 	bool Cmd_getvar(int argc, const char **argv);
 	bool Cmd_setvar(int argc, const char **argv);
+	bool Cmd_enablePathfinderOverlay(int argc, const char **argv);
 	bool validateObjVarIndex(int16 varIdx);
 public:
 	DebugConsole(TosText *tostext);


Commit: 5d2fc927020807211265e85c0ed85002150cd9fb
    https://github.com/scummvm/scummvm/commit/5d2fc927020807211265e85c0ed85002150cd9fb
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Handle unreachable walk target

Changed paths:
    engines/darkseed/player.cpp


diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 8ff265fb969..893a0254cba 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -207,10 +207,25 @@ void Darkseed::Player::calculateWalkTarget() {
 		if (connector.x == -1 && connector.y == -1) {
 			return;
 		}
+		int connectorToTargetDist = Common::hypotenuse(connector.x - _walkTarget.x, connector.y - _walkTarget.y);
+		int playerToTargetDist = Common::hypotenuse(_position.x - _walkTarget.x, _position.y - _walkTarget.y);
+		if (connectorToTargetDist < playerToTargetDist) {
+			if(g_engine->_room->canWalkInLineToTarget(_position.x, _position.y, connector.x, connector.y)) {
+				_finalTarget = _walkTarget;
+				_walkTarget = connector;
+			} else {
+				Common::Point tmpDest = _walkTarget;
+				_walkTarget = connector;
+				if (numConnectorsInWalkPath > 0 && numConnectorsInWalkPath < Room::MAX_CONNECTORS - 1 && _connectorList[numConnectorsInWalkPath - 1] != connector) {
+					_connectorList[numConnectorsInWalkPath] = connector;
+					numConnectorsInWalkPath++;
+				}
+				_finalTarget = tmpDest;
+			}
+		}
 	} else {
 		createConnectorPathToDest();
 	}
-	// TODO more logic here.
 }
 
 int Darkseed::Player::getWidth() {


Commit: 3fd44bdcb5010dd3499ca163e7a7cb119efde725
    https://github.com/scummvm/scummvm/commit/3fd44bdcb5010dd3499ca163e7a7cb119efde725
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Adding more room exit animations.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/debugconsole.cpp
    engines/darkseed/debugconsole.h
    engines/darkseed/nsp.cpp
    engines/darkseed/room.cpp
    engines/darkseed/room.h
    engines/darkseed/sprites.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 3adca07f256..2f0f81d4d28 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -495,8 +495,51 @@ void DarkseedEngine::handleInput() {
 									bVar = false;
 									_console->printTosText(902);
 								}
-								// 2022:808a TODO
-//								if (currentRoomNumber == 0x3b)
+								if ((currentRoomNumber == 59 && _objectVar[190] < 2) ||
+									(currentRoomNumber == 61 && _objectVar[22] < 3 && roomExit.roomNumber == 13) ||
+									(currentRoomNumber == 7 && roomExit.roomNumber == 38 && _objectVar[137] == 0) ||
+									(currentRoomNumber == 46 && roomExit.roomNumber == 60 && _objectVar[57] == 1) ||
+									(currentRoomNumber == 7 && roomExit.roomNumber == 38 && _objectVar[57] == 1) ||
+									(currentRoomNumber == 13 && roomExit.roomNumber == 31 && _objectVar[23] != 1) ||
+									(currentRoomNumber == 2 && roomExit.roomNumber == 0 && _objectVar[78] != 2) ||
+									(currentRoomNumber == 0 && roomExit.roomNumber == 2 && _objectVar[78] != 2) ||
+									(currentRoomNumber == 32 && roomExit.roomNumber == 13 && _objectVar[23] != 1) ||
+									(currentRoomNumber == 13 && roomExit.roomNumber == 32 && _objectVar[23] != 1) ||
+									(currentRoomNumber == 39 && roomExit.roomNumber == 46 && _objectVar[117] == 0) ||
+									(currentRoomNumber == 3 && roomExit.roomNumber == 9 && _objectVar[59] != 2) ||
+									(currentRoomNumber == 9 && roomExit.roomNumber == 3 && _objectVar[59] != 2)) {
+									bVar = false;
+								}
+								if (_currentTimeInSeconds > 64800 &&
+									((currentRoomNumber == 11 && roomExit.roomNumber == 15) ||
+									 (currentRoomNumber == 11 && roomExit.roomNumber == 16) ||
+									 (currentRoomNumber == 12 && roomExit.roomNumber == 17))) {
+									bVar = false;
+									_console->printTosText(936);
+								}
+								if (currentRoomNumber == 7 && roomExit.roomNumber == 38 && bVar) {
+									_player->loadAnimations("mirror.nsp");
+									setupOtherNspAnimation(0,27);
+									return;
+								}
+								if ((currentRoomNumber == 41 && roomExit.roomNumber == 44 && bVar) ||
+									(currentRoomNumber == 44 && roomExit.roomNumber == 41 && bVar)) {
+									_player->loadAnimations("beamer.nsp");
+									setupOtherNspAnimation(0,57);
+									return;
+								}
+								if (currentRoomNumber == 10 && roomExit.roomNumber == 6 && bVar && !_player->_isAutoWalkingToBed) {
+									_player->loadAnimations("rm10strs.nsp");
+									setupOtherNspAnimation(0,53);
+									return;
+								}
+								if (currentRoomNumber == 38 && roomExit.roomNumber == 7 && bVar) {
+									_player->loadAnimations("darkin.nsp");
+									setupOtherNspAnimation(0,41);
+									return;
+								}
+								// 2022:82df TODO
+//
 								if (bVar) {
 									if (currentRoomNumber != 0x22 && (currentRoomNumber < 0x13 || currentRoomNumber > 0x17)) {
 										_player->_playerIsChangingDirection = false;
@@ -916,7 +959,45 @@ void DarkseedEngine::updateDisplay() {
 //										*(undefined2 *)((int)&otherNspSpritePtr[0].Offset + _player->_frameIdx * 4),
 //										0xf0 - playerSpriteY_maybe,iVar9,iVar8,_player_sprite_related_2c85_82f3);
 //						bVar6 = extraout_AH_03;
-					} // TODO continue adding logic here. else if (....
+					} else if (otherNspAnimationType_maybe == 43 || otherNspAnimationType_maybe == 44) {
+
+					} else if (otherNspAnimationType_maybe == 62) {
+
+					} else if (otherNspAnimationType_maybe == 45 || otherNspAnimationType_maybe == 46) {
+
+					} else if (otherNspAnimationType_maybe == 36) {
+
+					} else if (otherNspAnimationType_maybe == 59) {
+
+					} else if (otherNspAnimationType_maybe == 37) {
+
+					} else if (otherNspAnimationType_maybe == 10 || otherNspAnimationType_maybe == 11) {
+
+					} else if (otherNspAnimationType_maybe == 12 || otherNspAnimationType_maybe == 13) {
+
+					} else if (otherNspAnimationType_maybe == 20) {
+
+					} else if (otherNspAnimationType_maybe < 30 || otherNspAnimationType_maybe > 34) {
+						if (otherNspAnimationType_maybe == 40) {
+
+						} else if (otherNspAnimationType_maybe < 48 || otherNspAnimationType_maybe > 52) {
+							if (otherNspAnimationType_maybe == 35) {
+
+							} else if (otherNspAnimationType_maybe >= 53 && otherNspAnimationType_maybe <= 56) {
+
+							} else if (otherNspAnimationType_maybe == 57 || otherNspAnimationType_maybe == 58) {
+
+							} else {
+								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+							}
+						} else {
+							const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+							_sprites.addSpriteToDrawList(_player->_position.x - animSprite.width / 2, _player->_position.y - animSprite.height, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+						}
+					} else {
+						// 2022:5ae5
+					}
 				} else if (otherNspAnimationType_maybe == 6) {
 					// stairs up
 					_sprites.addSpriteToDrawList(
@@ -927,13 +1008,13 @@ void DarkseedEngine::updateDisplay() {
 						scaledSpriteWidth,
 						scaledSpriteHeight,
 						player_sprite_related_2c85_82f3);
-				} else if (otherNspAnimationType_maybe == 0x16) {
+				} else if (otherNspAnimationType_maybe == 22) {
 					// TODO
-				} else if (otherNspAnimationType_maybe == 4 || otherNspAnimationType_maybe == 0x15) {
+				} else if (otherNspAnimationType_maybe == 4 || otherNspAnimationType_maybe == 21) {
 					// TODO
-				} else if (otherNspAnimationType_maybe == 0x27) {
+				} else if (otherNspAnimationType_maybe == 39) {
 					// TODO
-				} else if (otherNspAnimationType_maybe == 0x2f) {
+				} else if (otherNspAnimationType_maybe == 47) {
 					// TODO
 				} else {
 					_sprites.addSpriteToDrawList(
@@ -979,6 +1060,23 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		nsp_sprite_scaling_y_position = 0xbe;
 		BoolEnum_2c85_985a = true;
 		break;
+	case 26 :
+		_player->_position.x = 324;
+		_player->_position.y = 135;
+		break;
+	case 27 :
+		_player->_position.x = 397;
+		_player->_position.y = 84;
+		break;
+	case 28 :
+		_player->_position.x = 397;
+		_player->_position.y = 77;
+		break;
+	case 41 :
+	case 42 :
+		_player->_position.x = 432;
+		_player->_position.y = 78;
+		break;
 	default:
 		break;
 	}
@@ -1048,6 +1146,24 @@ void DarkseedEngine::updateAnimation() {
 			}
 		}
 		break;
+	case 27:
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		} else {
+			_previousRoomNumber = _room->_roomNumber;
+			changeToRoom(38);
+		}
+		break;
+	case 41:
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		} else {
+			_previousRoomNumber = _room->_roomNumber;
+			changeToRoom(7);
+		}
+		break;
 	default:
 		error("Unhandled animation type! %d", otherNspAnimationType_maybe);
 	}
diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
index 1a0daff6d22..1d38a40fe72 100644
--- a/engines/darkseed/debugconsole.cpp
+++ b/engines/darkseed/debugconsole.cpp
@@ -30,6 +30,7 @@ DebugConsole::DebugConsole(TosText *tosText) : GUI::Debugger(), tosText(tosText)
 	registerCmd("getvar",   WRAP_METHOD(DebugConsole, Cmd_getvar));
 	registerCmd("setvar",   WRAP_METHOD(DebugConsole, Cmd_setvar));
 	registerCmd("enablePathfinderOverlay",   WRAP_METHOD(DebugConsole, Cmd_enablePathfinderOverlay));
+	registerCmd("info",   WRAP_METHOD(DebugConsole, Cmd_info));
 }
 
 DebugConsole::~DebugConsole() {
@@ -51,12 +52,7 @@ bool DebugConsole::Cmd_tostext(int argc, const char **argv) {
 }
 
 bool DebugConsole::Cmd_dt(int argc, const char **argv) {
-	int hour = g_engine->_currentTimeInSeconds / 60 / 60 + 1;
-	debugPrintf("Day %d at %d:%02d%s (%d seconds)\n",
-				g_engine->_currentDay,
-				hour % 12,
-				(g_engine->_currentTimeInSeconds / 60) % 60,
-				hour < 12 ? "AM" : "PM", g_engine->_currentTimeInSeconds);
+	printDayAndTime();
 	return true;
 }
 
@@ -115,4 +111,21 @@ bool DebugConsole::validateObjVarIndex(int16 varIdx) {
 	return true;
 }
 
+bool DebugConsole::Cmd_info(int argc, const char **argv) {
+	printDayAndTime();
+	debugPrintf("\nRoom info:\n");
+	debugPrintf("Room number: %d\n", g_engine->_room->_roomNumber);
+
+	return true;
+}
+
+void DebugConsole::printDayAndTime() {
+	int hour = g_engine->_currentTimeInSeconds / 60 / 60 + 1;
+	debugPrintf("Day %d at %d:%02d%s (%d seconds)\n",
+				g_engine->_currentDay,
+				hour % 12,
+				(g_engine->_currentTimeInSeconds / 60) % 60,
+				hour < 12 ? "AM" : "PM", g_engine->_currentTimeInSeconds);
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/debugconsole.h b/engines/darkseed/debugconsole.h
index 09bcdeceb3a..984c81552b7 100644
--- a/engines/darkseed/debugconsole.h
+++ b/engines/darkseed/debugconsole.h
@@ -37,7 +37,9 @@ private:
 	bool Cmd_getvar(int argc, const char **argv);
 	bool Cmd_setvar(int argc, const char **argv);
 	bool Cmd_enablePathfinderOverlay(int argc, const char **argv);
+	bool Cmd_info(int argc, const char **argv);
 	bool validateObjVarIndex(int16 varIdx);
+	void printDayAndTime();
 public:
 	DebugConsole(TosText *tostext);
 	~DebugConsole() override;
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index c29da56da97..93efcfafaae 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -93,7 +93,7 @@ void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destH
 		int xi = flipX ? xs : xs * clipX;
 		const byte *wsrc = hsrc + ((xi + 0x8000) >> 16);
 		for (int xc = 0; xc < destWidth; ++xc) {
-			if (currX >= 0 && currX < destSurface->w) {
+			if (currX >= 69 && currX < destSurface->w) { // clip to game window. TODO pass clip rect into method.
 				byte colorIndex = *wsrc;
 				//				uint16 c = READ_LE_UINT16(&palette[colorIndex * 2]);
 				if (colorIndex != 0xf) {
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 08cc1a82e96..66ac47330e7 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -692,3 +692,31 @@ int Darkseed::Room::getObjectUnderCursor() {
 	}
 	return objIdx;
 }
+
+bool Darkseed::Room::isOutside() {
+	bool isRoomOutside;
+
+	if (_roomNumber == 61) {
+		isRoomOutside = true;
+	}
+	else if (_roomNumber < 10 || _roomNumber > 14) {
+		if (_roomNumber < 24 || _roomNumber > 27) {
+			if (_roomNumber >= 63 && _roomNumber <= 65) {
+				isRoomOutside = true;
+			}
+			else if (_roomNumber == 31 || _roomNumber == 32 || _roomNumber == 36) {
+				isRoomOutside = true;
+			}
+			else {
+				isRoomOutside = false;
+			}
+		}
+		else {
+			isRoomOutside = true;
+		}
+	}
+	else {
+		isRoomOutside = true;
+	}
+	return isRoomOutside;
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index ca39ffc190e..7e68761212e 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -90,6 +90,7 @@ public:
 	bool canWalkInLineToTarget(int x,int y,int targetX,int targetY);
 	void printRoomDescriptionText() const;
 	void calculateScaledSpriteDimensions(int width, int height, int curYPosition);
+	bool isOutside();
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
index 5ac79f5a1fe..e22370fabe6 100644
--- a/engines/darkseed/sprites.cpp
+++ b/engines/darkseed/sprites.cpp
@@ -64,6 +64,10 @@ void Darkseed::Sprites::clearSpriteDrawList() {
 void Darkseed::Sprites::drawSprites() {
 	for (int i = spriteDrawList.size() - 1; i >= 0; i--) {
 		SpriteDrawInstruction &drawInstruction = spriteDrawList[i];
-		drawInstruction.sprite->drawScaled(drawInstruction.destX, drawInstruction.destY, drawInstruction.destW, drawInstruction.destH, drawInstruction.flip);
+		if (drawInstruction.sprite->width == drawInstruction.destW && drawInstruction.sprite->height == drawInstruction.destH) {
+			drawInstruction.sprite->draw(drawInstruction.destX, drawInstruction.destY); // TODO add support for flipping sprite.
+		} else {
+			drawInstruction.sprite->drawScaled(drawInstruction.destX, drawInstruction.destY, drawInstruction.destW, drawInstruction.destH, drawInstruction.flip);
+		}
 	}
 }


Commit: 699e7f58788674e320285513d9b166bdb02c90e0
    https://github.com/scummvm/scummvm/commit/699e7f58788674e320285513d9b166bdb02c90e0
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Finished adding room exit animations.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/debugconsole.cpp
    engines/darkseed/debugconsole.h
    engines/darkseed/nsp.cpp
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h
    engines/darkseed/sprites.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 2f0f81d4d28..c3bd634c465 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -538,8 +538,63 @@ void DarkseedEngine::handleInput() {
 									setupOtherNspAnimation(0,41);
 									return;
 								}
-								// 2022:82df TODO
-//
+								if (_objectVar[52] == 1 &&
+									((currentRoomNumber == 12 && roomExit.roomNumber == 17) || (currentRoomNumber == 11 && (roomExit.roomNumber == 15 || roomExit.roomNumber == 16)))
+									) {
+									_console->printTosText(437);
+									bVar = false;
+									// TODO the original sets roomExit to number 8 here.
+								} else if (currentRoomNumber == 11 && roomExit.roomNumber == 15 && bVar) {
+									_player->loadAnimations("rm11strs.nsp");
+									setupOtherNspAnimation(0,55);
+									return;
+								}
+								if (currentRoomNumber == 14 && roomExit.roomNumber == 35 && _objectVar[99] != 1) {
+									bVar = false;
+									_console->printTosText(937);
+								}
+								if (bVar && (
+												(currentRoomNumber == 6 && roomExit.roomNumber == 10) ||
+												(currentRoomNumber == 11 && roomExit.roomNumber == 16) ||
+												(currentRoomNumber == 12 && roomExit.roomNumber == 17)
+												)
+									) {
+									_player->loadAnimations("opendoor.nsp");
+									setupOtherNspAnimation(0,14);
+									// FUN_1208_0dac_sound_related(10,CONCAT11(extraout_AH,5));
+									return;
+								}
+								if (currentRoomNumber == 6 && roomExit.roomNumber == 5 && bVar) {
+									_player->_position.x = 346;
+									_player->_position.y = 176;
+									_player->loadAnimations("stairs.nsp");
+									setupOtherNspAnimation(1,6);
+									return;
+								}
+								if (currentRoomNumber == 33 && roomExit.roomNumber == 34 && bVar) {
+									_player->loadAnimations("opendoor.nsp");
+									setupOtherNspAnimation(0,25);
+									// FUN_1208_0dac_sound_related(24,CONCAT11(extraout_AH,5));
+									return;
+								}
+								if (currentRoomNumber == 5 && roomExit.roomNumber == 6 && bVar) {
+									if (_player->_position.x == 466 && _player->_position.y == 195) {
+										_player->loadAnimations("stairs.nsp");
+										_player->_position.x -= 35;
+										setupOtherNspAnimation(3,7);
+										return;
+									}
+									bVar = false;
+								}
+								if (currentRoomNumber == 40 && roomExit.roomNumber == 41 && _objectVar[59] != 2) {
+									_console->printTosText(775);
+									bVar = false;
+								}
+								if (currentRoomNumber == 44 && roomExit.roomNumber == 43 && _objectVar[78] != 2) {
+									_console->printTosText(775);
+									bVar = false;
+								}
+
 								if (bVar) {
 									if (currentRoomNumber != 0x22 && (currentRoomNumber < 0x13 || currentRoomNumber > 0x17)) {
 										_player->_playerIsChangingDirection = false;
@@ -815,6 +870,20 @@ void DarkseedEngine::changeToRoom(int newRoomNumber) {
 	_room->printRoomDescriptionText();
 }
 
+void DarkseedEngine::debugTeleportToRoom(int newRoomNumber, int entranceNumber) {
+	delete _room;
+	_room = new Room(newRoomNumber);
+
+	if (entranceNumber < _room->room1.size()) {
+		const RoomExit &roomExit = _room->room1[entranceNumber];
+		_player->_position.x = roomExit.x + roomExit.width / 2;
+		_player->_position.y = roomExit.y;
+		_player->_direction = roomExit.direction ^ 2;
+		_player->updatePlayerPositionAfterRoomChange();
+		_player->_walkTarget = _player->_position;
+	}
+}
+
 void DarkseedEngine::updateDisplay() {
 	int currentRoomNumber = _room->_roomNumber;
 	_sprites.clearSpriteDrawList();
@@ -929,7 +998,7 @@ void DarkseedEngine::updateDisplay() {
 //									*(undefined2 *)((int)&otherNspSpritePtr[0].Offset + _player->_frameIdx * 4),
 //									0xf0 - playerSpriteY_maybe,uVar1,uVar2,uVar3 & 0xff00);
 //					bVar6 = extraout_AH_01;
-				} else if (!BoolEnum_2c85_985a) {
+				} else if (!_scaleSequence) {
 					if (otherNspAnimationType_maybe == 0x11) {
 //						addSpriteToDraw(playerSpriteX_maybe - (int)otherNspWidthTbl[0] / 2,playerSpriteY_maybe - iVar8,iVar9,iVa r8,
 //										*(undefined2 *)((int)otherNspSpritePtr + _player->_frameIdx * 4),
@@ -984,7 +1053,8 @@ void DarkseedEngine::updateDisplay() {
 							if (otherNspAnimationType_maybe == 35) {
 
 							} else if (otherNspAnimationType_maybe >= 53 && otherNspAnimationType_maybe <= 56) {
-
+								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 							} else if (otherNspAnimationType_maybe == 57 || otherNspAnimationType_maybe == 58) {
 
 							} else {
@@ -1026,6 +1096,26 @@ void DarkseedEngine::updateDisplay() {
 						scaledSpriteHeight,
 						player_sprite_related_2c85_82f3);
 				}
+				if (isPlayingAnimation_maybe && otherNspAnimationType_maybe == 14 && animIndexTbl[0] > 1) {
+					if (_objectVar.getObjectRunningCode(140) == 0 || _room->_roomNumber != 6) {
+						if (_room->_roomNumber == 6 && _player->_isAutoWalkingToBed) {
+							const Sprite &animSprite = _player->_animations.getSpriteAt(8);
+							_sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+						} else if (_room->_roomNumber == 6) {
+							const Sprite &animSprite = _player->_animations.getSpriteAt(2);
+							_sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+						} else if (_room->_roomNumber == 11) {
+							const Sprite &animSprite = _player->_animations.getSpriteAt(6);
+							_sprites.addSpriteToDrawList(369, 119, &animSprite, 255, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+						} else if (_room->_roomNumber == 12) {
+							const Sprite &animSprite = _player->_animations.getSpriteAt(6);
+							_sprites.addSpriteToDrawList(252, 121, &animSprite, 255, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+						}
+					} else {
+						const Sprite &animSprite = _player->_animations.getSpriteAt(3);
+						_sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+					}
+				}
 			}
 		}
 	}
@@ -1035,7 +1125,7 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 	assert(nspAnimIdx < 20);
 	_player->_playerIsChangingDirection = false;
 	nsp_sprite_scaling_y_position = 0;
-	BoolEnum_2c85_985a = false;
+	_scaleSequence = false;
 
 	animIndexTbl[nspAnimIdx] = 0;
 	spriteAnimCountdownTimer[nspAnimIdx] = _player->_animations.getAnimAt(nspAnimIdx).frameDuration[0];
@@ -1052,13 +1142,44 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 
 	// TODO big switch here to init the different animation types.
 	switch (otherNspAnimationType_maybe) {
+	case 2:
+		_player->_position.x = 188;
+		_player->_position.y = 94;
+		break;
+	case 3:
+		// TODO
+//		if ((_SoundDevice != '\x01') && ((char)_day == '\x03')) {
+//			LoadModeSong(7);
+//			PlaySound(0,6,-1);
+//		}
+		_scaleSequence = 1;
+		break;
+	case 4:
+	case 14:
+	case 15:
+	case 18:
+	case 21:
+	case 22:
+	case 24:
+	case 25:
+	case 65:
+		_scaleSequence = 1;
+		break;
 	case 6 : // stairs
 		nsp_sprite_scaling_y_position = 0xbe;
-		BoolEnum_2c85_985a = true;
+		_scaleSequence = true;
 		break;
 	case 7 : // stairs down
 		nsp_sprite_scaling_y_position = 0xbe;
-		BoolEnum_2c85_985a = true;
+		_scaleSequence = true;
+		break;
+	case 8 :
+		_player->_position.x = 249;
+		_player->_position.y = 92;
+		break;
+	case 16 :
+		_player->_position.x = 324;
+		_player->_position.y = 50;
 		break;
 	case 26 :
 		_player->_position.x = 324;
@@ -1077,6 +1198,19 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		_player->_position.x = 432;
 		_player->_position.y = 78;
 		break;
+	case 53 :
+	case 54 :
+		_player->_position.x = 308;
+		_player->_position.y = 160;
+		break;
+	case 55 :
+		_player->_position.x = 150;
+		_player->_position.y = 104;
+		break;
+	case 56 :
+		_player->_position.x = 142;
+		_player->_position.y = 104;
+		break;
 	default:
 		break;
 	}
@@ -1146,6 +1280,48 @@ void DarkseedEngine::updateAnimation() {
 			}
 		}
 		break;
+	case 14:
+	case 15:
+	case 24:
+	case 25:
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		} else {
+			_player->updateSprite();
+			if (otherNspAnimationType_maybe == 14) {
+				// TODO
+				if (_objectVar.getObjectRunningCode(140) == 0 || _room->_roomNumber != 6) {
+					_previousRoomNumber = _room->_roomNumber;
+					int newRoomNumber = _previousRoomNumber;
+					if (_room->_roomNumber == 6) {
+						if (_player->_isAutoWalkingToBed && _objectVar[137] == 2) {
+							 wongame();
+						}
+						newRoomNumber = 10;
+					} else if (_room->_roomNumber == 10) {
+						newRoomNumber = 6;
+					} else if (_room->_roomNumber == 11) {
+						if (_player->_position.x < 250) {
+							newRoomNumber = 15;
+						} else {
+							newRoomNumber = 16;
+						}
+					} else {
+						newRoomNumber = 17;
+					}
+					changeToRoom(newRoomNumber);
+				} else {
+					_objectVar.setObjectRunningCode(140, 0);
+					getPackage(_currentDay);
+				}
+			}
+			if (otherNspAnimationType_maybe == 25) {
+				_previousRoomNumber = 33;
+				changeToRoom(34);
+			}
+		}
+		break;
 	case 27:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -1164,13 +1340,51 @@ void DarkseedEngine::updateAnimation() {
 			changeToRoom(7);
 		}
 		break;
+	case 53 :
+	case 54 :
+	case 55 :
+	case 56 :
+		advanceAnimationFrame((otherNspAnimationType_maybe - 53) & 1);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		} else {
+			switch (otherNspAnimationType_maybe) {
+			case 53 :
+				_previousRoomNumber = _room->_roomNumber;
+				changeToRoom(6);
+				break;
+			case 54 :
+				_player->_position.x = 322;
+				_player->_position.y = 220;
+				_player->_walkTarget = _player->_position;
+				_player->_direction = 2;
+				_player->updateSprite();
+				break;
+			case 55 :
+				_previousRoomNumber = _room->_roomNumber;
+				changeToRoom(15);
+				break;
+			case 56 :
+				_player->_position.x = 162;
+				_player->_position.y = 206;
+				_player->_walkTarget = _player->_position;
+				_player->_direction = 2;
+				_player->updateSprite();
+				break;
+			}
+		}
+		if (animFrameChanged && animIndexTbl[0] == 1) {
+			// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
+			// PlaySound(1,5,-1);
+		}
+		break;
 	default:
 		error("Unhandled animation type! %d", otherNspAnimationType_maybe);
 	}
 }
 
 void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
-	if (!BoolEnum_2c85_985a) {
+	if (!_scaleSequence) {
 		scaledWalkSpeed_maybe = 1000;
 	}
 	else {
@@ -1251,4 +1465,13 @@ void DarkseedEngine::eyeCode(int objNum) {
 	}
 }
 
+void DarkseedEngine::wongame() {
+	// TODO
+}
+
+void DarkseedEngine::getPackage(int state) {
+	_console->printTosText(424);
+	// TODO handle different getPackage states.
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index f0d3ed2ed55..d3215197948 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -113,7 +113,7 @@ public:
 	bool _doorEnabled = false;
 	uint16 DAT_2c85_825c = 0;
 	uint16 DAT_2c85_819c = 0;
-	bool BoolEnum_2c85_985a = false;
+	bool _scaleSequence = false;
 	bool useDoorTarget = false;
 
 	uint16 DAT_2c85_81e0 = 0;
@@ -184,6 +184,7 @@ public:
 
 	void updateDisplay();
 	void setupOtherNspAnimation(int nspAnimIdx, int animId);
+	void debugTeleportToRoom(int newRoomNumber, int entranceNumber);
 
 private:
 	void updateAnimation();
@@ -198,6 +199,8 @@ private:
 	void handleObjCollision(int objNum);
 
 	void eyeCode(int objNum);
+	void wongame();
+	void getPackage(int state);
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
index 1d38a40fe72..6472c0ce269 100644
--- a/engines/darkseed/debugconsole.cpp
+++ b/engines/darkseed/debugconsole.cpp
@@ -31,6 +31,7 @@ DebugConsole::DebugConsole(TosText *tosText) : GUI::Debugger(), tosText(tosText)
 	registerCmd("setvar",   WRAP_METHOD(DebugConsole, Cmd_setvar));
 	registerCmd("enablePathfinderOverlay",   WRAP_METHOD(DebugConsole, Cmd_enablePathfinderOverlay));
 	registerCmd("info",   WRAP_METHOD(DebugConsole, Cmd_info));
+	registerCmd("gotoRoom",   WRAP_METHOD(DebugConsole, Cmd_gotoRoom));
 }
 
 DebugConsole::~DebugConsole() {
@@ -119,6 +120,22 @@ bool DebugConsole::Cmd_info(int argc, const char **argv) {
 	return true;
 }
 
+bool DebugConsole::Cmd_gotoRoom(int argc, const char **argv) {
+	if (argc < 2 || argc > 3) {
+		debugPrintf("Usage: gotoRoom <roomNumber> <entranceNumber>\n");
+		return true;
+	}
+
+	int16 roomNumber = (int16)atoi(argv[1]);
+	int entranceNumber = 0;
+	if (argc == 3) {
+		entranceNumber = (int16)atoi(argv[2]);
+	}
+
+	g_engine->debugTeleportToRoom(roomNumber, entranceNumber);
+	return true;
+}
+
 void DebugConsole::printDayAndTime() {
 	int hour = g_engine->_currentTimeInSeconds / 60 / 60 + 1;
 	debugPrintf("Day %d at %d:%02d%s (%d seconds)\n",
diff --git a/engines/darkseed/debugconsole.h b/engines/darkseed/debugconsole.h
index 984c81552b7..49157c4fa8a 100644
--- a/engines/darkseed/debugconsole.h
+++ b/engines/darkseed/debugconsole.h
@@ -38,6 +38,7 @@ private:
 	bool Cmd_setvar(int argc, const char **argv);
 	bool Cmd_enablePathfinderOverlay(int argc, const char **argv);
 	bool Cmd_info(int argc, const char **argv);
+	bool Cmd_gotoRoom(int argc, const char **argv);
 	bool validateObjVarIndex(int16 varIdx);
 	void printDayAndTime();
 public:
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index 93efcfafaae..f154e29bf61 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -57,6 +57,7 @@ void Darkseed::Sprite::draw(int x, int y) const {
 }
 
 void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destHeight, bool flipX) const {
+	//TODO image isn't exactly the same when not scaling. It seems larger by about a pixel.
 	//TODO this logic is pretty messy. It should probably be re-written. It is trying to scale, clip and flip at once.
 	Graphics::ManagedSurface * destSurface = g_engine->_screen;
 	// Based on the GNAP engine scaling code
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index 35273bc31e4..df264eb5600 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -143,3 +143,17 @@ int Darkseed::Objects::getMoveObjectRoom(uint16 idx) {
 	}
 	return _moveObjectRoom[idx];
 }
+
+int16 Darkseed::Objects::getObjectRunningCode(int idx) {
+	if (idx >= MAX_OBJECTS) {
+		error("getObjectRunningCode: index out of range.");
+	}
+	return _objectRunningCode[idx];
+}
+
+void Darkseed::Objects::setObjectRunningCode(int idx, int16 value) {
+	if (idx >= MAX_OBJECTS) {
+		error("setObjectRunningCode: index out of range.");
+	}
+	_objectRunningCode[idx] = value;
+}
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 608e8f7ec29..be2319539b6 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -42,6 +42,9 @@ public:
 	void setVar(uint16 varIdx, int16 newValue);
 	int16 getVar(uint16 varIdx);
 
+	int16 getObjectRunningCode(int idx);
+	void setObjectRunningCode(int idx, int16 value);
+
 	Common::Point getMoveObjectPosition(uint8 objIdx);
 	int getEyeDescriptionTosIdx(uint16 objNum);
 
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
index e22370fabe6..781a9e80111 100644
--- a/engines/darkseed/sprites.cpp
+++ b/engines/darkseed/sprites.cpp
@@ -64,7 +64,7 @@ void Darkseed::Sprites::clearSpriteDrawList() {
 void Darkseed::Sprites::drawSprites() {
 	for (int i = spriteDrawList.size() - 1; i >= 0; i--) {
 		SpriteDrawInstruction &drawInstruction = spriteDrawList[i];
-		if (drawInstruction.sprite->width == drawInstruction.destW && drawInstruction.sprite->height == drawInstruction.destH) {
+		if (drawInstruction.sprite->width == drawInstruction.destW && drawInstruction.sprite->height == drawInstruction.destH && !drawInstruction.flip) {
 			drawInstruction.sprite->draw(drawInstruction.destX, drawInstruction.destY); // TODO add support for flipping sprite.
 		} else {
 			drawInstruction.sprite->drawScaled(drawInstruction.destX, drawInstruction.destY, drawInstruction.destW, drawInstruction.destH, drawInstruction.flip);


Commit: 19650c0f5a778538217d006fc668fba8714db195
    https://github.com/scummvm/scummvm/commit/19650c0f5a778538217d006fc668fba8714db195
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: More animations added.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/nsp.cpp
    engines/darkseed/objects.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h
    engines/darkseed/sprites.cpp
    engines/darkseed/sprites.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index c3bd634c465..d3cb803d9f0 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -884,36 +884,33 @@ void DarkseedEngine::debugTeleportToRoom(int newRoomNumber, int entranceNumber)
 	}
 }
 
-void DarkseedEngine::updateDisplay() {
+void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 	int currentRoomNumber = _room->_roomNumber;
 	_sprites.clearSpriteDrawList();
-//	FUN_2022_2ca7();
+	_room->runRoomObjects();
 //	FUN_2022_413a();
 	if (isPlayingAnimation_maybe == 0 ||
 		(otherNspAnimationType_maybe != 6 && otherNspAnimationType_maybe != 7) || currentRoomNumber != 5) {
-		DAT_2c85_8326_blit_related = 0xf0;
+		_frameBottom = 0xf0;
 	}
 	else {
-		DAT_2c85_8326_blit_related = 0xd0;
+		_frameBottom = 0xd0;
 	}
 
 	if (currentRoomNumber != 0x22 && currentRoomNumber != 0x13 &&
 		  currentRoomNumber != 0x14 && currentRoomNumber != 0x15 && currentRoomNumber != 0x16 &&
-		 DAT_2c85_825c != 9 && (currentRoomNumber != 0x35 || DAT_2c85_819c != 2)) {
-		if (((otherNspAnimationType_maybe == 0x3c) || (otherNspAnimationType_maybe == 0x3d)) &&
+		 _objectVar[141] != 9 && (currentRoomNumber != 0x35 || _objectVar[45] != 2)) {
+		if (((otherNspAnimationType_maybe == 60) || (otherNspAnimationType_maybe == 61)) &&
 			isPlayingAnimation_maybe) {
-//			uVar7 = *(undefined2 *)((int)nspWidthTbl + _player->_frameIdx * 2);
-//			uVar1 = *(uint *)((int)nspHeightTbl + _player->_frameIdx * 2);
-//			addSpriteToDraw(0x1af,0x42,uVar7,uVar1,*(undefined2 *)((int)nspPixelPtrTbl + _player->_frameIdx * 4),
-//							*(undefined2 *)((int)&nspPixelPtrTbl[0].Offset + _player->_frameIdx * 4),0xff,uVar7,uVar1,
-//							uVar1 & 0xff00);
+			const Sprite &sprite = _room->_locationSprites.getSpriteAt(_player->_frameIdx);
+			_sprites.addSpriteToDrawList(431, 66, &sprite, 255, sprite.width, sprite.height, false);
 		}
-		if (!isWearingHeadBand || (headAcheMessageCounter & 1) != 0) {
-			if (!isPlayingAnimation_maybe || otherNspAnimationType_maybe == 0x13
-				|| otherNspAnimationType_maybe == 0x17) {
+		if (_objectVar[OBJ_21_HEADBAND] == 0 || (headAcheMessageCounter & 1) != 0) {
+			if (!isPlayingAnimation_maybe || otherNspAnimationType_maybe == 19
+				|| otherNspAnimationType_maybe == 23) {
 				const Sprite &playerSprite = _player->getSprite(_player->_frameIdx);
 				_room->calculateScaledSpriteDimensions(playerSprite.width, playerSprite.height, _player->_position.y);
-				if ((currentRoomNumber != 0x35) || (DAT_2c85_81e0 != 2)) {
+				if ((currentRoomNumber != 53) || (_objectVar[79] != 2)) {
 					_sprites.addSpriteToDrawList(
 						_player->_position.x - (scaledSpriteWidth / 2),
 						_player->_position.y - scaledSpriteHeight,
@@ -923,7 +920,7 @@ void DarkseedEngine::updateDisplay() {
 						scaledSpriteHeight, player_sprite_related_2c85_82f3);
 				}
 			} else {
-				if (otherNspAnimationType_maybe == 0x25) {
+				if (otherNspAnimationType_maybe == 37) {
 //					uVar1 = (uint)BYTE_ARRAY_2c85_41e7[1];
 //					uVar7 = *(undefined2 *)((int)CPlayerSpriteWidthTbl + uVar1 * 2);
 //					uVar4 = *(undefined2 *)((int)CPlayerSpriteHeightTbl + uVar1 * 2);
@@ -1024,10 +1021,6 @@ void DarkseedEngine::updateDisplay() {
 						/* bed wake sequence is played here. */
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(x, y, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-//						addSpriteToDraw(x,y,iVar9,iVar8,*(undefined2 *)((int)otherNspSpritePtr + _player->_frameIdx *  4),
-//										*(undefined2 *)((int)&otherNspSpritePtr[0].Offset + _player->_frameIdx * 4),
-//										0xf0 - playerSpriteY_maybe,iVar9,iVar8,_player_sprite_related_2c85_82f3);
-//						bVar6 = extraout_AH_03;
 					} else if (otherNspAnimationType_maybe == 43 || otherNspAnimationType_maybe == 44) {
 
 					} else if (otherNspAnimationType_maybe == 62) {
@@ -1056,7 +1049,12 @@ void DarkseedEngine::updateDisplay() {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 							} else if (otherNspAnimationType_maybe == 57 || otherNspAnimationType_maybe == 58) {
-
+								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+								Common::Point spritePos = {344,57};
+								if (_room->_roomNumber == 41) {
+									spritePos = {295,46};
+								}
+								_sprites.addSpriteToDrawList(spritePos.x, spritePos.y, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 							} else {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
@@ -1211,6 +1209,10 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		_player->_position.x = 142;
 		_player->_position.y = 104;
 		break;
+	case 57:
+	case 58:
+//		PlaySound(48,5,-1);
+		break;
 	default:
 		break;
 	}
@@ -1284,6 +1286,7 @@ void DarkseedEngine::updateAnimation() {
 	case 15:
 	case 24:
 	case 25:
+		// Open doors
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
@@ -1378,6 +1381,16 @@ void DarkseedEngine::updateAnimation() {
 			// PlaySound(1,5,-1);
 		}
 		break;
+	case 57:
+	case 58:
+		advanceAnimationFrame((otherNspAnimationType_maybe - 57) & 1);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		} else if (otherNspAnimationType_maybe == 57) {
+			changeToRoom(_room->_roomNumber == 41 ? 44 : 41);
+		} else {
+			_player->_direction = 2;
+		}
 	default:
 		error("Unhandled animation type! %d", otherNspAnimationType_maybe);
 	}
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index d3215197948..394a0757014 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -90,7 +90,6 @@ public:
 
 	bool isPlayingAnimation_maybe = false;
 	uint16 otherNspAnimationType_maybe = 0;
-	bool isWearingHeadBand = false;
 	uint16 headAcheMessageCounter = 0;
 	uint16 trunkPushCounter = 0;
 
@@ -102,7 +101,7 @@ public:
 	int nsp_sprite_scaling_y_position = 0;
 
 	bool player_sprite_related_2c85_82f3 = false;
-	int DAT_2c85_8326_blit_related = 0;
+	int _frameBottom = 0;
 	bool isAnimFinished_maybe = false;
 	bool animFrameChanged = false;
 	char prefsCutsceneId = 'I';
@@ -111,13 +110,9 @@ public:
 
 	// Unknown variables
 	bool _doorEnabled = false;
-	uint16 DAT_2c85_825c = 0;
-	uint16 DAT_2c85_819c = 0;
 	bool _scaleSequence = false;
 	bool useDoorTarget = false;
 
-	uint16 DAT_2c85_81e0 = 0;
-
 	int16 counter_2c85_888b = 0;
 
 	uint8 targetPlayerDirection = 0; // related to changing rooms.
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index f154e29bf61..1019a9d99b2 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -154,6 +154,9 @@ bool Darkseed::Nsp::load(Common::SeekableReadStream &readStream) {
 }
 
 const Darkseed::Sprite &Darkseed::Nsp::getSpriteAt(int index) {
+	if (index >= frames.size()) {
+		error("getSpriteAt: Invalid sprite index. %d", index);
+	}
 	return frames[index];
 }
 
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index be2319539b6..5d91648d986 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -26,6 +26,10 @@
 #include "common/rect.h"
 namespace Darkseed {
 
+enum ObjType {
+	OBJ_21_HEADBAND = 21
+};
+
 class Objects {
 private:
 	Common::Array<int16> _objectVar;
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 66ac47330e7..ce17732a729 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -326,9 +326,10 @@ void Darkseed::Room::update() {
 		}
 
 		int objectUnderCursor = checkCursorAndStaticObjects(g_engine->_cursor.getX(), g_engine->_cursor.getY());
-		if ((objectUnderCursor == -1 || _roomObj[objectUnderCursor].objNum > 5 || _roomObj[objectUnderCursor].type != 0) &&
+		if (objectUnderCursor == -1 ||
+			((_roomObj[objectUnderCursor].objNum > 5 || _roomObj[objectUnderCursor].type != 0) &&
 			(g_engine->_objectVar[59] != 2 || _roomObj[objectUnderCursor].objNum != 59) &&
-			(g_engine->_objectVar[78] != 2 || _roomObj[objectUnderCursor].objNum != 78)
+			(g_engine->_objectVar[78] != 2 || _roomObj[objectUnderCursor].objNum != 78))
 			) {
 			g_engine->_cursor.setCursorType(Pointer);
 		} else {
@@ -720,3 +721,21 @@ bool Darkseed::Room::isOutside() {
 	}
 	return isRoomOutside;
 }
+
+void Darkseed::Room::runRoomObjects() {
+	if (_roomNumber == 0 && g_engine->_objectVar[78] == 2) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(0);
+		g_engine->_sprites.addSpriteToDrawList(519, 80, &sprite, 255, sprite.width, sprite.height, false);
+	}
+	if (_roomNumber == 0 && g_engine->isPlayingAnimation_maybe) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(1);
+		g_engine->_sprites.addSpriteToDrawList(111, 136, &sprite, 255, sprite.width, sprite.height, false);
+	}
+	if (_roomNumber == 2 && g_engine->_player->_isAutoWalkingToBed && g_engine->_player->_position.x < 150) {
+			g_engine->_objectVar[78] = 2; // open door for player.
+	}
+	if (_roomNumber == 2 && g_engine->_objectVar[78] == 2) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(0);
+		g_engine->_sprites.addSpriteToDrawList(69, 104, &sprite, 255, sprite.width, sprite.height, false);
+	}
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index 7e68761212e..44a8544fbe0 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -91,6 +91,7 @@ public:
 	void printRoomDescriptionText() const;
 	void calculateScaledSpriteDimensions(int width, int height, int curYPosition);
 	bool isOutside();
+	void runRoomObjects();
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
index 781a9e80111..d45ca1c5d9b 100644
--- a/engines/darkseed/sprites.cpp
+++ b/engines/darkseed/sprites.cpp
@@ -27,7 +27,7 @@ Darkseed::Sprites::Sprites() {
 	spriteDrawList.reserve(DARKSEED_MAX_SPRITES_ON_SCREEN);
 }
 
-void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Darkseed::Sprite *sprite, uint8 order, uint8 destW, uint8 destH, bool unk10) {
+void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Darkseed::Sprite *sprite, uint8 order, uint8 destW, uint8 destH, bool flip) {
 	if (spriteDrawList.size() == DARKSEED_MAX_SPRITES_ON_SCREEN || destX >= 570) {
 		return;
 	}
@@ -39,7 +39,7 @@ void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Da
 	drawInstruction.order = order;
 	drawInstruction.destW = destW;
 	drawInstruction.destH = destH;
-	drawInstruction.flip = unk10;
+	drawInstruction.flip = flip;
 
 	if (!spriteDrawList.empty()) {
 		int insertLocation = 0;
diff --git a/engines/darkseed/sprites.h b/engines/darkseed/sprites.h
index b57392cdf57..a6e16287b80 100644
--- a/engines/darkseed/sprites.h
+++ b/engines/darkseed/sprites.h
@@ -44,7 +44,7 @@ private:
 	Common::Array<SpriteDrawInstruction> spriteDrawList;
 public:
 	Sprites();
-	void addSpriteToDrawList(uint16 destX, uint16 destY, const Sprite *sprite, uint8 order, uint8 destW, uint8 destH, bool unk10);
+	void addSpriteToDrawList(uint16 destX, uint16 destY, const Sprite *sprite, uint8 order, uint8 destW, uint8 destH, bool flip);
 	void clearSpriteDrawList();
 
 	void drawSprites();


Commit: 98fe3b9753a583f6e560ff63dd536d84ac7161c7
    https://github.com/scummvm/scummvm/commit/98fe3b9753a583f6e560ff63dd536d84ac7161c7
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Climb ladder to attic.

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index d3cb803d9f0..c0a83587e50 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1034,7 +1034,8 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 					} else if (otherNspAnimationType_maybe == 37) {
 
 					} else if (otherNspAnimationType_maybe == 10 || otherNspAnimationType_maybe == 11) {
-
+						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+						_sprites.addSpriteToDrawList(118, 62, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe == 12 || otherNspAnimationType_maybe == 13) {
 
 					} else if (otherNspAnimationType_maybe == 20) {
@@ -1282,6 +1283,15 @@ void DarkseedEngine::updateAnimation() {
 			}
 		}
 		break;
+	case 10:
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		} else {
+			_previousRoomNumber = _room->_roomNumber;
+			changeToRoom(61);
+		}
+		break;
 	case 14:
 	case 15:
 	case 24:
@@ -1449,9 +1459,10 @@ void DarkseedEngine::handleObjCollision(int objNum) {
 		} else {
 			switch (_actionMode) {
 			case HandAction:
+				useCode(objNum);
 				break;
 			case LookAction:
-				eyeCode(objNum);
+				lookCode(objNum);
 				break;
 			// TODO lots of extra switch cases here for inventory usages.
 			default:
@@ -1464,7 +1475,16 @@ void DarkseedEngine::handleObjCollision(int objNum) {
 	}
 }
 
-void DarkseedEngine::eyeCode(int objNum) {
+void DarkseedEngine::useCode(int objNum) {
+	debug("useCode: objNum = %d", objNum);
+
+	if (objNum == 139) {
+		_player->loadAnimations("ltladder.nsp");
+		setupOtherNspAnimation(0,10);
+	}
+}
+
+void DarkseedEngine::lookCode(int objNum) {
 	// TODO lots of custom eye code here.
 	if (_cursor.getY() > 39 && objNum != 77) {
 		int eyeTosIdx = _objectVar.getEyeDescriptionTosIdx(objNum);
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 394a0757014..ea9055c606c 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -193,7 +193,8 @@ private:
 	void changeToRoom(int newRoomNumber);
 	void handleObjCollision(int objNum);
 
-	void eyeCode(int objNum);
+	void lookCode(int objNum);
+	void useCode(int objNum);
 	void wongame();
 	void getPackage(int state);
 };


Commit: 0a5a2ef7a8b85a3ed12d0d9951bf403a8c34d69c
    https://github.com/scummvm/scummvm/commit/0a5a2ef7a8b85a3ed12d0d9951bf403a8c34d69c
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added more look code.

Changed paths:
    engines/darkseed/console.cpp
    engines/darkseed/console.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/inventory.cpp
    engines/darkseed/inventory.h
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index 555611981d7..00b78886382 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -35,12 +35,22 @@ void Console::printTosText(int tosIndex) {
 	const Common::String &text = _tosText->getText(tosIndex);
 	debug(text.c_str());
 	addLine(" ");
+	addTextLine(text);
+}
+
+void Console::addTextLine(const Common::String &text) {
 	auto lines = wrapText(text);
 	for (auto &line : lines) {
 		addLine(line);
 	}
 }
 
+void Console::addToCurrentLine(const Common::String &text) {
+	int curIdx = _startIdx == 0 ? _text.size() - 1 : _startIdx - 1;
+	_startIdx = curIdx;
+	addTextLine(_text[_startIdx] + text);
+}
+
 void Console::draw() {
 	int curIdx = _startIdx == 0 ? _text.size() - 1 : _startIdx - 1;
 	int y = 0x139;
@@ -58,7 +68,9 @@ Common::Array<Common::String> Console::wrapText(const Common::String &text) {
 	int lineLength = 0;
 
 	for (int i = 0; i < text.size(); i++) {
-		word += text[i];
+		if (text[i] != '\r') {
+			word += text[i];
+		}
 		if (text[i] == ' ' || text[i] == '\r') {
 			int wordLength = _font.stringLength(word);
 			if (lineLength + wordLength > 0x1a0) {
diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
index f8b114fcd4b..dd44d8d9957 100644
--- a/engines/darkseed/console.h
+++ b/engines/darkseed/console.h
@@ -41,6 +41,8 @@ public:
 	Console(TosText *tostext);
 
 	void printTosText(int tosIndex);
+	void addTextLine(const Common::String &text);
+	void addToCurrentLine(const Common::String &text);
 
 	void draw();
 
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index c0a83587e50..b830f87e25d 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -182,6 +182,14 @@ void DarkseedEngine::fadeInner(int startValue, int endValue, int increment) {
 void DarkseedEngine::gameloop() {
 	while (!shouldQuit()) {
 		updateEvents();
+		if (_fullscreenPic) {
+			if (_isLeftMouseClicked || _isRightMouseClicked) {
+				_isRightMouseClicked = false;
+				_isLeftMouseClicked = false;
+				delete _fullscreenPic;
+				_fullscreenPic = nullptr;
+			}
+		}
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
 		if (systemTimerCounter == 5) {
 			handleInput();
@@ -191,11 +199,15 @@ void DarkseedEngine::gameloop() {
 		}
 		_room->update();
 		_frame.draw();
-		_room->draw();
-		_sprites.drawSprites();
-		_player->draw();
-		_console->draw();
-		_cursor.draw();
+		if (_fullscreenPic) {
+			_fullscreenPic->draw(0x45, 0x28);
+		} else {
+			_room->draw();
+			_sprites.drawSprites();
+			_player->draw();
+			_console->draw();
+			_cursor.draw();
+		}
 		_screen->makeAllDirty();
 		_screen->update();
 		wait();
@@ -838,6 +850,16 @@ void DarkseedEngine::handlePointerAction() {
 void DarkseedEngine::changeToRoom(int newRoomNumber) {
 	delete _room;
 	_room = new Room(newRoomNumber);
+	// TODO more logic here.
+	if (_room->_roomNumber == 54) {
+		_objectVar[21] = 0;
+	}
+	if ((_room->_roomNumber == 9 && _previousRoomNumber == 3) || (_room->_roomNumber == 3 && _previousRoomNumber == 9)) {
+		_objectVar[59] = 1;
+	}
+	if ((_room->_roomNumber == 0 && _previousRoomNumber == 2) || (_room->_roomNumber == 2 && _previousRoomNumber == 0)) {
+		_objectVar[78] = 1;
+	}
 	if (newRoomNumber == 5 && _previousRoomNumber == 6) {
 		_player->loadAnimations("stairs.nsp");
 		_player->_position.x = 0x174;
@@ -848,7 +870,17 @@ void DarkseedEngine::changeToRoom(int newRoomNumber) {
 		_player->_position.x = 0x19f;
 		_player->_position.y = 0x8c;
 		setupOtherNspAnimation(0,7);
-	} // TODO a bunch of other room codes here.
+	} else if (newRoomNumber == 32 && _previousRoomNumber == 13) {
+		_player->loadAnimations("slide.nsp");
+		setupOtherNspAnimation(0,16);
+	} else if (newRoomNumber == 10 && _previousRoomNumber == 6) {
+		_player->loadAnimations("rm10strs.nsp");
+		setupOtherNspAnimation(1,54);
+	} else if (newRoomNumber == 11 && _previousRoomNumber == 15) {
+		_player->loadAnimations("rm11strs.nsp");
+		setupOtherNspAnimation(1,56);
+	}
+	// TODO a bunch of other room codes here.
 	else if (newRoomNumber != 0x22 && (newRoomNumber < 0x13 || newRoomNumber > 0x17)) {
 		for (int i = 0; i < _room->room1.size(); i++) {
 			const RoomExit &roomExit = _room->room1[i];
@@ -1035,9 +1067,10 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 
 					} else if (otherNspAnimationType_maybe == 10 || otherNspAnimationType_maybe == 11) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(118, 62, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+						_sprites.addSpriteToDrawList(118, 62, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, false);
 					} else if (otherNspAnimationType_maybe == 12 || otherNspAnimationType_maybe == 13) {
-
+						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+						_sprites.addSpriteToDrawList(407, 73, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, false);
 					} else if (otherNspAnimationType_maybe == 20) {
 
 					} else if (otherNspAnimationType_maybe < 30 || otherNspAnimationType_maybe > 34) {
@@ -1283,6 +1316,19 @@ void DarkseedEngine::updateAnimation() {
 			}
 		}
 		break;
+	case 16:
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		} else {
+			_player->_position.x = 336;
+			_player->_position.y = 195;
+			_player->_walkTarget.x = 336;
+			_player->_walkTarget.y = 195;
+			_player->_direction = 1;
+			_player->updateSprite();
+		}
+		break;
 	case 10:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -1485,7 +1531,236 @@ void DarkseedEngine::useCode(int objNum) {
 }
 
 void DarkseedEngine::lookCode(int objNum) {
-	// TODO lots of custom eye code here.
+	if (objNum == 71 && _objectVar[71] == 2) {
+		_console->addTextLine("You see the car keys in the ignition.");
+		return;
+	}
+	if (objNum == 189) {
+		_console->addTextLine("You see the iron bars of your cell.");
+		return;
+	}
+	if (objNum == 141) {
+		_console->addTextLine("You see Delbert, not much to look at.");
+		return;
+	}
+	if (objNum == 42) {
+		switch(_objectVar[42]) {
+		case 0:
+			_console->printTosText(652);
+			break;
+		case 1:
+			_console->printTosText(659);
+			_objectVar[42] = 2;
+			break;
+		case 2:
+			_console->printTosText(659);
+			break;
+		case 3:
+			_console->printTosText(658);
+			break;
+		case 4:
+			_console->printTosText(652);
+			break;
+		default:
+			break;
+		}
+		return;
+	}
+	if (objNum == 101) {
+		switch(_objectVar[101]) {
+		case 0:
+		case 4:
+			_console->printTosText(732);
+			break;
+		case 1:
+		case 2:
+			_console->printTosText(734);
+			_objectVar[101] = 2;
+			break;
+		case 3:
+			_console->printTosText(735);
+			break;
+		default:
+			break;
+		}
+		return;
+	}
+	if (objNum == 25 && _cursor.getY() > 40) {
+		if (_objectVar[80] > 1) {
+			if (_objectVar[25] == 0 || _objectVar[25] == 100) {
+				_console->printTosText(691);
+			}
+			else if (_objectVar[25] == 1 || _objectVar[25] == 2) {
+				_objectVar[25] = 2;
+				_console->printTosText(697);
+			}
+			else {
+				_console->printTosText(693);
+			}
+		}
+		return;
+	}
+	if (objNum == 138) {
+		_console->addTextLine("You see the clerk.");
+		return;
+	}
+	if (objNum == 86 && _objectVar[86] != 0) {
+		_console->addTextLine("You see the open glove box.");
+		return;
+	}
+	if (objNum == 9) {
+		_room->_collisionType = 0;
+		_room->removeObjectFromRoom(9);
+		_objectVar.setMoveObjectRoom(9, 100);
+		showFullscreenPic(g_engine->isCdVersion() ? "paper_c.pic" : "paper-c.pic");
+		return;
+	}
+	if (objNum == 30) {
+		_objectVar[30] = 1;
+		_room->_collisionType = 0;
+		_room->removeObjectFromRoom(30);
+		_objectVar.setMoveObjectRoom(30, 100);
+		showFullscreenPic(g_engine->isCdVersion() ? "note_c.pic" : "note-c.pic");
+		return;
+	}
+	if (objNum == 194) {
+		if (_objectVar[53] == 2) {
+			_console->printTosText(494);
+		}
+		else {
+			_console->printTosText(496);
+		}
+		return;
+	}
+	if (objNum > 103 && objNum < 111) {
+		int baseIdx = 370;
+		if (objNum == 108) {
+			baseIdx = 382;
+		} else if (objNum == 110) {
+			baseIdx = 388;
+		}
+		_console->printTosText(baseIdx + _objectVar[objNum] * 2);
+		return;
+	}
+	if (objNum == 137) {
+		if (_objectVar[30] == 0) {
+			_console->printTosText(293);
+		} else {
+			_console->printTosText(295);
+		}
+		return;
+	}
+	if (objNum == 59) {
+		if (_objectVar[59] == 2) {
+			_console->printTosText(408);
+		} else {
+			_console->printTosText(31);
+		}
+	}
+	if (objNum == 78) {
+		if (_objectVar[78] == 2) {
+			_console->printTosText(408);
+		} else {
+			_console->printTosText(406);
+		}
+	}
+	if (objNum == 48 && _objectVar[48] == 0) {
+		sargoanim();
+		return;
+	}
+	if (objNum == 35 && _cursor.getY() < 40) {
+		if (_objectVar[35] == 0) {
+			_console->printTosText(670);
+		} else {
+			printTime();
+		}
+		return;
+	}
+	if (objNum == 46) {
+		if (_objectVar[46] == 1) {
+			_console->printTosText(538);
+		} else {
+			_console->printTosText(536);
+		}
+	}
+	if (objNum == 84) {
+		_console->printTosText(565);
+	}
+	if ((objNum == 14) && (_objectVar[86] == 0)) {
+		return;
+	}
+	if (objNum == 51) {
+		if (_objectVar[187] == 0) {
+			_console->printTosText(851);
+		}
+		else if (_objectVar[51] == 0) {
+			_console->printTosText(853);
+			_objectVar[51] = 1;
+			keeperanim();
+			_objectVar.setObjectRunningCode(72, 1);
+			_inventory.addItem(24);
+			_console->printTosText(959);
+		}
+		else {
+			_console->printTosText(960);
+		}
+	}
+	if (objNum == 55) {
+		_console->printTosText(776);
+		showFullscreenPic("diagram.pic");
+		return;
+	}
+	if (objNum == 34) {
+		_objectVar[34] = 1;
+		showFullscreenPic(_room->isGiger() ? "gbprint1.pic" : "bprint1.pic");
+		return;
+	}
+	if (objNum == 18 && _cursor.getY() < 40) {
+		showFullscreenPic(_room->isGiger() ? "gbcard.pic" : "cbcard.pic");
+		return;
+	}
+	if (objNum == 6 && _cursor.getY() < 40) {
+		showFullscreenPic(_room->isGiger() ? "gdiary.pic" : "cdiary.pic");
+		_objectVar[6] = 1;
+		return;
+	}
+	if (objNum == 12) {
+		if (_cursor.getY() < 40) {
+			showFullscreenPic(_room->isGiger() ? "gjourn01.pic" : "cjourn01.pic");
+			_objectVar[12] = 2;
+		} else if (_objectVar[12] < 2) {
+			_console->printTosText(567);
+		} else {
+			_console->printTosText(566);
+		}
+		return;
+	}
+	if (objNum == 29) {
+		showFullscreenPic(_room->isGiger() ? "gjour201.pic" : "cjour201.pic");
+		if (_objectVar[29] == 0) {
+			_objectVar[29] = 1;
+		}
+		return;
+	}
+	if (objNum == 10) {
+		showFullscreenPic(_room->isGiger() ? "glcard.pic" : "clcard.pic");
+		return;
+	}
+	if (objNum == 100) {
+		if (_objectVar[100] == 0) {
+			_console->printTosText(139);
+			_objectVar[100] = 1;
+		} else if (_objectVar[100] == 1 || _objectVar[100] == 2) {
+			_objectVar[100] = 2;
+			_console->printTosText(141);
+		} else if (_objectVar[100] == 3) {
+			_console->printTosText(143);
+		}
+		return;
+	}
+	if (objNum == 103) {
+		printTime();
+	}
 	if (_cursor.getY() > 39 && objNum != 77) {
 		int eyeTosIdx = _objectVar.getEyeDescriptionTosIdx(objNum);
 		if (eyeTosIdx < 979 && eyeTosIdx != 0)  {
@@ -1507,4 +1782,30 @@ void DarkseedEngine::getPackage(int state) {
 	// TODO handle different getPackage states.
 }
 
+void DarkseedEngine::printTime() {
+	_console->printTosText(958);
+	int hour = g_engine->_currentTimeInSeconds / 60 / 60 + 1;
+	_console->addToCurrentLine(Common::String::format("%d: %02d %s", hour % 12, (g_engine->_currentTimeInSeconds / 60) % 60, hour < 12 ? "a.m." : "p.m."));
+}
+
+void DarkseedEngine::showFullscreenPic(const Common::String &filename) {
+	if (_fullscreenPic) {
+		delete _fullscreenPic;
+	}
+	_fullscreenPic = new Pic();
+	if(!_fullscreenPic->load(filename)) {
+		delete _fullscreenPic;
+		_fullscreenPic = nullptr;
+		error("Failed to load %s", filename.c_str());
+	}
+}
+
+void DarkseedEngine::keeperanim() {
+	// TODO
+}
+
+void DarkseedEngine::sargoanim() {
+	// TODO
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index ea9055c606c..8e0cd19e545 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -62,6 +62,7 @@ private:
 	const ADGameDescription *_gameDescription;
 	Common::RandomSource _randomSource;
 	Pic _frame;
+	Pic *_fullscreenPic = nullptr;
 
 protected:
 	// Engine APIs
@@ -180,6 +181,7 @@ public:
 	void updateDisplay();
 	void setupOtherNspAnimation(int nspAnimIdx, int animId);
 	void debugTeleportToRoom(int newRoomNumber, int entranceNumber);
+	void showFullscreenPic(const Common::String &filename);
 
 private:
 	void updateAnimation();
@@ -197,6 +199,9 @@ private:
 	void useCode(int objNum);
 	void wongame();
 	void getPackage(int state);
+	void printTime();
+	void keeperanim();
+	void sargoanim();
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index b730884332c..275e16085f4 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -30,3 +30,8 @@ void Darkseed::Inventory::reset() {
 	_inventory.clear();
 	_inventory.push_back(8);
 }
+
+void Darkseed::Inventory::addItem(uint8 item) {
+	_inventory.push_back(item);
+	// TODO playsound(6, 5, -1);
+}
diff --git a/engines/darkseed/inventory.h b/engines/darkseed/inventory.h
index aeb5a60450b..ea16b9c4ff9 100644
--- a/engines/darkseed/inventory.h
+++ b/engines/darkseed/inventory.h
@@ -31,6 +31,7 @@ private:
 public:
 	Inventory();
 	void reset();
+	void addItem(uint8 item);
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index df264eb5600..4e54e942c58 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -144,6 +144,13 @@ int Darkseed::Objects::getMoveObjectRoom(uint16 idx) {
 	return _moveObjectRoom[idx];
 }
 
+void Darkseed::Objects::setMoveObjectRoom(uint16 idx, uint8 value) {
+	if (idx >= MAX_OBJECTS) {
+		error("setMoveObjectRoom: index out of range.");
+	}
+	_moveObjectRoom[idx] = value;
+}
+
 int16 Darkseed::Objects::getObjectRunningCode(int idx) {
 	if (idx >= MAX_OBJECTS) {
 		error("getObjectRunningCode: index out of range.");
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 5d91648d986..3fdcd558114 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -53,6 +53,7 @@ public:
 	int getEyeDescriptionTosIdx(uint16 objNum);
 
 	int getMoveObjectRoom(uint16 idx);
+	void setMoveObjectRoom(uint16 idx, uint8 value);
 
 	int16 &operator[](uint16 varIdx);
 	const int16 &operator[](uint16 varIdx) const;
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index ce17732a729..be72f6e6e81 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -739,3 +739,21 @@ void Darkseed::Room::runRoomObjects() {
 		g_engine->_sprites.addSpriteToDrawList(69, 104, &sprite, 255, sprite.width, sprite.height, false);
 	}
 }
+
+bool Darkseed::Room::isGiger() {
+	return _roomNumber >= 38 && (_roomNumber <= 60 || _roomNumber >= 66);
+}
+
+void Darkseed::Room::removeObjectFromRoom(int16 objNum) {
+	if (_collisionType == 0) {
+		for (auto &roomObj : _roomObj) {
+			if (roomObj.objNum == objNum) {
+				roomObj.type = 255;
+				roomObj.objNum = 999;
+				break;
+			}
+		}
+	} else {
+		g_engine->_objectVar.setMoveObjectRoom(objNum, 253);
+	}
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index 44a8544fbe0..e3094111d27 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -91,7 +91,9 @@ public:
 	void printRoomDescriptionText() const;
 	void calculateScaledSpriteDimensions(int width, int height, int curYPosition);
 	bool isOutside();
+	bool isGiger();
 	void runRoomObjects();
+	void removeObjectFromRoom(int16 objNum);
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);


Commit: 549fcb67a575c15210b45b80ac10f339a59f14a1
    https://github.com/scummvm/scummvm/commit/549fcb67a575c15210b45b80ac10f339a59f14a1
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Working on displaying inventory icon bar

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/inventory.cpp
    engines/darkseed/inventory.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index b830f87e25d..1be9e5f310e 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -203,6 +203,7 @@ void DarkseedEngine::gameloop() {
 			_fullscreenPic->draw(0x45, 0x28);
 		} else {
 			_room->draw();
+			_inventory.draw();
 			_sprites.drawSprites();
 			_player->draw();
 			_console->draw();
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 275e16085f4..d23b9307699 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -19,19 +19,68 @@
 *
 */
 
+#include "darkseed.h"
 #include "inventory.h"
 
 constexpr uint16 MAX_INVENTORY = 42;
+constexpr uint16 MAX_ICONS = 9;
+
 Darkseed::Inventory::Inventory() {
+	_iconList.resize(MAX_ICONS);
+	_inventory.resize(MAX_INVENTORY);
 	reset();
 }
 
 void Darkseed::Inventory::reset() {
-	_inventory.clear();
-	_inventory.push_back(8);
+	_viewOffset = 0;
+	_inventory[0] = 8;
+	_inventoryLength = 1;
 }
 
 void Darkseed::Inventory::addItem(uint8 item) {
-	_inventory.push_back(item);
+	_inventory[_inventoryLength] = item;
+	_inventoryLength++;
 	// TODO playsound(6, 5, -1);
 }
+
+void Darkseed::Inventory::draw() {
+	if (g_engine->_cursor.getY() > 40 || g_engine->isPlayingAnimation_maybe || (g_engine->_objectVar[141] >= 1 && g_engine->_objectVar[141] <= 3)) {
+		return;
+	}
+	if (_viewOffset != 0) {
+		if (_inventoryLength <= _viewOffset + MAX_ICONS) {
+			_viewOffset = _inventoryLength - MAX_ICONS;
+		}
+		if (_viewOffset > 50) {
+			_viewOffset = 0;
+		}
+	}
+	_iconList[0] = 4;
+	if (_inventoryLength + 1 < MAX_ICONS) {
+		_viewOffset = 0;
+		for (int i = 0; i < _inventoryLength; i++) {
+			_iconList[i+1] = _inventory[i];
+		}
+	} else {
+		for (int i = 0; i < MAX_ICONS; i++) {
+			_iconList[i+1] = _inventory[_viewOffset + i];
+		}
+		if (_viewOffset + 8 < _inventoryLength) {
+			_iconList[8] = 43;
+		}
+		if (_viewOffset != 0) {
+			_iconList[1] = 42;
+		}
+	}
+	int numIcons = MIN(_inventoryLength + 1, 9);
+
+	for(int i = 0; i < numIcons; i++) {
+		int icon = _iconList[i];
+		if (icon != 42 && icon != 43) {
+			icon += 42;
+		}
+
+		const Sprite &animSprite = g_engine->_baseSprites.getSpriteAt(icon);
+		g_engine->_sprites.addSpriteToDrawList(140 + i * 37, 20 - animSprite.height / 2, &animSprite, 255, animSprite.width, animSprite.height, false);
+	}
+}
diff --git a/engines/darkseed/inventory.h b/engines/darkseed/inventory.h
index ea16b9c4ff9..3a5da2b0496 100644
--- a/engines/darkseed/inventory.h
+++ b/engines/darkseed/inventory.h
@@ -27,11 +27,16 @@ namespace Darkseed {
 
 class Inventory {
 private:
-	Common::List<uint8> _inventory;
+	Common::Array<uint8> _inventory;
+	int _inventoryLength = 0;
+	Common::Array<uint8> _iconList;
+	int _viewOffset = 0;
+
 public:
 	Inventory();
 	void reset();
 	void addItem(uint8 item);
+	void draw();
 };
 
 } // namespace Darkseed


Commit: b1838a2888a8e465b3bc50197981bc61e5939f6b
    https://github.com/scummvm/scummvm/commit/b1838a2888a8e465b3bc50197981bc61e5939f6b
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Inventory look code.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/inventory.cpp
    engines/darkseed/inventory.h
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 1be9e5f310e..4f1e50c6c63 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -477,8 +477,8 @@ void DarkseedEngine::handleInput() {
 				if (_player->isAtWalkTarget() && _player->_heroMoving && _player->walkPathIndex != -1) {
 					_player->walkToNextConnector();
 				}
-				if (_isLeftMouseClicked && _cursor.getY() < 0x29) {
-					// TODO handle inventory click.
+				if (_isLeftMouseClicked && _cursor.getY() < 41) {
+					_inventory.handleClick();
 				}
 				_room->calculateScaledSpriteDimensions(_player->getWidth(), _player->getHeight(), _player->_position.y);
 
@@ -1772,6 +1772,7 @@ void DarkseedEngine::lookCode(int objNum) {
 //		}
 		return;
 	}
+	_console->addTextLine(Common::String::format("You see the %s.", _objectVar.getObjectName(objNum)));
 }
 
 void DarkseedEngine::wongame() {
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 8e0cd19e545..676aa38f7cb 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -182,6 +182,7 @@ public:
 	void setupOtherNspAnimation(int nspAnimIdx, int animId);
 	void debugTeleportToRoom(int newRoomNumber, int entranceNumber);
 	void showFullscreenPic(const Common::String &filename);
+	void lookCode(int objNum);
 
 private:
 	void updateAnimation();
@@ -195,7 +196,6 @@ private:
 	void changeToRoom(int newRoomNumber);
 	void handleObjCollision(int objNum);
 
-	void lookCode(int objNum);
 	void useCode(int objNum);
 	void wongame();
 	void getPackage(int state);
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index d23b9307699..10fde2f0c89 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -35,18 +35,29 @@ void Darkseed::Inventory::reset() {
 	_viewOffset = 0;
 	_inventory[0] = 8;
 	_inventoryLength = 1;
+	update();
 }
 
 void Darkseed::Inventory::addItem(uint8 item) {
 	_inventory[_inventoryLength] = item;
 	_inventoryLength++;
 	// TODO playsound(6, 5, -1);
+	update();
 }
 
-void Darkseed::Inventory::draw() {
-	if (g_engine->_cursor.getY() > 40 || g_engine->isPlayingAnimation_maybe || (g_engine->_objectVar[141] >= 1 && g_engine->_objectVar[141] <= 3)) {
-		return;
+void Darkseed::Inventory::removeItem(uint8 item) {
+	for (int i = 0; i < _inventoryLength; i++) {
+		if (_inventory[i] == item) {
+			for (int j = i; j < _inventoryLength - 1; j++) {
+				_inventory[j] = _inventory[j+1];
+			}
+			_inventoryLength--;
+			break;
+		}
 	}
+}
+
+void Darkseed::Inventory::update() {
 	if (_viewOffset != 0) {
 		if (_inventoryLength <= _viewOffset + MAX_ICONS) {
 			_viewOffset = _inventoryLength - MAX_ICONS;
@@ -72,9 +83,15 @@ void Darkseed::Inventory::draw() {
 			_iconList[1] = 42;
 		}
 	}
-	int numIcons = MIN(_inventoryLength + 1, 9);
+	_numIcons = MIN(_inventoryLength + 1, 9);
+}
 
-	for(int i = 0; i < numIcons; i++) {
+void Darkseed::Inventory::draw() {
+	if (g_engine->_cursor.getY() > 40 || g_engine->isPlayingAnimation_maybe || (g_engine->_objectVar[141] >= 1 && g_engine->_objectVar[141] <= 3)) {
+		return;
+	}
+
+	for(int i = 0; i < _numIcons; i++) {
 		int icon = _iconList[i];
 		if (icon != 42 && icon != 43) {
 			icon += 42;
@@ -84,3 +101,48 @@ void Darkseed::Inventory::draw() {
 		g_engine->_sprites.addSpriteToDrawList(140 + i * 37, 20 - animSprite.height / 2, &animSprite, 255, animSprite.width, animSprite.height, false);
 	}
 }
+
+void Darkseed::Inventory::handleClick() {
+	Common::Point clickPos = g_engine->_cursor.getPosition();
+	if (clickPos.x < 140 || clickPos.x > 140 + _numIcons * 37) {
+		return;
+	}
+	int iconIdx = (clickPos.x - 140) / 37;
+	int icon = _iconList[iconIdx];
+	if (icon == 42) {
+		leftArrowClicked();
+	} else if (icon == 43) {
+		rightArrowClicked();
+	} else if (icon == 4) {
+		// TODO handle in-game menu
+	} else if (icon == 21) {
+		g_engine->_console->printTosText(935);
+		g_engine->_objectVar[21] = 1;
+		g_engine->_room->_collisionType = 1;
+		g_engine->_room->removeObjectFromRoom(21);
+		removeItem(21);
+	} else if ((g_engine->_actionMode == 25 && icon == 20) ||
+			   (g_engine->_actionMode == 20 && icon == 25)
+			   ) {
+
+	} else if (g_engine->_actionMode == HandAction && icon == 35) {
+		g_engine->_objectVar[35] = 0x7080;
+		g_engine->_console->printTosText(669);
+	} else if (g_engine->_actionMode == LookAction) {
+		g_engine->lookCode(icon);
+	} else {
+
+	}
+}
+
+void Darkseed::Inventory::leftArrowClicked() {
+	if (_viewOffset > 0) {
+		_viewOffset--;
+		update();
+	}
+}
+
+void Darkseed::Inventory::rightArrowClicked() {
+	_viewOffset++;
+	update();
+}
diff --git a/engines/darkseed/inventory.h b/engines/darkseed/inventory.h
index 3a5da2b0496..c0883bc6d52 100644
--- a/engines/darkseed/inventory.h
+++ b/engines/darkseed/inventory.h
@@ -31,12 +31,21 @@ private:
 	int _inventoryLength = 0;
 	Common::Array<uint8> _iconList;
 	int _viewOffset = 0;
+	int _numIcons = 0;
 
 public:
 	Inventory();
 	void reset();
 	void addItem(uint8 item);
+	void removeItem(uint8 item);
 	void draw();
+	void handleClick();
+
+private:
+	void update();
+	void leftArrowClicked();
+	void rightArrowClicked();
+
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index 4e54e942c58..6e728253f29 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -130,6 +130,212 @@ static constexpr uint16 eyeDescriptionsTbl[] = {
 	671, 321, 163
 };
 
+
+static constexpr char objectNameTbl[199][21] = {
+	"Nothing.",
+	"Box",
+	"hand",
+	"eye",
+	"Ctrl",
+	"crowbar",
+	"journal",
+	"scotch",
+	"money",
+	"newspaper",
+	"library card",
+	"bobby pin",
+	"journal scrap",
+	"clock key",
+	"gloves",
+	"mirror shard",
+	"binoculars",
+	"shovel",
+	"business card",
+	"stick",
+	"axe handle",
+	"head band",
+	"trunk",
+	"rope",
+	"microfiche card",
+	"loose rock",
+	"car keys",
+	"hammer",
+	"gun",
+	"grave journal scrap",
+	"note from movers",
+	"package",
+	"package",
+	"package",
+	"blue print",
+	"watch",
+	"crackers",
+	"sardines",
+	"insecticide",
+	"soysauce",
+	"olives",
+	"tin cup",
+	"trunk lock",
+	"book 'Alien'",
+	"gas cap",
+	"Fido",
+	"librarian",
+	"telephone",
+	"bone bars",
+	"stairs",
+	"brass urn",
+	"viewscreen",
+	"shower",
+	"sergeant",
+	"guard",
+	"evil plans",
+	"evil sergeant",
+	"starship lever",
+	"Dreketh guards",
+	"secret door",
+	"turbo door",
+	"post",
+	"radio dial",
+	"exit in car",
+	"guard",
+	"prisoner lock",
+	"tomb left",
+	"tomb up",
+	"tomb right",
+	"front door",
+	"top of stairs",
+	"car ignition",
+	"police at door",
+	"evil mike",
+	"Gcell lock",
+	"tombstone",
+	"ladder down",
+	"ladder",
+	"secret door 2",
+	"evil fido",
+	"microfiche",
+	"box behind desk",
+	"button",
+	"library floor",
+	"book",
+	"store",
+	"glove compartment",
+	"tombstone",
+	"tombstone",
+	"tombstone",
+	"tombstone",
+	"tombstone",
+	"tombstone",
+	"tombstone",
+	"tombstone",
+	"tombstone",
+	"tombstone",
+	"tombstone",
+	"tombstone",
+	"tomb door",
+	"coat",
+	"car trunk",
+	"rope tied to house",
+	"clock",
+	"cupboard",
+	"cupboard",
+	"cupboard",
+	"cupboard",
+	"stove",
+	"drawer",
+	"kitchen tap",
+	"bathroom tap",
+	"medicine chest",
+	"pillow",
+	"Ancient",
+	"power nexus",
+	"abyss",
+	"observatory lever",
+	"horizon",
+	"force field",
+	"leech victims",
+	"shrubs",
+	"railing",
+	"bed",
+	"artwork",
+	"carpet",
+	"chair",
+	"spittoon",
+	"bed",
+	"bed bottom",
+	"fridge",
+	"books",
+	"globe",
+	"mug shots",
+	"map",
+	"desk",
+	"xxx",
+	"mirror",
+	"clerk",
+	"ladder",
+	"postman",
+	"Delbert",
+	"cement rock",
+	"towels",
+	"water heater",
+	"bathtub",
+	"xxx",
+	"couch",
+	"window",
+	"art",
+	"art",
+	"clock",
+	"counter",
+	"books",
+	"desk",
+	"xxx",
+	"desk",
+	"books",
+	"arch",
+	"ground",
+	"pillars",
+	"caskets",
+	"horizon",
+	"urn",
+	"urn",
+	"urn",
+	"urn",
+	"urn",
+	"urn",
+	"xxx",
+	"soccer ball",
+	"skis",
+	"trunk",
+	"bottles",
+	"barrels",
+	"wheel",
+	"car",
+	"furniture",
+	"xxx",
+	"cocoons",
+	"wall of skulls",
+	"creature",
+	"glass case",
+	"power cables",
+	"tubes",
+	"brain nexus",
+	"xxx",
+	"control panel",
+	"desk",
+	"cell bars",
+	"cell bars",
+	"console",
+	"viewer",
+	"building",
+	"box",
+	"tools",
+	"newspaper",
+	"table",
+	"bed bottom",
+};
+
+
+
+
 int Darkseed::Objects::getEyeDescriptionTosIdx(uint16 objNum) {
 	if (objNum >= MAX_OBJECTS) {
 		error("getEyeDescriptionTosIdx: Object Index out of range! %d", objNum);
@@ -164,3 +370,11 @@ void Darkseed::Objects::setObjectRunningCode(int idx, int16 value) {
 	}
 	_objectRunningCode[idx] = value;
 }
+
+const char *Darkseed::Objects::getObjectName(int idx) {
+	if (idx < 0 || idx >= MAX_OBJECTS) {
+		error("getObjectName: index out of range.");
+	}
+
+	return objectNameTbl[idx];
+}
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 3fdcd558114..1490f4b01d1 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -55,6 +55,8 @@ public:
 	int getMoveObjectRoom(uint16 idx);
 	void setMoveObjectRoom(uint16 idx, uint8 value);
 
+	const char *getObjectName(int idx);
+
 	int16 &operator[](uint16 varIdx);
 	const int16 &operator[](uint16 varIdx) const;
 };


Commit: 1a54d467c38f330009452756d653c9d61bd77b74
    https://github.com/scummvm/scummvm/commit/1a54d467c38f330009452756d653c9d61bd77b74
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Inventory holding objects.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/inventory.cpp
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 4f1e50c6c63..edc475b05c4 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -471,6 +471,8 @@ void DarkseedEngine::handleInput() {
 						_actionMode = HandAction;
 					} else if (_actionMode == HandAction) {
 						_actionMode = LookAction;
+					} else {
+						_actionMode = PointerAction;
 					}
 					_cursor.setCursorType((CursorType)_actionMode);
 				}
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 676aa38f7cb..d005a23dc4f 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -77,7 +77,7 @@ public:
 	TosText *_tosText = nullptr;
 	Console *_console = nullptr;
 	Room *_room = nullptr;
-	ActionMode _actionMode = PointerAction;
+	int _actionMode = PointerAction;
 	Player *_player = nullptr;
 	Sprites _sprites;
 	Objects _objectVar;
@@ -183,6 +183,7 @@ public:
 	void debugTeleportToRoom(int newRoomNumber, int entranceNumber);
 	void showFullscreenPic(const Common::String &filename);
 	void lookCode(int objNum);
+	void handleObjCollision(int objNum);
 
 private:
 	void updateAnimation();
@@ -194,7 +195,6 @@ private:
 	void wait();
 	void handlePointerAction();
 	void changeToRoom(int newRoomNumber);
-	void handleObjCollision(int objNum);
 
 	void useCode(int objNum);
 	void wongame();
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 10fde2f0c89..b91507498e7 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -87,7 +87,7 @@ void Darkseed::Inventory::update() {
 }
 
 void Darkseed::Inventory::draw() {
-	if (g_engine->_cursor.getY() > 40 || g_engine->isPlayingAnimation_maybe || (g_engine->_objectVar[141] >= 1 && g_engine->_objectVar[141] <= 3)) {
+	if ((g_engine->_actionMode <= 4 && g_engine->_cursor.getY() > 40) || g_engine->isPlayingAnimation_maybe || (g_engine->_objectVar[141] >= 1 && g_engine->_objectVar[141] <= 3)) {
 		return;
 	}
 
@@ -97,8 +97,13 @@ void Darkseed::Inventory::draw() {
 			icon += 42;
 		}
 
-		const Sprite &animSprite = g_engine->_baseSprites.getSpriteAt(icon);
-		g_engine->_sprites.addSpriteToDrawList(140 + i * 37, 20 - animSprite.height / 2, &animSprite, 255, animSprite.width, animSprite.height, false);
+		if (g_engine->_actionMode == _iconList[i] && g_engine->_actionMode > 4) {
+			const Sprite &selectedSprite = g_engine->_baseSprites.getSpriteAt(95);
+			g_engine->_sprites.addSpriteToDrawList(139 + i * 37, 20 - selectedSprite.height / 2, &selectedSprite, 255, selectedSprite.width, selectedSprite.height, false);
+
+		}
+		const Sprite &iconSprite = g_engine->_baseSprites.getSpriteAt(icon);
+		g_engine->_sprites.addSpriteToDrawList(140 + i * 37, 20 - iconSprite.height / 2, &iconSprite, 255, iconSprite.width, iconSprite.height, false);
 	}
 }
 
@@ -124,14 +129,16 @@ void Darkseed::Inventory::handleClick() {
 	} else if ((g_engine->_actionMode == 25 && icon == 20) ||
 			   (g_engine->_actionMode == 20 && icon == 25)
 			   ) {
-
+		g_engine->handleObjCollision(icon);
 	} else if (g_engine->_actionMode == HandAction && icon == 35) {
 		g_engine->_objectVar[35] = 0x7080;
 		g_engine->_console->printTosText(669);
 	} else if (g_engine->_actionMode == LookAction) {
 		g_engine->lookCode(icon);
 	} else {
-
+		g_engine->_actionMode = icon;
+		g_engine->_console->printTosText(972);
+		g_engine->_console->addToCurrentLine(Common::String::format("%s.", g_engine->_objectVar.getObjectName(icon)));
 	}
 }
 
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index be72f6e6e81..8840d49056b 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -172,7 +172,7 @@ void Darkseed::Room::draw() {
 }
 
 int Darkseed::Room::checkCursorAndMoveableObjects() {
-	ActionMode actionMode = g_engine->_actionMode;
+	int actionMode = g_engine->_actionMode;
 	const Sprite &cursorSprite = (actionMode == LookAction)
 									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
 									 : g_engine->_cursor.getSprite();
@@ -207,7 +207,7 @@ int Darkseed::Room::checkCursorAndMoveableObjects() {
 }
 
 int Darkseed::Room::checkCursorAndStaticObjects(int x, int y) {
-	ActionMode actionMode = g_engine->_actionMode;
+	int actionMode = g_engine->_actionMode;
 	const Sprite &cursorSprite = (actionMode == LookAction)
 									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
 									 : g_engine->_cursor.getSprite();
@@ -257,7 +257,7 @@ int Darkseed::Room::checkCursorAndStaticObjects(int x, int y) {
 }
 
 int Darkseed::Room::CheckCursorAndMovedObjects() {
-	ActionMode actionMode = g_engine->_actionMode;
+	int actionMode = g_engine->_actionMode;
 	const Sprite &cursorSprite = (actionMode == LookAction)
 									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
 									 : g_engine->_cursor.getSprite();
@@ -292,7 +292,7 @@ int Darkseed::Room::CheckCursorAndMovedObjects() {
 }
 
 void Darkseed::Room::update() {
-	if (g_engine->_actionMode == HandAction) {
+	if (g_engine->_actionMode == HandAction || g_engine->_actionMode > 4) {
 		int moveableObj = checkCursorAndMoveableObjects();
 		if (moveableObj == -1) {
 			int objectUnderCursor = checkCursorAndStaticObjects(g_engine->_cursor.getX(), g_engine->_cursor.getY());


Commit: d550896b31f8f00c02b27c418e520b690f90107c
    https://github.com/scummvm/scummvm/commit/d550896b31f8f00c02b27c418e520b690f90107c
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: more useCode. phones.

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index edc475b05c4..23b08600057 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1250,6 +1250,11 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 	case 58:
 //		PlaySound(48,5,-1);
 		break;
+	case 63:
+		_player->_position.x = 249;
+		_player->_position.y = 92;
+		_phoneStatus = 1;
+		break;
 	default:
 		break;
 	}
@@ -1319,6 +1324,58 @@ void DarkseedEngine::updateAnimation() {
 			}
 		}
 		break;
+	case 8: //phone call
+	case 63:
+		if (otherNspAnimationType_maybe == 8) {
+			advanceAnimationFrame(0);
+		} else {
+			advanceAnimationFrame(2);
+			if (_phoneStatus == 1) {
+				_phoneStatus = 2;
+			}
+		}
+		if (!isAnimFinished_maybe) {
+			if (otherNspAnimationType_maybe == 8) {
+				_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			} else {
+				_player->_frameIdx = _player->_animations.getAnimAt(2).frameNo[_player->_animations.getAnimAt(2).frameNo[animIndexTbl[2]]];
+			}
+		} else {
+			if (otherNspAnimationType_maybe == 63) {
+				_console->printTosText(44);
+				setupOtherNspAnimation(1, 64);
+			} else {
+				_objectVar.setObjectRunningCode(47, 0);
+				if (_currentDay == 1) {
+					_console->printTosText(904);
+					_objectVar[47] = 1;
+					_objectVar[46] = 1;
+				}
+				else {
+					_objectVar[51] = 2;
+					_objectVar[47] = 1;
+					_console->printTosText(922);
+				}
+				// TODO
+//				WaitForSpeech();
+				setupOtherNspAnimation(1, 9);
+			}
+		}
+		break;
+	case 9: // hang up phone
+	case 64:
+		advanceAnimationFrame(1);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
+		} else {
+			_player->_position.x = 300;
+			_player->_position.y = 183;
+			_player->_walkTarget.x = 300;
+			_player->_walkTarget.y = 183;
+			_player->_direction = 3;
+			_player->updateSprite();
+		}
+		break;
 	case 16:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -1527,6 +1584,58 @@ void DarkseedEngine::handleObjCollision(int objNum) {
 void DarkseedEngine::useCode(int objNum) {
 	debug("useCode: objNum = %d", objNum);
 
+	if (objNum == 141) {
+		_console->addTextLine("You touch Delbert...");
+		return;
+	}
+	if (objNum == 189) {
+		_console->addTextLine("You touch the cold iron bars.");
+		return;
+	}
+	if (objNum == 42) {
+		switch(_objectVar[42]) {
+		case 0:
+			_console->printTosText(653);
+			break;
+		case 1:
+			_console->printTosText(655);
+			_objectVar[42] = 0;
+			break;
+		case 2:
+			_console->printTosText(660);
+			_inventory.addItem(6);
+			_objectVar[42] = 3;
+			break;
+		case 3:
+			_console->printTosText(655);
+			_objectVar[42] = 4;
+			break;
+		case 4:
+			_console->printTosText(653);
+		}
+		return;
+	}
+	if (objNum == 9) {
+		_room->_collisionType = 0;
+		_room->removeObjectFromRoom(9);
+		_objectVar.setMoveObjectRoom(9, 100);
+		showFullscreenPic(g_engine->isCdVersion() ? "paper_c.pic" : "paper-c.pic");
+		return;
+	}
+	if (objNum == 35) {
+		_objectVar[35] = 3600;
+	}
+	if (objNum == 47) {
+		_player->loadAnimations("phone.nsp");
+		if (_objectVar.getObjectRunningCode(47) == 0) {
+			setupOtherNspAnimation(2,63);
+		}
+		else {
+			setupOtherNspAnimation(0,8);
+		}
+		_player->_direction = 3;
+	}
+	// TODO more code here.
 	if (objNum == 139) {
 		_player->loadAnimations("ltladder.nsp");
 		setupOtherNspAnimation(0,10);
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index d005a23dc4f..437e4b199b8 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -121,6 +121,7 @@ public:
 	uint8 systemTimerCounter = 0;
 
 	bool _debugShowWalkPath = false;
+	int _phoneStatus = 0;
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	~DarkseedEngine() override;


Commit: c295f3822e4ce11831fa38f6fca1ae9ce6173f3b
    https://github.com/scummvm/scummvm/commit/c295f3822e4ce11831fa38f6fca1ae9ce6173f3b
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: more useCode.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 23b08600057..33f45c86f88 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1101,7 +1101,12 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 							_sprites.addSpriteToDrawList(_player->_position.x - animSprite.width / 2, _player->_position.y - animSprite.height, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 						}
 					} else {
-						// 2022:5ae5
+						// drinking water in bathroom
+						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+						_sprites.addSpriteToDrawList(448, 97, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+						const Sprite &legsSprite = _player->_animations.getSpriteAt(0);
+						_sprites.addSpriteToDrawList(451, 160, &legsSprite, 0xf0 - _player->_position.y, legsSprite.width, legsSprite.height, player_sprite_related_2c85_82f3);
+
 					}
 				} else if (otherNspAnimationType_maybe == 6) {
 					// stairs up
@@ -1233,6 +1238,10 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		_player->_position.x = 432;
 		_player->_position.y = 78;
 		break;
+	case 44:
+	case 46:
+		playSound(30,5,-1);
+		break;
 	case 53 :
 	case 54 :
 		_player->_position.x = 308;
@@ -1277,6 +1286,28 @@ void DarkseedEngine::updateAnimation() {
 			_player->updateSprite();
 		}
 		break;
+	case 5: // goto sleep animation
+		_player->_position.x = 135;
+		_player->_position.y = 91;
+		advanceAnimationFrame(1);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
+		}
+		else {
+			// advanceToNextMorning();
+			_player->_position.x = 242;
+			_player->_position.y = 187;
+			if (_currentDay == 4) {
+				playCutscene("Y");
+			} else if (_currentDay == 2) {
+				playCutscene("B");
+			} else if (_currentDay == 3) {
+				playCutscene("C");
+			}
+		}
+		_player->_position.x = 242;
+		_player->_position.y = 187;
+		break;
 	case 6: // stairs up
 		if (currentRoomNumber == 6) {
 			advanceAnimationFrame(1);
@@ -1389,6 +1420,19 @@ void DarkseedEngine::updateAnimation() {
 			_player->updateSprite();
 		}
 		break;
+	case 18: // push trunk
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		}
+		if (_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]] == 3 && _currentDay != 0) {
+			_console->printTosText(_objectVar[22] + 662);
+			_objectVar[22] = _objectVar[22] + 1;
+			if (_objectVar[22] == 3) {
+//				getmovedtrunkbkgnd(); TODO
+			}
+		}
+		break;
 	case 10:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -1441,6 +1485,15 @@ void DarkseedEngine::updateAnimation() {
 			}
 		}
 		break;
+	case 26: // climb down rope.
+		advanceAnimationFrame(1);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
+		} else {
+			_previousRoomNumber = _room->_roomNumber;
+			changeToRoom(32);
+		}
+		break;
 	case 27:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -1450,6 +1503,33 @@ void DarkseedEngine::updateAnimation() {
 			changeToRoom(38);
 		}
 		break;
+	case 30:
+	case 31: {
+		int animIdx = otherNspAnimationType_maybe - 30;
+		advanceAnimationFrame(animIdx);
+		if (isPlayingAnimation_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(animIdx).frameNo[animIndexTbl[animIdx]];
+		}
+		if (isAnimFinished_maybe && otherNspAnimationType_maybe == 30) {
+			setupOtherNspAnimation(1, 31);
+		}
+		break;
+	}
+	case 32:
+	case 33:
+	case 34: {
+		_objectVar[112] = 1;
+		int animIdx = otherNspAnimationType_maybe - 30;
+		advanceAnimationFrame(animIdx);
+		// TODO play sfx.
+		if (isPlayingAnimation_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(animIdx).frameNo[animIndexTbl[animIdx]];
+		}
+		if (isAnimFinished_maybe && (otherNspAnimationType_maybe == 32 || otherNspAnimationType_maybe == 33)) {
+			setupOtherNspAnimation(otherNspAnimationType_maybe - 29, otherNspAnimationType_maybe + 1);
+		}
+		break;
+	}
 	case 41:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -1459,6 +1539,35 @@ void DarkseedEngine::updateAnimation() {
 			changeToRoom(7);
 		}
 		break;
+	case 43:
+	case 44:
+	case 45:
+	case 46: {
+		int iVar4 = 0;
+		if ((otherNspAnimationType_maybe == 44) || (otherNspAnimationType_maybe == 46)) {
+			iVar4 = 1;
+		}
+		advanceAnimationFrame(iVar4);
+		_player->_frameIdx = _player->_animations.getAnimAt(iVar4).frameNo[_player->_animations.getAnimAt(iVar4).frameNo[animIndexTbl[iVar4]]];
+//		_HeroSpr = (uint) * (byte *)((int)&DAT_1060_7eb8 + *(int *)((int)&_ObjFrame + iVar4 * 2) + iVar4 * 202);
+		if (!isAnimFinished_maybe || (otherNspAnimationType_maybe != 46 && otherNspAnimationType_maybe != 44)) {
+			if (otherNspAnimationType_maybe == 45) {
+				_objectVar[117] = 1;
+			} else if (isAnimFinished_maybe) {
+				if ((_objectVar[71] == 2) && (_objectVar[44] != 0)) {
+					_console->printTosText(896);
+					_objectVar[57] = 1;
+				} else {
+					_console->printTosText(897);
+				}
+			}
+		} else {
+//			LoadModeSong(7); TODO
+			playSound(0, 6, -1);
+//			stuffplayer(); TODO
+		}
+		break;
+	}
 	case 53 :
 	case 54 :
 	case 55 :
@@ -1635,10 +1744,322 @@ void DarkseedEngine::useCode(int objNum) {
 		}
 		_player->_direction = 3;
 	}
-	// TODO more code here.
-	if (objNum == 139) {
-		_player->loadAnimations("ltladder.nsp");
-		setupOtherNspAnimation(0,10);
+	if (objNum == 194) {
+		if (_objectVar[53] == 2) {
+			_console->printTosText(948);
+			for (int i = 0; i < Objects::MAX_MOVED_OBJECTS; i++) {
+				if (_objectVar.getMoveObjectRoom(i) == 252) {
+					_objectVar.setMoveObjectRoom(i, 254);
+					_inventory.addItem(i);
+				}
+			}
+			_objectVar[53] = 3;
+		} else {
+			_console->printTosText(566);
+		}
+		return;
+	}
+	if (objNum == 113) {
+		bool foundMatch = false;
+		for (int i = 0; i < Objects::MAX_MOVED_OBJECTS; i++) {
+			if (_objectVar.getMoveObjectRoom(i) == 250) {
+				_objectVar.setMoveObjectRoom(i, 254);
+				_inventory.addItem(i);
+				foundMatch = true;
+			}
+		}
+		if (foundMatch) {
+			_objectVar[113] = 0;
+			_console->printTosText(948);
+		} else {
+			_console->printTosText(751);
+		}
+	}
+	if (objNum == 123) {
+		if (_currentTimeInSeconds < 61200) {
+			_console->printTosText(119);
+		} else {
+			_player->loadAnimations("bedsleep.nsp");
+			setupOtherNspAnimation(1, 5);
+		}
+		return;
+	}
+	if (objNum == 71 && _objectVar[71] == 2) { // car ignition
+		_objectVar[71] = 0;
+		_console->printTosText(949);
+		_inventory.addItem(26);
+		return;
+	}
+	if ((162 < objNum) && (objNum < 169)) {
+		playSound(47,5,-1);
+	}
+	if (objNum == 175) {
+		playSound(39,5,-1);
+//		while (iVar2 = VOCPlaying(), iVar2 != 0) {
+//			VOCPoll();
+//		}
+		_console->printTosText(719);
+		return;
+	}
+	if (objNum == 187) {
+		if (_objectVar[187] == 0) {
+			_console->printTosText(856);
+			setupOtherNspAnimation(0, 60);
+		} else {
+			setupOtherNspAnimation(1, 61);
+		}
+		return;
+	}
+	if (objNum == 137 || objNum == 30) {
+		if (_objectVar[30] == 0) {
+			_objectVar[30] = 1;
+			_room->_collisionType = 0;
+			_room->removeObjectFromRoom(30);
+			_objectVar.setMoveObjectRoom(30, 100);
+			showFullscreenPic(g_engine->isCdVersion() ? "note_c.pic" : "note-c.pic");
+		} else {
+			_console->printTosText(296);
+		}
+		return;
+	}
+	if (_room->_roomNumber == 21 && objNum == 12) {
+		if (_objectVar[12] == 0 && _objectVar[10] == 1) {
+			_objectVar[12] = 1;
+			_inventory.addItem(12);
+			_console->printTosText(568);
+		} else {
+			_console->printTosText(566);
+		}
+		return;
+	}
+	if (objNum == 46) {
+		if (_objectVar[46] == 1) {
+			setupOtherNspAnimation(0,19);
+		} else {
+			_console->printTosText(539);
+		}
+		return;
+	}
+	if (objNum != 7 && objNum != 36 && objNum != 37 && objNum != 38 && objNum != 39 && objNum != 40) {
+		int handTosIdx = _objectVar.getHandDescriptionTosIdx(objNum);
+		if (handTosIdx != 0 && handTosIdx < 979) {
+			_console->printTosText(handTosIdx);
+		} else if (handTosIdx > 978) {
+			// TODO genericresponse
+		}
+		if (objNum == 80) {
+			_console->printTosText(553 + (_objectVar[80] & 1));
+			_objectVar[80] = (_objectVar[80] & 2) + ((_objectVar[80] & 1) == 0 ? 1 : 0);
+			return;
+		}
+		if (objNum == 59 || objNum == 78 && _objectVar[34] == 0) {
+			return;
+		}
+		if (objNum == 100) {
+			if (_objectVar[100] == 0 || _objectVar[100] == 1 || _objectVar[100] == 3) {
+				_console->printTosText(140);
+			} else if (_objectVar[100] == 2) {
+				_objectVar[100] = 3;
+				_inventory.addItem(10);
+				_objectVar[10] = 254;
+				_console->printTosText(142);
+			}
+			return;
+		}
+		if (objNum == 114) {
+			gancanim();
+			return;
+		}
+		if ((objNum == 28) && (_objectVar[28] == 2)) {
+			_console->addTextLine("The sergeant says 'Nice gun eh? It's a Browning'");
+			return;
+		}
+		if (objNum > 103 && objNum < 111) {
+			if (objNum < 110) {
+				_player->loadAnimations("opendrwr.nsp");
+				if (objNum == 108) {
+					if (_objectVar[108] == 0) {
+						_console->printTosText(383);
+					}
+					else {
+						_console->printTosText(385);
+					}
+					setupOtherNspAnimation(0, 52);
+				}
+				else {
+					if (_objectVar[objNum] == 0) {
+						_console->printTosText(371);
+					}
+					else {
+						_console->printTosText(373);
+					}
+					setupOtherNspAnimation(0,objNum - 56);
+				}
+			}
+			else {
+				if (_objectVar[objNum] == 0) {
+					_console->printTosText(389);
+				}
+				else {
+					_console->printTosText(391);
+				}
+				_objectVar[objNum] = _objectVar[objNum] == 0 ? 1 : 0;
+			}
+			return;
+		}
+		if (objNum == 111) { // tap
+			_player->loadAnimations("aspirin.nsp");
+			setupOtherNspAnimation(0,30);
+			_console->printTosText(242);
+			return;
+		}
+		if (objNum == 112) { // mirror cabinet
+			_player->loadAnimations("aspirin.nsp");
+			setupOtherNspAnimation(2,32);
+			return;
+		}
+		if (objNum > 30 && objNum < 34) {
+			_room->removeObjectFromRoom(objNum);
+			getPackageObj(objNum - 30);
+			return;
+		}
+		if ((objNum == 14) && (_objectVar[86] == 0)) {
+			_objectVar[86] = 1;
+			return;
+		}
+		if ((objNum == 102) && (_objectVar[23] == 1)) {
+			_player->loadAnimations("slide.nsp");
+			setupOtherNspAnimation(1, 26);
+			return;
+		}
+		if (objNum == 101) {
+			switch(_objectVar[101]) {
+			case 0:
+				_player->loadAnimations("opendoor.nsp");
+				setupOtherNspAnimation(0,65);
+				playSound(31,5,-1);
+				_objectVar[101] = 1;
+				_console->printTosText(733);
+				break;
+			case 1:
+				_player->loadAnimations("opendoor.nsp");
+				setupOtherNspAnimation(0,65);
+				playSound(31,5,-1);
+				_objectVar[101] = 0;
+				_console->printTosText(737);
+				break;
+			case 2:
+				_inventory.addItem(5);
+				_console->printTosText(950);
+				_objectVar[101] = 3;
+				return;
+			case 3:
+				_player->loadAnimations("opendoor.nsp");
+				setupOtherNspAnimation(0,65);
+				playSound(31,5,-1);
+				_objectVar[101] = 4;
+				_console->printTosText(737);
+				break;
+			case 4:
+				_player->loadAnimations("opendoor.nsp");
+				setupOtherNspAnimation(0,65);
+				playSound(31,5,-1);
+				_objectVar[101] = 3;
+				_console->printTosText(733);
+				break;
+			default:
+				break;
+			}
+		}
+		if (objNum == 81) {
+			if (_objectVar[81] == 0) {
+				_console->printTosText(951);
+				for (int i = 0; i < Objects::MAX_MOVED_OBJECTS; i++) {
+					if (_objectVar.getMoveObjectRoom(i) == 251) {
+						_objectVar.setMoveObjectRoom(i, 254);
+						_inventory.addItem(i);
+					}
+				}
+				_objectVar[81] = 1;
+			} else {
+				_console->printTosText(952);
+			}
+			return;
+		}
+		if (objNum == 25) {
+			if (1 < _objectVar[80]) {
+				if (_objectVar[25] == 0) {
+					_objectVar[25] = 1;
+					_console->printTosText(953);
+					_inventory.addItem(25);
+				} else if (_objectVar[25] == 2) {
+					_objectVar[26] = 1;
+					_console->printTosText(954);
+					_inventory.addItem(26);
+					_objectVar[25] = _objectVar[25] + 1;
+				} else if (_objectVar[25] == 1 || _objectVar[25] == 3 ||
+						 _objectVar[25] == 101 || _objectVar[25] == 103) {
+					_console->printTosText(694);
+				}
+			}
+			return;
+		}
+		if (objNum < 42 && objNum != 22 && (objNum != 7 || _objectVar[7] == 1) &&
+			objNum != 31 && objNum != 33 && objNum != 32 && objNum != 86) {
+			_console->printTosText(955); // "You pick up the "
+			_console->addToCurrentLine(Common::String::format("%s.", _objectVar.getObjectName(objNum)));
+			_inventory.addItem(objNum);
+			_room->_collisionType = 0;
+			if (((objNum != 25) || (_objectVar[25] == 1)) || (_objectVar[25] == 101)) {
+				_room->removeObjectFromRoom(objNum);
+			}
+			_objectVar.setMoveObjectRoom(objNum, 254);
+			if (objNum == 28) {
+				_objectVar[28] = 1;
+			}
+		} else if (objNum == 86) {
+			_objectVar[86] = _objectVar[86] == 0 ? 1 : 0;
+			playSound(42,5,-1);
+		} else if (objNum == 22) {
+			if (_objectVar[22] < 4) {
+				_player->loadAnimations("push.nsp");
+				setupOtherNspAnimation(0, 18);
+			} else {
+				_console->printTosText(665);
+			}
+		} else if (objNum == 165) {
+			if (_objectVar[165] == 0) {
+				_objectVar[165] = 1;
+				_console->printTosText(639);
+				_inventory.addItem(13);
+			} else {
+				_console->printTosText(640);
+			}
+		} else if (objNum == 57) {
+			_player->loadAnimations("instrshp.nsp");
+			if (_objectVar[71] == 2) {
+				_console->printTosText(4);
+				setupOtherNspAnimation(1, 44);
+			} else {
+				setupOtherNspAnimation(0, 43);
+			}
+		} else if (objNum == 117) {
+			_player->loadAnimations("obslev.nsp");
+			setupOtherNspAnimation(1, 46);
+		}
+		// TODO more code here.
+		if (objNum == 139) {
+			_player->loadAnimations("ltladder.nsp");
+			setupOtherNspAnimation(0,10);
+		}
+		// TODO more code here.
+		return;
+	}
+	if (_objectVar[138] == 0) {
+		_console->printTosText(906);
+	}
+	else {
+		// TODO
 	}
 }
 
@@ -1921,4 +2342,31 @@ void DarkseedEngine::sargoanim() {
 	// TODO
 }
 
+void DarkseedEngine::playCutscene(const Common::String cutsceneId) {
+	debug("Play Cutscene %s", cutsceneId.c_str()); // TODO play cutscenes.
+}
+
+void DarkseedEngine::gancanim() {
+	// TODO
+}
+
+void DarkseedEngine::getPackageObj(int packageType) {
+	_console->printTosText(424);
+	if (packageType == 1) {
+		playCutscene("D");
+	}
+	if (packageType == 2) {
+		_inventory.addItem(15);
+		showFullscreenPic("shard.pic");
+	}
+	if (packageType == 3) {
+		_inventory.addItem(20);
+		showFullscreenPic("handle.pic");
+	}
+}
+
+void DarkseedEngine::playSound(int16 unk, uint8 unk1, int16 unk2) {
+	// TODO...
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 437e4b199b8..164fd730b8a 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -185,7 +185,8 @@ public:
 	void showFullscreenPic(const Common::String &filename);
 	void lookCode(int objNum);
 	void handleObjCollision(int objNum);
-
+	void playCutscene(const Common::String cutsceneId);
+	void playSound(int16 unk, uint8 unk1, int16 unk2);
 private:
 	void updateAnimation();
 	void advanceAnimationFrame(int nspAminIdx);
@@ -198,11 +199,13 @@ private:
 	void changeToRoom(int newRoomNumber);
 
 	void useCode(int objNum);
+	void getPackageObj(int packageType);
 	void wongame();
 	void getPackage(int state);
 	void printTime();
 	void keeperanim();
 	void sargoanim();
+	void gancanim();
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index 6e728253f29..a597a832ae0 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -130,6 +130,58 @@ static constexpr uint16 eyeDescriptionsTbl[] = {
 	671, 321, 163
 };
 
+static constexpr uint16 handDescriptionsTbl[] = {
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	791, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 652, 0,
+	729, 0, 0, 0,
+	0, 0, 0, 852,
+	0, 0, 0, 772,
+	0, 0, 846, 0,
+	0, 453, 0, 0,
+	484, 0, 0, 0,
+	0, 0, 0, 706,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 609,
+	611, 607, 605, 603,
+	601, 599, 597, 595,
+	593, 591, 589, 0,
+	0, 0, 0, 355,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 827,
+	839, 0, 798, 807,
+	803, 441, 449, 118,
+	260, 272, 306, 91,
+	162, 137, 377, 399,
+	415, 475, 478, 481,
+	0, 0, 999, 253,
+	0, 0, 171, 183,
+	213, 220, 285, 316,
+	329, 338, 338, 357,
+	516, 527, 534, 0,
+	548, 562, 571, 576,
+	614, 616, 621, 625,
+	637, 0, 642, 644,
+	646, 0, 674, 678,
+	681, 684, 689, 0,
+	726, 747, 0, 760,
+	766, 781, 788, 819,
+	823, 825, 0, 0,
+	863, 0, 881, 888,
+	892, 901, 0, 0,
+	672, 322, 164
+};
 
 static constexpr char objectNameTbl[199][21] = {
 	"Nothing.",
@@ -343,6 +395,13 @@ int Darkseed::Objects::getEyeDescriptionTosIdx(uint16 objNum) {
 	return eyeDescriptionsTbl[objNum];
 }
 
+int Darkseed::Objects::getHandDescriptionTosIdx(uint16 objNum) {
+	if (objNum >= MAX_OBJECTS) {
+		error("getHandDescriptionTosIdx: Object Index out of range! %d", objNum);
+	}
+	return handDescriptionsTbl[objNum];
+}
+
 int Darkseed::Objects::getMoveObjectRoom(uint16 idx) {
 	if (idx >= MAX_OBJECTS) {
 		error("getMoveObjectRoom: index out of range.");
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 1490f4b01d1..4b203ae107e 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -51,6 +51,7 @@ public:
 
 	Common::Point getMoveObjectPosition(uint8 objIdx);
 	int getEyeDescriptionTosIdx(uint16 objNum);
+	int getHandDescriptionTosIdx(uint16 objNum);
 
 	int getMoveObjectRoom(uint16 idx);
 	void setMoveObjectRoom(uint16 idx, uint8 value);


Commit: c876cb37117babd384c91c39ae3131856da0e15e
    https://github.com/scummvm/scummvm/commit/c876cb37117babd384c91c39ae3131856da0e15e
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: more useCode.

Changed paths:
    engines/darkseed/darkseed.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 33f45c86f88..a60c83aa5ad 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1286,6 +1286,21 @@ void DarkseedEngine::updateAnimation() {
 			_player->updateSprite();
 		}
 		break;
+	case 2:
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		} else {
+			_player->_position.x = 218;
+			_player->_position.y = 198;
+			_player->_direction = 2;
+			_player->updateSprite();
+			_player->_walkTarget.x = 218;
+			_player->_walkTarget.y = 198;
+			_objectVar[52] = 0;
+//			StopVOC(); TODO
+		}
+		break;
 	case 5: // goto sleep animation
 		_player->_position.x = 135;
 		_player->_position.y = 91;
@@ -1852,7 +1867,7 @@ void DarkseedEngine::useCode(int objNum) {
 			_objectVar[80] = (_objectVar[80] & 2) + ((_objectVar[80] & 1) == 0 ? 1 : 0);
 			return;
 		}
-		if (objNum == 59 || objNum == 78 && _objectVar[34] == 0) {
+		if ((objNum == 59 || objNum == 78) && _objectVar[34] == 0) {
 			return;
 		}
 		if (objNum == 100) {
@@ -2046,9 +2061,95 @@ void DarkseedEngine::useCode(int objNum) {
 		} else if (objNum == 117) {
 			_player->loadAnimations("obslev.nsp");
 			setupOtherNspAnimation(1, 46);
-		}
-		// TODO more code here.
-		if (objNum == 139) {
+		} else if (objNum == 62) {
+			if (((_objectVar[49] == 0) || (1 < _objectVar[62])) || (_currentDay != 1)) {
+				if (((_objectVar[49] == 0) || (1 < _objectVar[62])) || (_currentDay != 2)) {
+					if (((_objectVar[49] == 0) || (1 < _objectVar[62])) || (_currentDay != 3)) {
+						if (_objectVar[62] < 101) {
+//							LoadModeSong(9);
+							playSound(0,6,-1);
+							_objectVar[62] = 101;
+							_console->addTextLine("You turn on the music.");
+						} else if (_objectVar[62] == 101) {
+//							KillAllSound();
+//							TerminateRoomSong();
+							_objectVar[62] = 100;
+							_console->addTextLine("You turn off the music.");
+						}
+					} else {
+						_objectVar[62] = _objectVar[62] + 1;
+						_console->printTosText(921);
+					}
+				} else {
+					_objectVar[62] = _objectVar[62] + 1;
+					_console->printTosText(920);
+				}
+			} else {
+				_objectVar[62] = _objectVar[62] + 1;
+				_console->printTosText(919);
+			}
+		} else if (objNum == 63) {
+//			Ordinal_184(unaff_CS,(int)&_file_name,4192,(int)s_room33.nnn_1060_319f);
+//			_Room = 33;
+//			InitRoom();
+//			LoadRoomAndDumpPic();
+//			SetHeroSpriteNumber();
+		} else if (objNum == 83) {
+//			Ordinal_184(unaff_CS,(int)&_file_name,4192,(int)s_room28.nnn_1060_31ab);
+//			_Room = 28;
+//			InitRoom();
+//			LoadRoomAndDumpPic();
+//			SetHeroSpriteNumber();
+		} else if (objNum == 82) {
+			if (_room->_roomNumber == 41) {
+				_room->_roomNumber = 44;
+				_console->printTosText(956);
+			}
+			else {
+				_room->_roomNumber = 41;
+				_console->printTosText(957);
+			}
+//			LoadRoomAndDumpPic();
+//			InitRoom();
+//			SetHeroSpriteNumber();
+		} else if (objNum == 52) {
+//			_NoScroll = 0;
+			if (_objectVar[52] == 1) {
+				_player->loadAnimations("shower.nsp");
+				setupOtherNspAnimation(0, 2);
+				_console->printTosText(193);
+				playSound(2,4,-1);
+			} else {
+				_console->printTosText(194);
+			}
+		} else if (objNum == 59) {
+			if (_objectVar[59] == 2) {
+				_objectVar[59] = 1;
+				if (_room->_roomNumber == 0 || _room->_roomNumber == 9) {
+					_console->printTosText(409);
+				}
+			}
+			else {
+				if (_room->_roomNumber == 0 || _room->_roomNumber == 9) {
+					_console->printTosText(407);
+				}
+				_objectVar[59] = 2;
+			}
+		} else if (objNum == 78) {
+			if (_objectVar[78] == 2) {
+				_objectVar[78] = 1;
+				if (_room->_roomNumber == 0 || _room->_roomNumber == 9) {
+					_console->printTosText(409);
+				}
+			}
+			else {
+				playSound(41,5,-1);
+				if (_room->_roomNumber == 0 || _room->_roomNumber == 9) {
+					_console->printTosText(32);
+				}
+				_objectVar[78] = 2;
+			}
+		} else if (objNum == 139) {
 			_player->loadAnimations("ltladder.nsp");
 			setupOtherNspAnimation(0,10);
 		}


Commit: 91fdc1d241c2356c9bea5e3c11a1b01e8ad7ee7f
    https://github.com/scummvm/scummvm/commit/91fdc1d241c2356c9bea5e3c11a1b01e8ad7ee7f
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: more useCode.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index a60c83aa5ad..81dbd5d9196 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1422,6 +1422,19 @@ void DarkseedEngine::updateAnimation() {
 			_player->updateSprite();
 		}
 		break;
+	case 12:
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		} else {
+			_player->_position.x = 360;
+			_player->_position.y = 238;
+			_player->_walkTarget.x = 360;
+			_player->_walkTarget.y = 238;
+			_player->_direction = 3;
+			changeToRoom(2);
+		}
+		break;
 	case 16:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -2152,15 +2165,85 @@ void DarkseedEngine::useCode(int objNum) {
 		} else if (objNum == 139) {
 			_player->loadAnimations("ltladder.nsp");
 			setupOtherNspAnimation(0,10);
+		} else if (objNum == 76) {
+//			_NoScroll = 0;
+//			Ordinal_184(unaff_CS,(int)&_file_name,4192,(int)s_room3.nnn_1060_31e1);
+//			_Room = 3;
+//			LoadRoomAndDumpPic();
+//			InitRoom();
+//			SetHeroSpriteNumber();
+		} else if (objNum == 77) {
+			_player->loadAnimations("rtladder.nsp");
+			setupOtherNspAnimation(0, 12);
+		} else if (objNum == 66 && _objectVar[68] == 0) {
+			if (_objectVar[12] == 2) {
+				playSound(5,5,-1);
+				if (_objectVar[66] == 0) {
+					if (_objectVar[67] == 0 && _objectVar[68] == 0) {
+						_objectVar[66] = 1;
+					} else {
+						_objectVar[66] = 2;
+					}
+				} else {
+					_objectVar[66] = 0;
+				}
+			} else {
+				_console->addTextLine("You touch the surface of the ornate sigil.");
+			}
+		} else if (objNum == 67 && _objectVar[68] == 0) {
+			if (_objectVar[12] == 2) {
+				playSound(5,5,-1);
+				if (_objectVar[67] == 0) {
+					if (_objectVar[66] == 1 && _objectVar[68] == 0) {
+						_objectVar[67] = 1;
+					} else {
+						_objectVar[67] = 2;
+					}
+				} else {
+					_objectVar[67] = 0;
+				}
+			} else {
+				_console->addTextLine("You touch the surface of the ornate sigil.");
+			}
+		} else if ((objNum == 68) && (_objectVar[68] == 0)) {
+			if (_objectVar[12] == 2) {
+				if (true) {
+					if ((_objectVar[66] == 1) && (_objectVar[67] == 1)) {
+						playSound(13,5,-1);
+						_objectVar[68] = 1;
+						setupOtherNspAnimation(0,23);
+					} else {
+						_objectVar[68] = 2;
+					}
+				} else {
+					_objectVar[68] = 0;
+				}
+			} else {
+				_console->addTextLine("You touch the surface of the ornate sigil.");
+			}
 		}
-		// TODO more code here.
+		else if (objNum == 84) {
+			_console->printTosText(566);
+		}
+//		_NoScroll = 0;
 		return;
 	}
 	if (_objectVar[138] == 0) {
 		_console->printTosText(906);
 	}
 	else {
-		// TODO
+		_inventory.addItem(objNum);
+		_room->removeObjectFromRoom(objNum);
+		_objectVar[138] = 0;
+		updateDisplay();
+		if ((objNum == 7) && _currentDay == 1) {
+			_console->printTosText(905);
+			_objectVar[141] = 1;
+			_player->loadAnimations("delstore.nsp");
+			_objectVar.setMoveObjectPosition(141, {60, 221});
+			_objectVar.setMoveObjectRoom(7, 100);
+			_objectVar[7] = 1;
+		}
 	}
 }
 
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index a597a832ae0..3b60a8bc364 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -64,6 +64,13 @@ Common::Point Darkseed::Objects::getMoveObjectPosition(uint8 objIdx) {
 	return _moveObjectXY[objIdx];
 }
 
+void Darkseed::Objects::setMoveObjectPosition(uint8 objIdx, const Common::Point &newPoint) {
+	if (objIdx >= MAX_OBJECTS) {
+		error("setMoveObjectPosition: Object Index out of range! %d", objIdx);
+	}
+	_moveObjectXY[objIdx] = newPoint;
+}
+
 int16 &Darkseed::Objects::operator[](uint16 varIdx) {
 	if (varIdx >= MAX_OBJECTS) {
 		error("getVar: Object Index out of range! %d", varIdx);
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 4b203ae107e..06ae67a440f 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -50,6 +50,7 @@ public:
 	void setObjectRunningCode(int idx, int16 value);
 
 	Common::Point getMoveObjectPosition(uint8 objIdx);
+	void setMoveObjectPosition(uint8 objIdx, const Common::Point &newPoint);
 	int getEyeDescriptionTosIdx(uint16 objNum);
 	int getHandDescriptionTosIdx(uint16 objNum);
 


Commit: 018631b46f09c52881f48e79ac25b77d92a64852
    https://github.com/scummvm/scummvm/commit/018631b46f09c52881f48e79ac25b77d92a64852
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added trunk push logic

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 81dbd5d9196..6be5704da86 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1453,7 +1453,7 @@ void DarkseedEngine::updateAnimation() {
 		if (!isAnimFinished_maybe) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		}
-		if (_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]] == 3 && _currentDay != 0) {
+		if (_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]] == 3 && animFrameChanged) {
 			_console->printTosText(_objectVar[22] + 662);
 			_objectVar[22] = _objectVar[22] + 1;
 			if (_objectVar[22] == 3) {
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 8840d49056b..deeb2776010 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -723,6 +723,9 @@ bool Darkseed::Room::isOutside() {
 }
 
 void Darkseed::Room::runRoomObjects() {
+	if (_roomNumber == 61) {
+		drawTrunk();
+	}
 	if (_roomNumber == 0 && g_engine->_objectVar[78] == 2) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
 		g_engine->_sprites.addSpriteToDrawList(519, 80, &sprite, 255, sprite.width, sprite.height, false);
@@ -757,3 +760,69 @@ void Darkseed::Room::removeObjectFromRoom(int16 objNum) {
 		g_engine->_objectVar.setMoveObjectRoom(objNum, 253);
 	}
 }
+
+void Darkseed::Room::updateRoomObj(int16 objNum, int16 x, int16 width, int16 y, int16 height) {
+	for (auto &roomObj : _roomObj) {
+		if (roomObj.type == 0 && roomObj.objNum == objNum) {
+			roomObj.xOffset = x;
+			roomObj.yOffset = y;
+			roomObj.width = width;
+			roomObj.height = height;
+			return;
+		}
+	}
+
+	for (auto &roomObj : _roomObj) {
+		if (roomObj.type > 10) {
+			roomObj.type = 0;
+			roomObj.objNum = objNum;
+			roomObj.xOffset = x;
+			roomObj.yOffset = y;
+			roomObj.width = width;
+			roomObj.height = height;
+			return;
+		}
+	}
+}
+
+void Darkseed::Room::drawTrunk() {
+	int trunkXPos;
+	int trunkYPos;
+	int spriteIdx;
+  
+	if (g_engine->_objectVar[22] == 0) {
+		trunkXPos = 460;
+		trunkYPos = 132;
+	} else if (g_engine->_objectVar[22] == 1) {
+		trunkXPos = 458;
+		trunkYPos = 127;
+	} else if (g_engine->_objectVar[22] == 2) {
+		trunkXPos = 451;
+		trunkYPos = 117;
+	} else {
+		trunkXPos = 410;
+		trunkYPos = 98;
+	}
+
+	if (g_engine->_objectVar[42] == 1 || g_engine->_objectVar[42] == 2 || g_engine->_objectVar[42] == 3) {
+		spriteIdx = 1;
+	} else {
+		spriteIdx = 0;
+	}
+
+	const Sprite &sprite = _locationSprites.getSpriteAt(spriteIdx);
+	g_engine->sprite_y_scaling_threshold_maybe = 211;
+	calculateScaledSpriteDimensions(sprite.width, sprite.height, trunkYPos + sprite.height);
+	g_engine->sprite_y_scaling_threshold_maybe = 240;
+	updateRoomObj(42, trunkXPos + 20,6, trunkYPos + 34,8);
+	updateRoomObj(22, trunkXPos + 60,12, trunkYPos + 46,8);
+	g_engine->_sprites.addSpriteToDrawList(
+		trunkXPos,
+		trunkYPos + sprite.height - g_engine->scaledSpriteHeight,
+		&sprite,
+		254,
+		g_engine->scaledSpriteWidth,
+		g_engine->scaledSpriteHeight,
+		false);
+	return;
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index e3094111d27..d85d8576cd1 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -94,9 +94,11 @@ public:
 	bool isGiger();
 	void runRoomObjects();
 	void removeObjectFromRoom(int16 objNum);
+	void updateRoomObj(int16 objNum, int16 x, int16 width, int16 y, int16 height);
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);
+	void drawTrunk();
 };
 
 } // namespace Darkseed


Commit: c655cb8afae646cfaf91f7f921eeba35806b4dae
    https://github.com/scummvm/scummvm/commit/c655cb8afae646cfaf91f7f921eeba35806b4dae
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Work on room object sprites.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 6be5704da86..c5025376c86 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -902,6 +902,12 @@ void DarkseedEngine::changeToRoom(int newRoomNumber) {
 		}
 	}
 
+	if (!g_engine->isPlayingAnimation_maybe) {
+		g_engine->_player->updateSprite();
+	}
+	_room->initRoom();
+	updateDisplay();
+	// TODO load room song.
 	_room->printRoomDescriptionText();
 }
 
@@ -1592,10 +1598,13 @@ void DarkseedEngine::updateAnimation() {
 		} else {
 //			LoadModeSong(7); TODO
 			playSound(0, 6, -1);
-//			stuffplayer(); TODO
+			stuffPlayer();
 		}
 		break;
 	}
+	case 47:
+		_room->runAnim47();
+		break;
 	case 53 :
 	case 54 :
 	case 55 :
@@ -2553,4 +2562,22 @@ void DarkseedEngine::playSound(int16 unk, uint8 unk1, int16 unk2) {
 	// TODO...
 }
 
+void DarkseedEngine::nextFrame(int nspAminIdx) {
+	isAnimFinished_maybe = false;
+	spriteAnimCountdownTimer[nspAminIdx]--;
+	if (spriteAnimCountdownTimer[nspAminIdx] < 1) {
+		const Obt &anim = _player->_animations.getAnimAt(nspAminIdx);
+		animIndexTbl[nspAminIdx]++;
+		if (animIndexTbl[nspAminIdx] == anim.numFrames) {
+			animIndexTbl[nspAminIdx] = 0;
+			isAnimFinished_maybe = true;
+		}
+		spriteAnimCountdownTimer[nspAminIdx] = anim.frameDuration[animIndexTbl[nspAminIdx]];
+	}
+}
+
+void DarkseedEngine::stuffPlayer() {
+	// TODO
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 164fd730b8a..d6e0f603c81 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -106,8 +106,8 @@ public:
 	bool isAnimFinished_maybe = false;
 	bool animFrameChanged = false;
 	char prefsCutsceneId = 'I';
-	int animIndexTbl[20];
-	int spriteAnimCountdownTimer[20];
+	int animIndexTbl[30];
+	int spriteAnimCountdownTimer[30];
 
 	// Unknown variables
 	bool _doorEnabled = false;
@@ -187,6 +187,8 @@ public:
 	void handleObjCollision(int objNum);
 	void playCutscene(const Common::String cutsceneId);
 	void playSound(int16 unk, uint8 unk1, int16 unk2);
+	void nextFrame(int nspAminIdx);
+	void stuffPlayer();
 private:
 	void updateAnimation();
 	void advanceAnimationFrame(int nspAminIdx);
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index 3b60a8bc364..6f68fbe61cb 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -71,6 +71,13 @@ void Darkseed::Objects::setMoveObjectPosition(uint8 objIdx, const Common::Point
 	_moveObjectXY[objIdx] = newPoint;
 }
 
+void Darkseed::Objects::setMoveObjectX(uint8 objIdx, int16 xPos) {
+	if (objIdx >= MAX_OBJECTS) {
+		error("setMoveObjectX: Object Index out of range! %d", objIdx);
+	}
+	_moveObjectXY[objIdx].x = xPos;
+}
+
 int16 &Darkseed::Objects::operator[](uint16 varIdx) {
 	if (varIdx >= MAX_OBJECTS) {
 		error("getVar: Object Index out of range! %d", varIdx);
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 06ae67a440f..100d104be82 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -51,6 +51,7 @@ public:
 
 	Common::Point getMoveObjectPosition(uint8 objIdx);
 	void setMoveObjectPosition(uint8 objIdx, const Common::Point &newPoint);
+	void setMoveObjectX(uint8 objIdx, int16 xPos);
 	int getEyeDescriptionTosIdx(uint16 objNum);
 	int getHandDescriptionTosIdx(uint16 objNum);
 
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index deeb2776010..4b8b99a1e2a 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -47,11 +47,35 @@ Darkseed::Room::Room(int roomNumber) : _roomNumber(roomNumber) {
 	walkableLocationsMap.resize(16);
 	_roomObj.resize(30);
 
+	_locObjFrame.resize(30);
+	_locObjFrameTimer.resize(30);
+
 	if(!load()) {
 		error("Failed to load room %d", roomNumber);
 	}
 }
 
+void Darkseed::Room::initRoom() {
+	for (int iVar1 = 0; iVar1 < 30; iVar1 = iVar1 + 1) {
+		_locObjFrame[iVar1] = 0;
+		g_engine->animIndexTbl[iVar1] = 0;
+	}
+	if (g_engine->_objectVar[141] == 10) {
+		g_engine->_objectVar[141] = 11;
+	}
+	if (g_engine->_objectVar[45] < 3) {
+		g_engine->_objectVar.setMoveObjectX(19, 1000);
+	}
+	g_engine->_objectVar.setMoveObjectX(45, 230);
+	if (g_engine->_objectVar[45] < 3) {
+		g_engine->_objectVar[45] = 0;
+		g_engine->_objectVar.setMoveObjectPosition(19, {230,205});
+	}
+	if (g_engine->_objectVar[141] == 8) {
+		g_engine->_objectVar[141] = 7;
+	}
+}
+
 bool Darkseed::Room::load() {
 	Common::String filenameBase = getRoomFilenameBase(_roomNumber);
 	Common::String romFilename;
@@ -726,6 +750,246 @@ void Darkseed::Room::runRoomObjects() {
 	if (_roomNumber == 61) {
 		drawTrunk();
 	}
+//	for (auto &roomObj : _roomObj) {
+	for (int roomObjIdx = 0; roomObjIdx < _roomObj.size(); roomObjIdx++) {
+		auto &roomObj = _roomObj[roomObjIdx];
+		int xPos = roomObj.xOffset;
+		int yPos = roomObj.yOffset;
+		switch(roomObj.type) {
+		case 1:
+		case 3: {
+			//			debug("roomObj.objNum: %d", roomObj.objNum);
+			const Sprite &sprite = g_engine->_baseSprites.getSpriteAt(roomObj.spriteNum);
+			if (_roomNumber == 15 || _roomNumber == 16) {
+				g_engine->scaledSpriteWidth = sprite.width;
+				g_engine->scaledSpriteHeight = sprite.height;
+			} else {
+				calculateScaledSpriteDimensions(sprite.width, sprite.height, roomObj.yOffset + sprite.height);
+			}
+			if (((roomObj.spriteNum != 7) && (roomObj.spriteNum != 36)) && ((roomObj.spriteNum != 37 && (((roomObj.spriteNum != 38 && (roomObj.spriteNum != 39)) && (roomObj.spriteNum != 40))))) ) {
+				xPos = (sprite.width / 2 + xPos) - g_engine->scaledSpriteHeight / 2;
+			}
+			if (roomObj.spriteNum == 14) {
+				g_engine->_sprites.addSpriteToDrawList(
+					xPos,
+					(yPos + sprite.height) - g_engine->scaledSpriteHeight,
+					&sprite,
+					240 - (yPos + sprite.height),
+					g_engine->scaledSpriteWidth,
+					g_engine->scaledSpriteHeight,
+					false);
+			} else {
+				g_engine->_sprites.addSpriteToDrawList(
+					xPos,
+					(yPos + sprite.height) - g_engine->scaledSpriteHeight,
+					&sprite,
+					255,
+					sprite.width,
+					sprite.height,
+					false);
+			}
+			break;
+		}
+		case 2: {
+			int spriteNum = 0;
+			if (_roomNumber == 17 && g_engine->isPlayingAnimation_maybe && g_engine->otherNspAnimationType_maybe == 19 && _locObjFrame[roomObjIdx] == 4) {
+				advanceLocAnimFrame(roomObjIdx + 1);
+				spriteNum = _locationSprites.getAnimAt(1).frameNo[_locObjFrame[roomObjIdx + 1]];
+			} else if (_roomNumber == 16 && g_engine->isPlayingAnimation_maybe && g_engine->otherNspAnimationType_maybe == 35) {
+				// shop
+				g_engine->nextFrame(5);
+				spriteNum = g_engine->_player->_animations.getAnimAt(5).frameNo[g_engine->animIndexTbl[5]];
+			} else if (_roomNumber == 53) {
+				if (g_engine->_objectVar[79] == 4) {
+					g_engine->_objectVar[79] = 2;
+				}
+				bool frameAdvanced = advanceFrame(g_engine->_objectVar[79]);
+				const Obt &anim = _locationSprites.getAnimAt(g_engine->_objectVar[79]);
+				if (frameAdvanced) {
+					roomObj.xOffset += anim.deltaX[_locObjFrame[g_engine->_objectVar[79]]];
+					roomObj.yOffset += anim.deltaY[_locObjFrame[g_engine->_objectVar[79]]];
+				}
+				spriteNum = _locationSprites.getAnimAt(g_engine->_objectVar[79]).frameNo[_locObjFrame[g_engine->_objectVar[79]]];
+				if (_ObjRestarted) {
+					if (g_engine->_objectVar[79] == 1) {
+						g_engine->_objectVar[79] = 3;
+					}
+					if (g_engine->_objectVar[79] == 2) {
+						g_engine->stuffPlayer();
+					}
+				}
+			} else {
+				if (_roomNumber != 64 || g_engine->_currentTimeInSeconds < 64800) {
+					advanceLocAnimFrame(roomObjIdx);
+					// ForwardFrameOnObj(roomObjIdx);
+				}
+				spriteNum = _locationSprites.getAnimAt(_roomObj[roomObjIdx].spriteNum).frameNo[_locObjFrame[roomObjIdx]];
+			}
+
+			if (_roomNumber == 16 && g_engine->isPlayingAnimation_maybe && g_engine->otherNspAnimationType_maybe == 35) {
+				const Sprite &sprite = g_engine->_player->getSprite(spriteNum);
+				g_engine->_sprites.addSpriteToDrawList(
+					xPos,
+					yPos,
+					&sprite,
+					255,
+					sprite.width,
+					sprite.height,
+					false);
+			} else if (_roomNumber == 15) {
+				if (g_engine->_objectVar[28] == 2) {
+					const Sprite &sprite = _locationSprites.getSpriteAt(spriteNum);
+					g_engine->_sprites.addSpriteToDrawList(
+						xPos,
+						yPos,
+						&sprite,
+						240 - (yPos + sprite.height),
+						sprite.width,
+						sprite.height,
+						false);
+				}
+			} else if (_roomNumber == 57 && spriteNum < 6) {
+				if (g_engine->_previousRoomNumber == 54) {
+					const Sprite &sprite = _locationSprites.getSpriteAt(spriteNum);
+					g_engine->_sprites.addSpriteToDrawList(
+						xPos,
+						yPos,
+						&sprite,
+						255,
+						sprite.width,
+						sprite.height,
+						false);
+				}
+			} else if (_roomNumber == 58) {
+				const Sprite &sprite = _locationSprites.getSpriteAt(spriteNum);
+				if (g_engine->_objectVar[48] == 0) {
+					g_engine->_sprites.addSpriteToDrawList(
+						xPos,
+						yPos,
+						&sprite,
+						240 - (yPos + sprite.height),
+						sprite.width,
+						sprite.height,
+						false);
+				}
+				updateRoomObj(48, xPos, sprite.width, yPos, sprite.height);
+			} else if (_roomNumber == 5 && g_engine->isPlayingAnimation_maybe && g_engine->otherNspAnimationType_maybe == 7) {
+				const Sprite &sprite = _locationSprites.getSpriteAt(roomObj.spriteNum);
+				g_engine->_sprites.addSpriteToDrawList(
+					xPos,
+					yPos,
+					&sprite,
+					1,
+					sprite.width,
+					sprite.height,
+					false);
+			} else if (_roomNumber == 53) {
+				if (g_engine->_objectVar[79] != 3) {
+					const Sprite &sprite = _locationSprites.getSpriteAt(roomObj.spriteNum);
+					g_engine->_sprites.addSpriteToDrawList(
+						xPos,
+						yPos,
+						&sprite,
+						255,
+						sprite.width,
+						sprite.height,
+						false);
+				}
+			} else if (((((((_roomNumber == 6) || (_roomNumber == 5)) || (_roomNumber == 7)) ||
+						  ((_roomNumber == 32 || (_roomNumber == 26)))) ||
+						 ((_roomNumber == 64 || ((_roomNumber == 65 || (_roomNumber == 63)))))) ||
+						(_roomNumber == 66)) ||
+					   (((((((_roomNumber == 67 || (_roomNumber == 28)) || (_roomNumber == 37)) ||
+							((_roomNumber == 39 || (_roomNumber == 32)))) || (_roomNumber == 57)) ||
+						  ((_roomNumber == 60 || (_roomNumber == 44)))) ||
+						 ((_roomNumber == 57 || ((_roomNumber == 38 || (_roomNumber == 25)))))))) {
+				const Sprite &sprite = _locationSprites.getSpriteAt(spriteNum);
+				int playerLeftXPos = g_engine->_player->_position.x - g_engine->_player->getWidth() / 2;
+				int playerRightXPos = g_engine->_player->_position.x + g_engine->_player->getWidth() / 2;
+				if (_roomNumber == 63) {
+					playerLeftXPos = g_engine->_player->_position.x - 4;
+					playerRightXPos = g_engine->_player->_position.x + 4;
+				}
+				if (_roomNumber == 25) {
+					g_engine->_sprites.addSpriteToDrawList(
+						xPos,
+						yPos,
+						&sprite,
+						1,
+						sprite.width,
+						sprite.height,
+						false);
+				} else if ((_roomNumber != 64 || g_engine->_currentTimeInSeconds < 64801 || spriteNum == 3 || spriteNum > 13) &&
+						      (
+							   g_engine->isPlayingAnimation_maybe ||
+							   _locationSprites.getAnimAt(roomObj.spriteNum).numFrames > 1 ||
+							   (playerLeftXPos <= xPos + sprite.width && xPos <= playerRightXPos && g_engine->_player->_position.x <= xPos + sprite.width) ||
+							   g_engine->_objectVar[141] == 6 ||
+							   g_engine->_objectVar[141] == 12
+							  )
+						   ) {
+					g_engine->_sprites.addSpriteToDrawList(
+						xPos,
+						yPos,
+						&sprite,
+						240 - yPos + sprite.height,
+						sprite.width,
+						sprite.height,
+						false);
+				}
+			} else {
+				const Sprite &sprite = _locationSprites.getSpriteAt(spriteNum);
+				g_engine->_sprites.addSpriteToDrawList(
+					xPos,
+					yPos,
+					&sprite,
+					255,
+					sprite.width,
+					sprite.height,
+					false);
+			}
+			if (_roomNumber == 57 && g_engine->_previousRoomNumber == 54 && spriteNum < 6) {
+				g_engine->_objectVar[56] = spriteNum;
+				if (_ObjRestarted) {
+					g_engine->_objectVar[56] = 6;
+				}
+			}
+
+
+//			debug("type 2 objNum %d", roomObj.objNum);
+
+			break;
+		}
+		default:
+			break;
+		}
+	}
+	for (int i = 0; i < Objects::MAX_MOVED_OBJECTS; i++) {
+		if (g_engine->_objectVar.getMoveObjectRoom(i) == _roomNumber) {
+			const Sprite &sprite = g_engine->_baseSprites.getSpriteAt(i);
+			Common::Point pos = g_engine->_objectVar.getMoveObjectPosition(i);
+			calculateScaledSpriteDimensions(sprite.width, sprite.height, pos.y + sprite.height);
+			g_engine->_sprites.addSpriteToDrawList((pos.x + sprite.width / 2) - g_engine->scaledSpriteWidth / 2, pos.y, &sprite, 255, sprite.width, sprite.height, false);
+		}
+	}
+
+	if (_roomNumber == 59 && g_engine->_objectVar[190] > 1) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(0);
+		g_engine->_sprites.addSpriteToDrawList(490, 70, &sprite, 255, sprite.width, sprite.height, false);
+	}
+	if (_roomNumber == 56 && g_engine->_objectVar[187] == 1) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(3);
+		g_engine->_sprites.addSpriteToDrawList(490, 70, &sprite, 255, sprite.width, sprite.height, false);
+	}
+	if (_roomNumber == 30 && g_engine->_objectVar[29] == 2) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(0);
+		g_engine->_sprites.addSpriteToDrawList(201, 140, &sprite, 255, sprite.width, sprite.height, false);
+		updateRoomObj(113, 201, sprite.width, 140, sprite.height);
+	}
+	if (_roomNumber == 18 && (g_engine->_objectVar[80] == 0 || g_engine->_objectVar[80] == 2)) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(0);
+		g_engine->_sprites.addSpriteToDrawList(361, 127, &sprite, 255, sprite.width, sprite.height, false);
+	}
 	if (_roomNumber == 0 && g_engine->_objectVar[78] == 2) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
 		g_engine->_sprites.addSpriteToDrawList(519, 80, &sprite, 255, sprite.width, sprite.height, false);
@@ -741,6 +1005,31 @@ void Darkseed::Room::runRoomObjects() {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
 		g_engine->_sprites.addSpriteToDrawList(69, 104, &sprite, 255, sprite.width, sprite.height, false);
 	}
+	if (_roomNumber == 9 && g_engine->_objectVar[59] == 2) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(0);
+		g_engine->_sprites.addSpriteToDrawList(519, 77, &sprite, 255, sprite.width, sprite.height, false);
+	}
+	if (g_engine->_player->_isAutoWalkingToBed && g_engine->_player->_position.x < 150 && _roomNumber == 3) {
+		g_engine->_objectVar[59] = 2;
+	}
+	if (_roomNumber == 3 && g_engine->_objectVar[59] == 2) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(0);
+		g_engine->_sprites.addSpriteToDrawList(69, 105, &sprite, 255, sprite.width, sprite.height, false);
+	}
+	if (_roomNumber == 17) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(21);
+		g_engine->_sprites.addSpriteToDrawList(69, 91, &sprite, 240 - (91 + sprite.height), sprite.width, sprite.height, false);
+	}
+	if (_roomNumber == 32 && g_engine->_objectVar[23] != 0) { // rope garden room
+		const Sprite &sprite = _locationSprites.getSpriteAt(15);
+		g_engine->_sprites.addSpriteToDrawList(338, 46, &sprite, 255, sprite.width, sprite.height, false);
+		updateRoomObj(102, 338, sprite.width, 46, sprite.height);
+	}
+	if (_roomNumber == 13 && g_engine->_objectVar[23] != 0) { // rope balcony
+		const Sprite &sprite = _locationSprites.getSpriteAt(0);
+		g_engine->_sprites.addSpriteToDrawList(473, 116, &sprite, 255, sprite.width, sprite.height, false);
+	}
+	// TODO more code here
 }
 
 bool Darkseed::Room::isGiger() {
@@ -826,3 +1115,46 @@ void Darkseed::Room::drawTrunk() {
 		false);
 	return;
 }
+
+void Darkseed::Room::advanceLocAnimFrame(int roomObjIdx) {
+	const Obt &anim = _locationSprites.getAnimAt(_roomObj[roomObjIdx].spriteNum);
+	_ObjRestarted = false;
+	_locObjFrameTimer[roomObjIdx]--;
+	if (_locObjFrameTimer[roomObjIdx] < 1) {
+		_locObjFrame[roomObjIdx]++;
+		if (_locObjFrame[roomObjIdx] == anim.numFrames) {
+			_locObjFrame[roomObjIdx] = 0;
+			_ObjRestarted = true;
+		}
+		_locObjFrameTimer[roomObjIdx] = anim.frameDuration[_locObjFrame[roomObjIdx]];
+	}
+}
+
+bool Darkseed::Room::advanceFrame(int animIdx) {
+	bool frameAdvanced = false;
+	const Obt &anim = _locationSprites.getAnimAt(animIdx);
+	_ObjRestarted = false;
+	_locObjFrameTimer[animIdx]--;
+	if (_locObjFrameTimer[animIdx] < 1) {
+		frameAdvanced = true;
+		_locObjFrame[animIdx]++;
+		if (_locObjFrame[animIdx] == anim.numFrames) {
+			_locObjFrame[animIdx] = 0;
+			_ObjRestarted = true;
+		}
+		_locObjFrameTimer[animIdx] = anim.frameDuration[_locObjFrame[animIdx]];
+	}
+	return frameAdvanced;
+}
+
+void Darkseed::Room::runAnim47() {
+	advanceFrame(2);
+	if (!_ObjRestarted) {
+		g_engine->_player->_frameIdx = _locationSprites.getAnimAt(2).frameNo[_locObjFrame[2]];
+	} else {
+		g_engine->_objectVar[79] = 1;
+		g_engine->isPlayingAnimation_maybe = false;
+		g_engine->_inventory.removeItem(19);
+		g_engine->_objectVar.setMoveObjectRoom(19, 100);
+	}
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index d85d8576cd1..e58a3fa0c01 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -60,6 +60,9 @@ public:
 	Pic pic;
 	Pal _pal;
 	Nsp _locationSprites;
+	Common::Array<int16> _locObjFrame;
+	Common::Array<int16> _locObjFrameTimer;
+	bool _ObjRestarted = false;
 
 	Common::Array<RoomExit> room1;
 	Common::Array<RoomStruct2> walkableLocationsMap;
@@ -72,6 +75,7 @@ public:
 public:
 	explicit Room(int roomNumber);
 
+	void initRoom();
 	void draw();
 
 	void update();
@@ -95,10 +99,13 @@ public:
 	void runRoomObjects();
 	void removeObjectFromRoom(int16 objNum);
 	void updateRoomObj(int16 objNum, int16 x, int16 width, int16 y, int16 height);
+	bool advanceFrame(int animIdx);
+	void runAnim47();
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);
 	void drawTrunk();
+	void advanceLocAnimFrame(int roomObjIdx);
 };
 
 } // namespace Darkseed


Commit: 47bddde6d724bb881c4e8d5845c786ed4322ffe3
    https://github.com/scummvm/scummvm/commit/47bddde6d724bb881c4e8d5845c786ed4322ffe3
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Work on room object sprites.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index c5025376c86..63db98a6758 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1653,6 +1653,14 @@ void DarkseedEngine::updateAnimation() {
 		} else {
 			_player->_direction = 2;
 		}
+	case 65:
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+		} else {
+			_player->updateSprite();
+		}
+		break;
 	default:
 		error("Unhandled animation type! %d", otherNspAnimationType_maybe);
 	}
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 4b8b99a1e2a..f56337c1bf0 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -1029,7 +1029,115 @@ void Darkseed::Room::runRoomObjects() {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
 		g_engine->_sprites.addSpriteToDrawList(473, 116, &sprite, 255, sprite.width, sprite.height, false);
 	}
-	// TODO more code here
+	if (_roomNumber == 14) { // tuttle tome
+		if (g_engine->_objectVar[99] == 0) {
+			if (!g_engine->isPlayingAnimation_maybe || g_engine->otherNspAnimationType_maybe != 23) {
+				const Sprite &sprite = _locationSprites.getSpriteAt(g_engine->_objectVar[66] != 0 ? 1 : 0);
+				g_engine->_sprites.addSpriteToDrawList(245, 140, &sprite, 255, sprite.width, sprite.height, false);
+				const Sprite &sprite1 = _locationSprites.getSpriteAt(g_engine->_objectVar[67] == 0 ? 2 : 3);
+				g_engine->_sprites.addSpriteToDrawList(295, 93, &sprite1, 255, sprite1.width, sprite1.height, false);
+				const Sprite &sprite2 = _locationSprites.getSpriteAt(g_engine->_objectVar[68] == 0 ? 4 : 5);
+				g_engine->_sprites.addSpriteToDrawList(334, 153, &sprite2, 255, sprite2.width, sprite2.height, false);
+			} else {
+				advanceLocAnimFrame(0);
+				if (!_ObjRestarted) {
+					const Sprite &sprite = _locationSprites.getSpriteAt(_locationSprites.getAnimAt(0).frameNo[_locObjFrame[0]]);
+					g_engine->_sprites.addSpriteToDrawList(245, 93, &sprite, 255, sprite.width, sprite.height, false);
+				} else {
+					const Sprite &sprite = _locationSprites.getSpriteAt(9);
+					g_engine->_sprites.addSpriteToDrawList(245, 93, &sprite, 255, sprite.width, sprite.height, false);
+				}
+			}
+		} else {
+			const Sprite &sprite = _locationSprites.getSpriteAt(9);
+			g_engine->_sprites.addSpriteToDrawList(245, 93, &sprite, 255, sprite.width, sprite.height, false);
+		}
+	}
+	if (_roomNumber == 34) { // in car
+		if (g_engine->_objectVar[86] != 0) {
+			const Sprite &sprite = _locationSprites.getSpriteAt(0);
+			g_engine->_sprites.addSpriteToDrawList(470, 124, &sprite, 255, sprite.width, sprite.height, false);
+		}
+		if (g_engine->_objectVar[71] != 0) {
+			const Sprite &sprite = _locationSprites.getSpriteAt(26);
+			g_engine->_sprites.addSpriteToDrawList(261, 165, &sprite, 255, sprite.width, sprite.height, false);
+		}
+	}
+	if (_roomNumber == 33) { // in garage
+		if (g_engine->isPlayingAnimation_maybe && g_engine->otherNspAnimationType_maybe == 25) {
+			const Sprite &sprite = _locationSprites.getSpriteAt(0);
+			g_engine->_sprites.addSpriteToDrawList(370, 128, &sprite, 255, sprite.width, sprite.height, false);
+		}
+		if (g_engine->_objectVar[101] >= 1 && g_engine->_objectVar[101] <= 3) {
+			const Sprite &sprite = _locationSprites.getSpriteAt(1);
+			g_engine->_sprites.addSpriteToDrawList(488, 127, &sprite, 255, sprite.width, sprite.height, false);
+		}
+	}
+	if (_roomNumber == 9) { // study
+		int moveObj = g_engine->_objectVar.getMoveObjectRoom(34);
+		if (moveObj == 100 || (moveObj >= 252 && moveObj <= 254)) {
+			const Sprite &sprite = _locationSprites.getSpriteAt(2);
+			g_engine->_sprites.addSpriteToDrawList(322, 147, &sprite, 255, sprite.width, sprite.height, false);
+		}
+	}
+	if (_roomNumber == 7 && g_engine->_objectVar[137] == 0) { // mirror
+		const Sprite &sprite = _locationSprites.getSpriteAt(8);
+		g_engine->_sprites.addSpriteToDrawList(455, 149, &sprite, 255, sprite.width, sprite.height, false);
+	}
+	if (_roomNumber == 62 && g_engine->_objectVar[25] != 0) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(0);
+		g_engine->_sprites.addSpriteToDrawList(291, 185, &sprite, 255, sprite.width, sprite.height, false);
+	}
+	if (_roomNumber == 11 && g_engine->_currentTimeInSeconds > 64800) { // street
+		const Sprite &sprite = _locationSprites.getSpriteAt(0);
+		g_engine->_sprites.addSpriteToDrawList(424, 182, &sprite, 255, sprite.width, sprite.height, false);
+	}
+	if (_roomNumber == 64 && g_engine->_currentTimeInSeconds > 64800) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(0);
+		g_engine->_sprites.addSpriteToDrawList(212, 124, &sprite, 255, sprite.width, sprite.height, false);
+		const Sprite &sprite2 = _locationSprites.getSpriteAt(1);
+		g_engine->_sprites.addSpriteToDrawList(305, 124, &sprite2, 255, sprite2.width, sprite2.height, false);
+		const Sprite &sprite3 = _locationSprites.getSpriteAt(2);
+		g_engine->_sprites.addSpriteToDrawList(322, 138, &sprite3, 255, sprite3.width, sprite3.height, false);
+	}
+	if (_roomNumber == 39 && g_engine->_objectVar[117] != 0) {
+		const Sprite &sprite = _locationSprites.getSpriteAt(12);
+		g_engine->_sprites.addSpriteToDrawList(190, 68, &sprite, 255, sprite.width, sprite.height, false);
+	}
+	if (_roomNumber == 8) { // kitchen
+		if (g_engine->_objectVar[104] != 0) {
+			const Sprite &sprite = _locationSprites.getSpriteAt(0);
+			g_engine->_sprites.addSpriteToDrawList(194, 162, &sprite, 255, sprite.width, sprite.height, false);
+		}
+		if (g_engine->_objectVar[105] != 0) {
+			const Sprite &sprite = _locationSprites.getSpriteAt(1);
+			g_engine->_sprites.addSpriteToDrawList(230, 162, &sprite, 255, sprite.width, sprite.height, false);
+		}
+		if (g_engine->_objectVar[106] != 0) {
+			const Sprite &sprite = _locationSprites.getSpriteAt(2);
+			g_engine->_sprites.addSpriteToDrawList(266, 162, &sprite, 255, sprite.width, sprite.height, false);
+		}
+		if (g_engine->_objectVar[107] != 0) {
+			const Sprite &sprite = _locationSprites.getSpriteAt(3);
+			g_engine->_sprites.addSpriteToDrawList(302, 162, &sprite, 255, sprite.width, sprite.height, false);
+		}
+		if (g_engine->_objectVar[108] != 0) {
+			const Sprite &sprite = _locationSprites.getSpriteAt(4);
+			g_engine->_sprites.addSpriteToDrawList(452, 158, &sprite, 255, sprite.width, sprite.height, false);
+		}
+		if (g_engine->_objectVar[109] != 0) {
+			const Sprite &sprite = _locationSprites.getSpriteAt(5);
+			g_engine->_sprites.addSpriteToDrawList(300, 151, &sprite, 255, sprite.width, sprite.height, false);
+		}
+		if (g_engine->_objectVar[110] != 0) { // tap drip
+			const Sprite &sprite = _locationSprites.getSpriteAt((g_engine->counter_2c85_888b & 1) + 6); // TODO double check counter_2c85_888b is actually _ConstantTick
+			g_engine->_sprites.addSpriteToDrawList(266, 141, &sprite, 255, sprite.width, sprite.height, false);
+		}
+	}
+	if (_roomNumber == 7 && g_engine->_objectVar[137] == 2) {
+		const Sprite &sprite = g_engine->_player->_animations.getSpriteAt(12);
+		g_engine->_sprites.addSpriteToDrawList(428, 78, &sprite, 255, sprite.width, sprite.height, false);
+	}
 }
 
 bool Darkseed::Room::isGiger() {


Commit: b9dd57b0a8eb7ee61f92434c8739ed7335712511
    https://github.com/scummvm/scummvm/commit/b9dd57b0a8eb7ee61f92434c8739ed7335712511
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Open/close cupboards and oven.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 63db98a6758..86ba2264650 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1263,7 +1263,7 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		break;
 	case 57:
 	case 58:
-//		PlaySound(48,5,-1);
+		playSound(48,5,-1);
 		break;
 	case 63:
 		_player->_position.x = 249;
@@ -1605,6 +1605,26 @@ void DarkseedEngine::updateAnimation() {
 	case 47:
 		_room->runAnim47();
 		break;
+	case 48:
+	case 49:
+	case 50:
+	case 51:
+	case 52:
+		// open/close cupbords, oven
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+		}
+		else {
+			if (otherNspAnimationType_maybe == 52) {
+				_objectVar[108] = (_objectVar[108] == 0) ? 1 : 0;
+			}
+			else {
+				_objectVar[56 + otherNspAnimationType_maybe] = _objectVar[56 + otherNspAnimationType_maybe] == 0 ? 1 : 0;
+			}
+			playSound(42,5,-1);
+		}
+		break;
 	case 53 :
 	case 54 :
 	case 55 :
@@ -1653,6 +1673,7 @@ void DarkseedEngine::updateAnimation() {
 		} else {
 			_player->_direction = 2;
 		}
+		break;
 	case 65:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index f56337c1bf0..3a54f83ba36 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -750,7 +750,6 @@ void Darkseed::Room::runRoomObjects() {
 	if (_roomNumber == 61) {
 		drawTrunk();
 	}
-//	for (auto &roomObj : _roomObj) {
 	for (int roomObjIdx = 0; roomObjIdx < _roomObj.size(); roomObjIdx++) {
 		auto &roomObj = _roomObj[roomObjIdx];
 		int xPos = roomObj.xOffset;
@@ -821,7 +820,6 @@ void Darkseed::Room::runRoomObjects() {
 			} else {
 				if (_roomNumber != 64 || g_engine->_currentTimeInSeconds < 64800) {
 					advanceLocAnimFrame(roomObjIdx);
-					// ForwardFrameOnObj(roomObjIdx);
 				}
 				spriteNum = _locationSprites.getAnimAt(_roomObj[roomObjIdx].spriteNum).frameNo[_locObjFrame[roomObjIdx]];
 			}


Commit: b3965fd5e37c9af6eb4917a65ab2421bfec5dfec
    https://github.com/scummvm/scummvm/commit/b3965fd5e37c9af6eb4917a65ab2421bfec5dfec
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Room entry animations.

Changed paths:
    engines/darkseed/darkseed.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 86ba2264650..34f967212a2 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -882,6 +882,38 @@ void DarkseedEngine::changeToRoom(int newRoomNumber) {
 	} else if (newRoomNumber == 11 && _previousRoomNumber == 15) {
 		_player->loadAnimations("rm11strs.nsp");
 		setupOtherNspAnimation(1,56);
+	} else if (newRoomNumber == 46 && _previousRoomNumber == 60 && _objectVar[57] == 1) {
+		_console->printTosText(62);
+		// TODO wait logic here.
+		g_engine->playCutscene("E");
+		return;
+	} else if (newRoomNumber == 7 && _previousRoomNumber == 38) {
+		_player->loadAnimations("mirror.nsp");
+		setupOtherNspAnimation(1,28);
+		if (_objectVar[47] == 0 && _currentDay == 3 && _objectVar[51] == 1) {
+			_objectVar.setObjectRunningCode(47, 2);
+		}
+	} else if ((newRoomNumber == 38) && (_previousRoomNumber == 7)) {
+		_player->loadAnimations("darkout.nsp");
+		setupOtherNspAnimation(1, 42);
+	} else if ((_previousRoomNumber == 2) && (newRoomNumber == 3)) {
+		_player->loadAnimations("rtladder.nsp");
+		setupOtherNspAnimation(1, 13);
+	} else if ((_previousRoomNumber == 61) && (newRoomNumber == 5)) {
+		_player->loadAnimations("ltladder.nsp");
+		setupOtherNspAnimation(1, 11);
+	} else if ((_previousRoomNumber == 41 && newRoomNumber == 44) || (_previousRoomNumber == 44 && newRoomNumber == 41)) {
+		_player->loadAnimations("beamer.nsp");
+		setupOtherNspAnimation(1, 58);
+		for (auto &exit : _room->room1) {
+			if (exit.roomNumber == _previousRoomNumber) {
+				_player->_position.x = exit.x + exit.width / 2;
+				_player->_position.y = exit.y;
+				_player->_direction = exit.direction;
+				_player->updatePlayerPositionAfterRoomChange();
+				_player->_walkTarget = _player->_position;
+			}
+		}
 	}
 	// TODO a bunch of other room codes here.
 	else if (newRoomNumber != 0x22 && (newRoomNumber < 0x13 || newRoomNumber > 0x17)) {
@@ -1441,6 +1473,19 @@ void DarkseedEngine::updateAnimation() {
 			changeToRoom(2);
 		}
 		break;
+	case 13:
+		advanceAnimationFrame(1);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
+		} else {
+			_player->_position.x = 450;
+			_player->_position.y = 217;
+			_player->_walkTarget.x = 450;
+			_player->_walkTarget.y = 217;
+			_player->_direction = 3;
+			_player->updateSprite();
+		}
+		break;
 	case 16:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -1537,6 +1582,18 @@ void DarkseedEngine::updateAnimation() {
 			changeToRoom(38);
 		}
 		break;
+	case 28: // step out of mirror normal world
+		advanceAnimationFrame(1);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
+		} else {
+			_player->_position.x = 418;
+			_player->_position.y = 170;
+			_player->_direction = 3;
+			_player->updateSprite();
+			_player->_walkTarget = _player->_position;
+		}
+		break;
 	case 30:
 	case 31: {
 		int animIdx = otherNspAnimationType_maybe - 30;
@@ -1567,12 +1624,24 @@ void DarkseedEngine::updateAnimation() {
 	case 41:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
 			changeToRoom(7);
 		}
 		break;
+	case 42: // step out of mirror giger world
+		advanceAnimationFrame(1);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
+		} else {
+			_player->_position.x = 456;
+			_player->_position.y = 173;
+			_player->_direction = 3;
+			_player->updateSprite();
+			_player->_walkTarget = _player->_position;
+		}
+		break;
 	case 43:
 	case 44:
 	case 45:
@@ -1667,8 +1736,9 @@ void DarkseedEngine::updateAnimation() {
 	case 58:
 		advanceAnimationFrame((otherNspAnimationType_maybe - 57) & 1);
 		if (!isAnimFinished_maybe) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]; //_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		} else if (otherNspAnimationType_maybe == 57) {
+			_previousRoomNumber = _room->_roomNumber;
 			changeToRoom(_room->_roomNumber == 41 ? 44 : 41);
 		} else {
 			_player->_direction = 2;


Commit: 6bd58ba338527155550be8d8928375835342d013
    https://github.com/scummvm/scummvm/commit/6bd58ba338527155550be8d8928375835342d013
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Update engine to latest master

Changed paths:
    engines/darkseed/detection.cpp
    engines/darkseed/detection.h
    engines/darkseed/img.cpp
    engines/darkseed/img.h
    engines/darkseed/metaengine.h
    engines/darkseed/nsp.cpp
    engines/darkseed/nsp.h
    engines/darkseed/pal.cpp
    engines/darkseed/pal.h
    engines/darkseed/pic.cpp
    engines/darkseed/pic.h
    engines/darkseed/player.cpp
    engines/darkseed/player.h
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/detection.cpp b/engines/darkseed/detection.cpp
index c7231b07a0b..39ccbbf73c2 100644
--- a/engines/darkseed/detection.cpp
+++ b/engines/darkseed/detection.cpp
@@ -38,8 +38,7 @@ const DebugChannelDef DarkseedMetaEngineDetection::debugFlagList[] = {
 	DEBUG_CHANNEL_END
 };
 
-DarkseedMetaEngineDetection::DarkseedMetaEngineDetection() : AdvancedMetaEngineDetection(Darkseed::gameDescriptions,
-	sizeof(ADGameDescription), Darkseed::darkseedGames) {
+DarkseedMetaEngineDetection::DarkseedMetaEngineDetection() : AdvancedMetaEngineDetection(Darkseed::gameDescriptions, Darkseed::darkseedGames) {
 }
 
 REGISTER_PLUGIN_STATIC(DARKSEED_DETECTION, PLUGIN_TYPE_ENGINE_DETECTION, DarkseedMetaEngineDetection);
diff --git a/engines/darkseed/detection.h b/engines/darkseed/detection.h
index 16d77abdb30..36c7e3a3a5d 100644
--- a/engines/darkseed/detection.h
+++ b/engines/darkseed/detection.h
@@ -42,7 +42,7 @@ extern const ADGameDescription gameDescriptions[];
 
 } // End of namespace Darkseed
 
-class DarkseedMetaEngineDetection : public AdvancedMetaEngineDetection {
+class DarkseedMetaEngineDetection : public AdvancedMetaEngineDetection<ADGameDescription> {
 	static const DebugChannelDef debugFlagList[];
 
 public:
diff --git a/engines/darkseed/img.cpp b/engines/darkseed/img.cpp
index 038f3a451ea..dc588366ac5 100644
--- a/engines/darkseed/img.cpp
+++ b/engines/darkseed/img.cpp
@@ -25,7 +25,7 @@
 
 namespace Darkseed {
 
-bool Img::load(const Common::String &filename) {
+bool Img::load(const Common::Path &filename) {
 	Common::File file;
 	if(!file.open(filename)) {
 		return false;
@@ -33,7 +33,7 @@ bool Img::load(const Common::String &filename) {
 	bool ret = load(file);
 	file.close();
 	if (ret) {
-		debug("Loaded %s (%d,%d) (%d,%d) %x", filename.c_str(), x, y, width, height, mode);
+		debug("Loaded %s (%d,%d) (%d,%d) %x", filename.toString().c_str(), x, y, width, height, mode);
 	}
 	return ret;
 }
diff --git a/engines/darkseed/img.h b/engines/darkseed/img.h
index d8696edc3d8..0da31cc6c7a 100644
--- a/engines/darkseed/img.h
+++ b/engines/darkseed/img.h
@@ -36,7 +36,7 @@ private:
 	byte mode;
 	Common::Array<uint8> pixels;
 public:
-	bool load(const Common::String &filename);
+	bool load(const Common::Path &filename);
 	bool load(Common::SeekableReadStream &readStream);
 	bool loadWithoutPosition(Common::SeekableReadStream &readStream);
 
diff --git a/engines/darkseed/metaengine.h b/engines/darkseed/metaengine.h
index 05a22abbb60..7cbea9d8fc2 100644
--- a/engines/darkseed/metaengine.h
+++ b/engines/darkseed/metaengine.h
@@ -24,7 +24,7 @@
 
 #include "engines/advancedDetector.h"
 
-class DarkseedMetaEngine : public AdvancedMetaEngine {
+class DarkseedMetaEngine : public AdvancedMetaEngine<ADGameDescription> {
 public:
 	const char *getName() const override;
 
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index 1019a9d99b2..d5fb0cc120f 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -119,17 +119,18 @@ void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destH
 	}
 }
 
-bool Darkseed::Nsp::load(const Common::String &filename) {
+bool Darkseed::Nsp::load(const Common::Path &filename) {
 	Common::File file;
-	Common::String filePath = g_engine->getRoomFilePath(filename);
+	Common::Path filePath = g_engine->getRoomFilePath(filename);
 	if(!file.open(filePath)) {
 		return false;
 	}
 	bool ret = load(file);
 	file.close();
 	if (ret) {
-		debug("Loaded %s", filePath.c_str());
-		Common::String obtFilename = filePath.substr(0, filePath.size() - 4) + ".obt";
+		Common::String filePathStr = filePath.toString();
+		debug("Loaded %s", filePathStr.c_str());
+		Common::Path obtFilename = Common::Path(filePathStr.substr(0, filePathStr.size() - 4) + ".obt");
 		ret = loadObt(obtFilename);
 	}
 	return ret;
@@ -160,7 +161,7 @@ const Darkseed::Sprite &Darkseed::Nsp::getSpriteAt(int index) {
 	return frames[index];
 }
 
-bool Darkseed::Nsp::loadObt(const Common::String &filename) {
+bool Darkseed::Nsp::loadObt(const Common::Path &filename) {
 	Common::File file;
 	if(!file.open(filename)) {
 		return false;
@@ -189,7 +190,7 @@ bool Darkseed::Nsp::loadObt(const Common::String &filename) {
 
 	file.close();
 
-	debug("Loaded %s", filename.c_str());
+	debug("Loaded %s", filename.toString().c_str());
 	return true;
 }
 
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
index 8a6b9bed96a..5142ed57adb 100644
--- a/engines/darkseed/nsp.h
+++ b/engines/darkseed/nsp.h
@@ -59,13 +59,13 @@ private:
 	Common::Array<Obt> animations;
 
 public:
-	bool load(const Common::String &filename);
+	bool load(const Common::Path &filename);
 	const Sprite &getSpriteAt(int index);
 	const Obt &getAnimAt(int index);
 
 private:
 	bool load(Common::SeekableReadStream &readStream);
-	bool loadObt(const Common::String &filename);
+	bool loadObt(const Common::Path &filename);
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/pal.cpp b/engines/darkseed/pal.cpp
index 230a035e6c8..bd158476672 100644
--- a/engines/darkseed/pal.cpp
+++ b/engines/darkseed/pal.cpp
@@ -21,13 +21,13 @@
 
 #include "pal.h"
 #include "darkseed.h"
-#include "graphics/palette.h"
+#include "graphics/paletteman.h"
 
 namespace Darkseed {
 
 #define DARKSEED_NUM_PAL_ENTRIES 16
 #define DARKSEED_PAL_SIZE DARKSEED_NUM_PAL_ENTRIES * 3
-bool Pal::load(const Common::String &filename) {
+bool Pal::load(const Common::Path &filename) {
 	Common::File file;
 	if(!file.open(filename)) {
 		return false;
diff --git a/engines/darkseed/pal.h b/engines/darkseed/pal.h
index f88432b16e6..f448c927203 100644
--- a/engines/darkseed/pal.h
+++ b/engines/darkseed/pal.h
@@ -22,7 +22,7 @@
 #ifndef DARKSEED_PAL_H
 #define DARKSEED_PAL_H
 
-#include "common/str.h"
+#include "common/path.h"
 namespace Darkseed {
 
 #define DARKSEED_NUM_PAL_ENTRIES 16
@@ -34,7 +34,7 @@ public:
 	byte palData[DARKSEED_PAL_SIZE];
 
 public:
-	bool load(const Common::String &filename);
+	bool load(const Common::Path &filename);
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/pic.cpp b/engines/darkseed/pic.cpp
index d48e1bcf909..1f6b44024bc 100644
--- a/engines/darkseed/pic.cpp
+++ b/engines/darkseed/pic.cpp
@@ -23,17 +23,17 @@
 #include "common/debug.h"
 #include "darkseed.h"
 
-bool Darkseed::Pic::load(const Common::String &filename) {
+bool Darkseed::Pic::load(const Common::Path &filename) {
 	Common::File file;
-	Common::String fullPath = g_engine->getPictureFilePath(filename);
+	Common::Path fullPath = g_engine->getPictureFilePath(filename);
 	if(!file.open(fullPath)) {
-		debug("Failed to load %s", fullPath.c_str());
+		debug("Failed to load %s", fullPath.toString().c_str());
 		return false;
 	}
 	bool ret = load(file);
 	file.close();
 	if (ret) {
-		debug("Loaded %s (%d,%d)", fullPath.c_str(), width, height);
+		debug("Loaded %s (%d,%d)", fullPath.toString().c_str(), width, height);
 	}
 	return ret;
 }
diff --git a/engines/darkseed/pic.h b/engines/darkseed/pic.h
index 7318f1ec43c..c0e3d259539 100644
--- a/engines/darkseed/pic.h
+++ b/engines/darkseed/pic.h
@@ -38,7 +38,7 @@ private:
 	byte currentDataByte = 0;
 
 public:
-	bool load(const Common::String &filename);
+	bool load(const Common::Path &filename);
 	Common::Array<uint8> &getPixels() {
 		return pixels;
 	}
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 893a0254cba..5ec10800c73 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -34,7 +34,7 @@ const Darkseed::Sprite &Darkseed::Player::getSprite(int frameNo) {
 	return _cPlayerSprites.getSpriteAt(frameNo);
 }
 
-bool Darkseed::Player::loadAnimations(const Common::String &filename) {
+bool Darkseed::Player::loadAnimations(const Common::Path &filename) {
 	return _animations.load(filename);
 }
 
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index e78802d2377..67ba7bebdb2 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -58,7 +58,7 @@ public:
 
 public:
 	Player();
-	bool loadAnimations(const Common::String &filename);
+	bool loadAnimations(const Common::Path &filename);
 	const Sprite &getSprite(int frameNo);
 	void updateSprite();
 	void draw();
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 3a54f83ba36..deab1c13f58 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -78,16 +78,16 @@ void Darkseed::Room::initRoom() {
 
 bool Darkseed::Room::load() {
 	Common::String filenameBase = getRoomFilenameBase(_roomNumber);
-	Common::String romFilename;
+	Common::Path romFilename;
 	Common::File file;
-	romFilename = g_engine->getRoomFilePath(Common::String::format("%s.rom", filenameBase.c_str(), _roomNumber));
+	romFilename = g_engine->getRoomFilePath(Common::Path(Common::String::format("%s.rom", filenameBase.c_str(), _roomNumber)));
 	if(!file.open(romFilename)) {
 		return false;
 	}
 
 	Common::String nspFilename = stripSpaces(file.readString());
 	file.seek(0xd);
-	Common::String picFilename = stripSpaces(file.readString());
+	Common::Path picFilename = Common::Path(stripSpaces(file.readString()));
 	file.seek(0x1a);
 	Common::String palFilename = stripSpaces(file.readString());
 	file.seek(0x27);
@@ -158,9 +158,9 @@ bool Darkseed::Room::load() {
 		return false;
 	}
 
-	_pal.load(g_engine->getPictureFilePath(Common::String::format("%s.pal", filenameBase.c_str())));
+	_pal.load(g_engine->getPictureFilePath(Common::Path(Common::String::format("%s.pal", filenameBase.c_str()))));
 
-	_locationSprites.load(Common::String::format("%s.nsp", filenameBase.c_str()));
+	_locationSprites.load(Common::Path(Common::String::format("%s.nsp", filenameBase.c_str())));
 
 	return true;
 }


Commit: edb1e15c8987ef7b589bcc09906a727fdacdd3e2
    https://github.com/scummvm/scummvm/commit/edb1e15c8987ef7b589bcc09906a727fdacdd3e2
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Update engine to latest master

Changed paths:
    engines/darkseed/anm.cpp
    engines/darkseed/anm.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h


diff --git a/engines/darkseed/anm.cpp b/engines/darkseed/anm.cpp
index 80d157a41a6..164650f31d6 100644
--- a/engines/darkseed/anm.cpp
+++ b/engines/darkseed/anm.cpp
@@ -23,7 +23,7 @@
 #include "common/debug.h"
 
 namespace Darkseed {
-bool Anm::load(const Common::String &filename) {
+bool Anm::load(const Common::Path &filename) {
 	if(!file.open(filename)) {
 		return false;
 	}
diff --git a/engines/darkseed/anm.h b/engines/darkseed/anm.h
index 5f127ee185b..ae00dbb1813 100644
--- a/engines/darkseed/anm.h
+++ b/engines/darkseed/anm.h
@@ -34,7 +34,7 @@ private:
 	uint16 assetOffset = 0;
 
 public:
-	bool load(const Common::String &filename);
+	bool load(const Common::Path &filename);
 	bool getImg(uint16 index, Img &img);
 };
 
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 34f967212a2..da1f6662a46 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1785,16 +1785,16 @@ void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
 	}
 }
 
-Common::String DarkseedEngine::getRoomFilePath(const Common::String &filename) {
+Common::Path DarkseedEngine::getRoomFilePath(const Common::Path &filename) {
 	if (isCdVersion()) {
-		return "room/" + filename;
+		return Common::Path("room").join(filename);
 	}
 	return filename;
 }
 
-Common::String DarkseedEngine::getPictureFilePath(const Common::String &filename) {
+Common::Path DarkseedEngine::getPictureFilePath(const Common::Path &filename) {
 	if (isCdVersion()) {
-		return "picture/" + filename;
+		return Common::Path("picture").join(filename);
 	}
 	return filename;
 }
@@ -2614,7 +2614,7 @@ void DarkseedEngine::printTime() {
 	_console->addToCurrentLine(Common::String::format("%d: %02d %s", hour % 12, (g_engine->_currentTimeInSeconds / 60) % 60, hour < 12 ? "a.m." : "p.m."));
 }
 
-void DarkseedEngine::showFullscreenPic(const Common::String &filename) {
+void DarkseedEngine::showFullscreenPic(const Common::Path &filename) {
 	if (_fullscreenPic) {
 		delete _fullscreenPic;
 	}
@@ -2622,7 +2622,7 @@ void DarkseedEngine::showFullscreenPic(const Common::String &filename) {
 	if(!_fullscreenPic->load(filename)) {
 		delete _fullscreenPic;
 		_fullscreenPic = nullptr;
-		error("Failed to load %s", filename.c_str());
+		error("Failed to load %s", filename.toString().c_str());
 	}
 }
 
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index d6e0f603c81..23a111c6bca 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -151,10 +151,10 @@ public:
 		    (f == kSupportsReturnToLauncher);
 	};
 
-	bool canLoadGameStateCurrently() override {
+	bool canLoadGameStateCurrently(Common::U32String *msg) override {
 		return true;
 	}
-	bool canSaveGameStateCurrently() override {
+	bool canSaveGameStateCurrently(Common::U32String *msg) override {
 		return true;
 	}
 
@@ -173,8 +173,8 @@ public:
 		return syncGame(s);
 	}
 
-	Common::String getRoomFilePath(const Common::String &filename);
-	Common::String getPictureFilePath(const Common::String &filename);
+	Common::Path getRoomFilePath(const Common::Path &filename);
+	Common::Path getPictureFilePath(const Common::Path &filename);
 
 	void fadeIn();
 	void fadeOut();
@@ -182,7 +182,7 @@ public:
 	void updateDisplay();
 	void setupOtherNspAnimation(int nspAnimIdx, int animId);
 	void debugTeleportToRoom(int newRoomNumber, int entranceNumber);
-	void showFullscreenPic(const Common::String &filename);
+	void showFullscreenPic(const Common::Path &filename);
 	void lookCode(int objNum);
 	void handleObjCollision(int objNum);
 	void playCutscene(const Common::String cutsceneId);


Commit: 6a28ff5244871104fed0c42a39689d5ef50166f4
    https://github.com/scummvm/scummvm/commit/6a28ff5244871104fed0c42a39689d5ef50166f4
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added load/save support.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/inventory.cpp
    engines/darkseed/inventory.h
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h
    engines/darkseed/room.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index da1f6662a46..85429e44ce0 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -159,12 +159,18 @@ Common::Error DarkseedEngine::run() {
 }
 
 Common::Error DarkseedEngine::syncGame(Common::Serializer &s) {
-	// The Serializer has methods isLoading() and isSaving()
-	// if you need to specific steps; for example setting
-	// an array size after reading it's length, whereas
-	// for saving it would write the existing array's length
-	int dummy = 0;
-	s.syncAsUint32LE(dummy);
+	if (_objectVar.sync(s).getCode() != Common::kNoError) {
+		error("Failed to sync objects");
+	}
+	if (_inventory.sync(s).getCode() != Common::kNoError) {
+		error("Failed to sync inventory");
+	}
+	s.syncAsUint32LE(_currentTimeInSeconds);
+	s.syncAsByte(_currentDay);
+	s.syncAsByte(_room->_roomNumber);
+	s.syncAsByte(_previousRoomNumber);
+	s.syncAsSint16LE(_player->_position.x);
+	s.syncAsSint16LE(_player->_position.y);
 
 	return Common::kNoError;
 }
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 23a111c6bca..4fa0f8df05b 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -83,10 +83,10 @@ public:
 	Objects _objectVar;
 	Inventory _inventory;
 
-	int _currentDay = 1;
+	uint8 _currentDay = 1;
 	int _currentTimeInSeconds = 0x7e8e;
 
-	uint16 _previousRoomNumber = 0;
+	uint8 _previousRoomNumber = 0;
 	uint16 targetRoomNumber = 0;
 
 	bool isPlayingAnimation_maybe = false;
@@ -152,10 +152,11 @@ public:
 	};
 
 	bool canLoadGameStateCurrently(Common::U32String *msg) override {
-		return true;
+		return !isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed;
 	}
+
 	bool canSaveGameStateCurrently(Common::U32String *msg) override {
-		return true;
+		return !isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed;
 	}
 
 	/**
@@ -168,9 +169,14 @@ public:
 		Common::Serializer s(nullptr, stream);
 		return syncGame(s);
 	}
+
 	Common::Error loadGameStream(Common::SeekableReadStream *stream) override {
 		Common::Serializer s(stream, nullptr);
-		return syncGame(s);
+		Common::Error syncResult = syncGame(s);
+		if (syncResult.getCode() == Common::kNoError) {
+			changeToRoom(_room->_roomNumber);
+		}
+		return syncResult;
 	}
 
 	Common::Path getRoomFilePath(const Common::Path &filename);
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index b91507498e7..28a63518639 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -153,3 +153,11 @@ void Darkseed::Inventory::rightArrowClicked() {
 	_viewOffset++;
 	update();
 }
+
+Common::Error Darkseed::Inventory::sync(Common::Serializer &s) {
+	s.syncAsSint16LE(_inventoryLength);
+	for (int i = 0; i < _inventoryLength; i++) {
+		s.syncAsByte(_inventory[i]);
+	}
+	return Common::kNoError;
+}
diff --git a/engines/darkseed/inventory.h b/engines/darkseed/inventory.h
index c0883bc6d52..ae083a5c5fe 100644
--- a/engines/darkseed/inventory.h
+++ b/engines/darkseed/inventory.h
@@ -28,7 +28,7 @@ namespace Darkseed {
 class Inventory {
 private:
 	Common::Array<uint8> _inventory;
-	int _inventoryLength = 0;
+	int16 _inventoryLength = 0;
 	Common::Array<uint8> _iconList;
 	int _viewOffset = 0;
 	int _numIcons = 0;
@@ -41,6 +41,8 @@ public:
 	void draw();
 	void handleClick();
 
+	Common::Error sync(Common::Serializer &s);
+
 private:
 	void update();
 	void leftArrowClicked();
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index 6f68fbe61cb..93d4cb80f72 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -451,3 +451,17 @@ const char *Darkseed::Objects::getObjectName(int idx) {
 
 	return objectNameTbl[idx];
 }
+
+static inline void syncPoint(Common::Serializer &s, Common::Point &value) {
+	s.syncAsSint16LE(value.x);
+	s.syncAsSint16LE(value.y);
+}
+
+Common::Error Darkseed::Objects::sync(Common::Serializer &s) {
+	s.syncArray(_objectVar.data(), _objectVar.size(), Common::Serializer::Sint16LE);
+	s.syncArray(_objectRunningCode.data(), _objectRunningCode.size(), Common::Serializer::Sint16LE);
+	s.syncArray(_objectRunningCode.data(), _objectRunningCode.size(), Common::Serializer::Sint16LE);
+	s.syncArray(_moveObjectXY.data(), _moveObjectXY.size(), syncPoint);
+	s.syncArray(_moveObjectRoom.data(), _moveObjectRoom.size(), Common::Serializer::Byte);
+	return Common::kNoError;
+}
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 100d104be82..2c8e137a0b7 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -23,7 +23,9 @@
 #define DARKSEED_OBJECTS_H
 
 #include "common/array.h"
+#include "common/error.h"
 #include "common/rect.h"
+#include "common/serializer.h"
 namespace Darkseed {
 
 enum ObjType {
@@ -43,6 +45,8 @@ public:
 	Objects();
 	void reset();
 
+	Common::Error sync(Common::Serializer &s);
+
 	void setVar(uint16 varIdx, int16 newValue);
 	int16 getVar(uint16 varIdx);
 
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index e58a3fa0c01..9e54210f726 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -56,7 +56,7 @@ struct RoomObjElement {
 class Room {
 public:
 	static constexpr int MAX_CONNECTORS = 12;
-	int _roomNumber;
+	uint8 _roomNumber;
 	Pic pic;
 	Pal _pal;
 	Nsp _locationSprites;


Commit: abd1c13893f3d5b3e2c16cd42978eda1cc57db7f
    https://github.com/scummvm/scummvm/commit/abd1c13893f3d5b3e2c16cd42978eda1cc57db7f
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fixups for sprite display ordering

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 85429e44ce0..b437894612a 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1007,7 +1007,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 //					addSpriteToDraw(playerSpriteX_maybe - (_curPlayerSpriteWidth & 0xff) / 2,
 //									playerSpriteY_maybe - (_curPlayerSpriteHeight_maybe & 0xff),uVar7,uVar4,
 //									*(undefined2 *)((int)CPlayerSpritePtrTbl + uVar1 * 4),
-//									*(undefined2 *)((int)&CPlayerSpritePtrTbl[0].Offset + uVar1 * 4),0xf0 - playerSpriteY_maybe ,
+//									*(undefined2 *)((int)&CPlayerSpritePtrTbl[0].Offset + uVar1 * 4),240 - playerSpriteY_maybe ,
 //									_curPlayerSpriteWidth,_curPlayerSpriteHeight_maybe,_player_sprite_related_2c85_82f3);
 				}
 				if (otherNspAnimationType_maybe == 0x27 || otherNspAnimationType_maybe == 0x3b ||
@@ -1019,7 +1019,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 //					addSpriteToDraw(playerSpriteX_maybe - (_curPlayerSpriteWidth & 0xff) / 2,
 //									playerSpriteY_maybe - (_curPlayerSpriteHeight_maybe & 0xff),uVar7,uVar4,
 //									*(undefined2 *)((int)CPlayerSpritePtrTbl + uVar1 * 4),
-//									*(undefined2 *)((int)&CPlayerSpritePtrTbl[0].Offset + uVar1 * 4),0xf0 - playerSpriteY_maybe ,
+//									*(undefined2 *)((int)&CPlayerSpritePtrTbl[0].Offset + uVar1 * 4),240 - playerSpriteY_maybe ,
 //									_curPlayerSpriteWidth,_curPlayerSpriteHeight_maybe,_player_sprite_related_2c85_82f3);
 //					if ((otherNspAnimationType_maybe == 0x3c) || (otherNspAnimationType_maybe == 0x3d)) {
 //						sprite_y_scaling_threshold_maybe = 0xf0;
@@ -1072,14 +1072,14 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 //					addSpriteToDraw(iVar5,playerSpriteY_maybe - uVar2,iVar9,iVar8,
 //									*(undefined2 *)((int)otherNspSpritePtr + _player->_frameIdx * 4),
 //									*(undefined2 *)((int)&otherNspSpritePtr[0].Offset + _player->_frameIdx * 4),
-//									0xf0 - playerSpriteY_maybe,uVar1,uVar2,uVar3 & 0xff00);
+//									240 - playerSpriteY_maybe,uVar1,uVar2,uVar3 & 0xff00);
 //					bVar6 = extraout_AH_01;
 				} else if (!_scaleSequence) {
 					if (otherNspAnimationType_maybe == 0x11) {
 //						addSpriteToDraw(playerSpriteX_maybe - (int)otherNspWidthTbl[0] / 2,playerSpriteY_maybe - iVar8,iVar9,iVa r8,
 //										*(undefined2 *)((int)otherNspSpritePtr + _player->_frameIdx * 4),
 //										*(undefined2 *)((int)&otherNspSpritePtr[0].Offset + _player->_frameIdx * 4),
-//										0xf0 - playerSpriteY_maybe,iVar9,iVar8,_player_sprite_related_2c85_82f3);
+//										240 - playerSpriteY_maybe,iVar9,iVar8,_player_sprite_related_2c85_82f3);
 //						bVar6 = extraout_AH_02;
 					} else if (otherNspAnimationType_maybe == 5 || otherNspAnimationType_maybe == 1) {
 						int x = 0xa6;
@@ -1099,7 +1099,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 
 						/* bed wake sequence is played here. */
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(x, y, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+						_sprites.addSpriteToDrawList(x, y, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe == 43 || otherNspAnimationType_maybe == 44) {
 
 					} else if (otherNspAnimationType_maybe == 62) {
@@ -1114,10 +1114,10 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 
 					} else if (otherNspAnimationType_maybe == 10 || otherNspAnimationType_maybe == 11) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(118, 62, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, false);
+						_sprites.addSpriteToDrawList(118, 62, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, false);
 					} else if (otherNspAnimationType_maybe == 12 || otherNspAnimationType_maybe == 13) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(407, 73, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, false);
+						_sprites.addSpriteToDrawList(407, 73, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, false);
 					} else if (otherNspAnimationType_maybe == 20) {
 
 					} else if (otherNspAnimationType_maybe < 30 || otherNspAnimationType_maybe > 34) {
@@ -1128,28 +1128,28 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 
 							} else if (otherNspAnimationType_maybe >= 53 && otherNspAnimationType_maybe <= 56) {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 							} else if (otherNspAnimationType_maybe == 57 || otherNspAnimationType_maybe == 58) {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 								Common::Point spritePos = {344,57};
 								if (_room->_roomNumber == 41) {
 									spritePos = {295,46};
 								}
-								_sprites.addSpriteToDrawList(spritePos.x, spritePos.y, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+								_sprites.addSpriteToDrawList(spritePos.x, spritePos.y, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 							} else {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 							}
 						} else {
 							const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-							_sprites.addSpriteToDrawList(_player->_position.x - animSprite.width / 2, _player->_position.y - animSprite.height, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+							_sprites.addSpriteToDrawList(_player->_position.x - animSprite.width / 2, _player->_position.y - animSprite.height, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 						}
 					} else {
 						// drinking water in bathroom
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(448, 97, &animSprite, 0xf0 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+						_sprites.addSpriteToDrawList(448, 97, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 						const Sprite &legsSprite = _player->_animations.getSpriteAt(0);
-						_sprites.addSpriteToDrawList(451, 160, &legsSprite, 0xf0 - _player->_position.y, legsSprite.width, legsSprite.height, player_sprite_related_2c85_82f3);
+						_sprites.addSpriteToDrawList(451, 160, &legsSprite, 240 - _player->_position.y, legsSprite.width, legsSprite.height, player_sprite_related_2c85_82f3);
 
 					}
 				} else if (otherNspAnimationType_maybe == 6) {
@@ -1175,7 +1175,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						_player->_position.x - scaledSpriteWidth / 2,
 						_player->_position.y - scaledSpriteHeight,
 						&_player->_animations.getSpriteAt(_player->_frameIdx),
-						0xf0 - _player->_position.y,
+						240 - _player->_position.y,
 						scaledSpriteWidth,
 						scaledSpriteHeight,
 						player_sprite_related_2c85_82f3);
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index deab1c13f58..8bbcd630b7c 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -930,7 +930,7 @@ void Darkseed::Room::runRoomObjects() {
 						xPos,
 						yPos,
 						&sprite,
-						240 - yPos + sprite.height,
+						240 - (yPos + sprite.height),
 						sprite.width,
 						sprite.height,
 						false);
@@ -994,7 +994,7 @@ void Darkseed::Room::runRoomObjects() {
 	}
 	if (_roomNumber == 0 && g_engine->isPlayingAnimation_maybe) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(1);
-		g_engine->_sprites.addSpriteToDrawList(111, 136, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(111, 136, &sprite, 1, sprite.width, sprite.height, false);
 	}
 	if (_roomNumber == 2 && g_engine->_player->_isAutoWalkingToBed && g_engine->_player->_position.x < 150) {
 			g_engine->_objectVar[78] = 2; // open door for player.
@@ -1125,7 +1125,7 @@ void Darkseed::Room::runRoomObjects() {
 		}
 		if (g_engine->_objectVar[109] != 0) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(5);
-			g_engine->_sprites.addSpriteToDrawList(300, 151, &sprite, 255, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(300, 151, &sprite, 254, sprite.width, sprite.height, false);
 		}
 		if (g_engine->_objectVar[110] != 0) { // tap drip
 			const Sprite &sprite = _locationSprites.getSpriteAt((g_engine->counter_2c85_888b & 1) + 6); // TODO double check counter_2c85_888b is actually _ConstantTick


Commit: d88e8fde66e5eff7ab7c8bb30ebf3a0aa64bc4f6
    https://github.com/scummvm/scummvm/commit/d88e8fde66e5eff7ab7c8bb30ebf3a0aa64bc4f6
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fixed gloves showing when glovebox is closed

Changed paths:
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 8bbcd630b7c..33ba953ba09 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -769,14 +769,16 @@ void Darkseed::Room::runRoomObjects() {
 				xPos = (sprite.width / 2 + xPos) - g_engine->scaledSpriteHeight / 2;
 			}
 			if (roomObj.spriteNum == 14) {
-				g_engine->_sprites.addSpriteToDrawList(
-					xPos,
-					(yPos + sprite.height) - g_engine->scaledSpriteHeight,
-					&sprite,
-					240 - (yPos + sprite.height),
-					g_engine->scaledSpriteWidth,
-					g_engine->scaledSpriteHeight,
-					false);
+				if (g_engine->_objectVar[86] != 0) {
+					g_engine->_sprites.addSpriteToDrawList(
+						xPos,
+						(yPos + sprite.height) - g_engine->scaledSpriteHeight,
+						&sprite,
+						240 - (yPos + sprite.height),
+						g_engine->scaledSpriteWidth,
+						g_engine->scaledSpriteHeight,
+						false);
+				}
 			} else {
 				g_engine->_sprites.addSpriteToDrawList(
 					xPos,


Commit: 493040388b451b527712754376b5e341330d787f
    https://github.com/scummvm/scummvm/commit/493040388b451b527712754376b5e341330d787f
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fixed bug which blocked picking up moveable objects

Changed paths:
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 33ba953ba09..99f9241cea7 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -210,6 +210,7 @@ int Darkseed::Room::checkCursorAndMoveableObjects() {
 			&& _roomObj[i].yOffset <= cursorSprite.height + g_engine->_cursor.getY()
 			&& g_engine->_cursor.getY() <= _roomObj[i].height + _roomObj[i].yOffset
 		) {
+			hasObject = true;
 			if (_roomObj[i].objNum == 25) {
 				if (g_engine->_objectVar.getVar(80) < 3) {
 					hasObject = false;


Commit: c0ad8d5639cc6ba3c302ba33b68e9e25b61feac1
    https://github.com/scummvm/scummvm/commit/c0ad8d5639cc6ba3c302ba33b68e9e25b61feac1
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added player animation 11 descending left ladder

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/player.cpp
    engines/darkseed/player.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index b437894612a..43359e41345 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1466,6 +1466,21 @@ void DarkseedEngine::updateAnimation() {
 			_player->updateSprite();
 		}
 		break;
+	case 11:
+		advanceAnimationFrame(1);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
+		} else {
+			_player->_position.x = 175;
+			_player->_position.y = 200;
+			_player->_walkTarget.x = 175;
+			_player->_walkTarget.y = 200;
+			_player->updateSprite();
+			if (_player->_isAutoWalkingToBed) {
+				_player->setplayertowardsbedroom();
+			}
+		}
+		break;
 	case 12:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 5ec10800c73..b45a526f47c 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -436,3 +436,7 @@ void Darkseed::Player::OptimisePath() {
 		}
 	}
 }
+
+void Darkseed::Player::setplayertowardsbedroom() {
+	// TODO
+}
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index 67ba7bebdb2..33baa85b2d1 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -73,6 +73,7 @@ public:
 	int getHeight();
 	void updatePlayerPositionAfterRoomChange();
 	void updateBedAutoWalkSequence();
+	void setplayertowardsbedroom();
 	void walkToNextConnector();
 
 private:


Commit: 464fba54fe84ee343f5a772b6cbe2afbde4171ab
    https://github.com/scummvm/scummvm/commit/464fba54fe84ee343f5a772b6cbe2afbde4171ab
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Remove picked up inventory from room when loading. Added inventory debug commands. Use money, use gloves, use crowbar

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/debugconsole.cpp
    engines/darkseed/debugconsole.h
    engines/darkseed/inventory.cpp
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 43359e41345..f55d16b9df6 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -79,33 +79,15 @@ Common::Error DarkseedEngine::run() {
 	Img letterD1;
 	lettersAnm.getImg(7, letterD1);
 
-	// Set the engine's debugger console
-	setDebugger(new DebugConsole(_tosText));
-
-	// If a savegame was selected from the launcher, load it
-	int saveSlot = ConfMan.getInt("save_slot");
-	if (saveSlot != -1)
-		(void)loadGameState(saveSlot);
-
-	// Draw a series of boxes on screen as a sample
-//	for (int i = 0; i < 100; ++i)
-//		_screen->frameRect(Common::Rect(i, i, 320 - i, 200 - i), i);
-//	Pal::load("art/ship.pal");
-//	_screen->copyRectToSurface(left00Img.getPixels().data(), left00Img.getWidth(), left00Img.getX(), left00Img.getY(), left00Img.getWidth(), left00Img.getHeight());
-//	_screen->copyRectToSurface(left01Img.getPixels().data(), left01Img.getWidth(), left01Img.getX(), left01Img.getY(), left01Img.getWidth(), left01Img.getHeight());
-
 	Pal housePalette;
 	housePalette.load("art/house.pal");
 	TitleFont titleFont;
 	titleFont.displayString(0x44, 0xa0, "DEVELOPING NEW WAYS TO AMAZE");
-	Img house;
-//	house.load("art/bdoll0.img");
-//		_screen->copyRectToSurface(house.getPixels().data(), house.getWidth(), house.getX(), house.getY(), house.getWidth(), house.getHeight());
-//	_screen->copyRectToSurfaceWithKey(letterD.getPixels().data(), letterD.getWidth(), 24, 24, letterD.getWidth(), letterD.getHeight(), 0);
-//	_screen->copyRectToSurfaceWithKey(letterD1.getPixels().data(), letterD1.getWidth(), 24+1, 24, letterD1.getWidth(), letterD1.getHeight(), 0);
+
+	// Set the engine's debugger console
+	setDebugger(new DebugConsole(_tosText));
 
 	_frame.load("cframe.pic");
-	_frame.draw();
 
 	_baseSprites.load("cbase.nsp");
 
@@ -117,36 +99,29 @@ Common::Error DarkseedEngine::run() {
 	_player->_direction = 1;
 	_player->_frameIdx = 0;
 
-//	Pic room;
-//	room.load("bed1a.pic");
-//	_screen->copyRectToSurface(room.getPixels().data(), room.getWidth(), 0x45, 0x28, room.getWidth(), room.getHeight());
-
-//	Pal roomPal;
-//	roomPal.load("room0.pal");
-
-//	Nsp playerNsp;
-//	playerNsp.load("bedsleep.nsp"); //"cplayer.nsp");
-//	const Sprite &s = playerNsp.getSpriteAt(11);
-//
-//	_screen->copyRectToSurfaceWithKey(s.pixels.data(), s.width, 0x45 + 220, 0x28 + 40, s.width, s.height, 0xf);
-
 	_room = new Room(0);
 
-	if (prefsCutsceneId == 'I' || ((prefsCutsceneId == 'S' || prefsCutsceneId == 'B' || prefsCutsceneId == 'C') &&
-		  _room->_roomNumber == 0)) {
-		_player->loadAnimations("bedsleep.nsp");
-		_player->_position.x = 0x87;
-		_player->_position.y = 0x5b;
-		_player->_frameIdx = 0;
-		_player->_direction = 1;
-		setupOtherNspAnimation(0, 1);
-//		bVar1 = true;
-		if (_currentDay == 1) {
-			_console->printTosText(8);
-		} else if (_currentDay == 2) {
-			_console->printTosText(0xc);
-		} else if (_currentDay == 3) {
-			_console->printTosText(0xe);
+	// If a savegame was selected from the launcher, load it
+	int saveSlot = ConfMan.getInt("save_slot");
+	if (saveSlot != -1) {
+		(void)loadGameState(saveSlot);
+	} else {
+		if (prefsCutsceneId == 'I' || ((prefsCutsceneId == 'S' || prefsCutsceneId == 'B' || prefsCutsceneId == 'C') &&
+			  _room->_roomNumber == 0)) {
+			_player->loadAnimations("bedsleep.nsp");
+			_player->_position.x = 0x87;
+			_player->_position.y = 0x5b;
+			_player->_frameIdx = 0;
+			_player->_direction = 1;
+			setupOtherNspAnimation(0, 1);
+	//		bVar1 = true;
+			if (_currentDay == 1) {
+				_console->printTosText(8);
+			} else if (_currentDay == 2) {
+				_console->printTosText(0xc);
+			} else if (_currentDay == 3) {
+				_console->printTosText(0xe);
+			}
 		}
 	}
 
@@ -159,6 +134,9 @@ Common::Error DarkseedEngine::run() {
 }
 
 Common::Error DarkseedEngine::syncGame(Common::Serializer &s) {
+	if (_room == nullptr) {
+		_room = new Room(0);
+	}
 	if (_objectVar.sync(s).getCode() != Common::kNoError) {
 		error("Failed to sync objects");
 	}
@@ -674,6 +652,18 @@ void DarkseedEngine::handleInput() {
 							}
 						}
 					}
+					if (objIdx == -1) {
+						_console->printTosText(938);
+						if (_actionMode > 3) {
+							_actionMode = PointerAction;
+							_cursor.setCursorType((CursorType)_actionMode);
+						}
+					} else {
+						if (_actionMode > 3) {
+							_actionMode = PointerAction;
+							_cursor.setCursorType((CursorType)_actionMode);
+						}
+					}
 				}
 				if (!isPlayingAnimation_maybe) {
 					// walk to destination point
@@ -933,10 +923,8 @@ void DarkseedEngine::changeToRoom(int newRoomNumber) {
 				_player->_walkTarget = _player->_position;
 			}
 		}
-		if (_previousRoomNumber == 10 && newRoomNumber == 6) {
-//			if (DAT_2c85_81a0 == 0 && _currentDay == 1) {
-//				DAT_2c85_6750 = 2;
-//			}
+		if (_previousRoomNumber == 10 && newRoomNumber == 6 && _objectVar[47] == 0 && _currentDay == 1) {
+			_objectVar.setObjectRunningCode(47, 2);
 		}
 	}
 
@@ -961,6 +949,7 @@ void DarkseedEngine::debugTeleportToRoom(int newRoomNumber, int entranceNumber)
 		_player->updatePlayerPositionAfterRoomChange();
 		_player->_walkTarget = _player->_position;
 	}
+	g_engine->updateDisplay();
 }
 
 void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
@@ -1075,12 +1064,9 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 //									240 - playerSpriteY_maybe,uVar1,uVar2,uVar3 & 0xff00);
 //					bVar6 = extraout_AH_01;
 				} else if (!_scaleSequence) {
-					if (otherNspAnimationType_maybe == 0x11) {
-//						addSpriteToDraw(playerSpriteX_maybe - (int)otherNspWidthTbl[0] / 2,playerSpriteY_maybe - iVar8,iVar9,iVa r8,
-//										*(undefined2 *)((int)otherNspSpritePtr + _player->_frameIdx * 4),
-//										*(undefined2 *)((int)&otherNspSpritePtr[0].Offset + _player->_frameIdx * 4),
-//										240 - playerSpriteY_maybe,iVar9,iVar8,_player_sprite_related_2c85_82f3);
-//						bVar6 = extraout_AH_02;
+					if (otherNspAnimationType_maybe == 17) { // open trunk
+						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+						_sprites.addSpriteToDrawList(_player->_position.x - animSprite.width / 2, _player->_position.y - animSprite.height, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe == 5 || otherNspAnimationType_maybe == 1) {
 						int x = 0xa6;
 						int y = 0x69;
@@ -1520,6 +1506,21 @@ void DarkseedEngine::updateAnimation() {
 			_player->updateSprite();
 		}
 		break;
+	case 17: // open trunk with crowbar
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+		}
+		if (animIndexTbl[0] == 5 && animFrameChanged) {
+			playSound(31,5,-1);
+			_console->printTosText(666);
+			if (_objectVar[42] == 0) {
+				_objectVar[42] = 1;
+			} else {
+				_objectVar[42] = 3;
+			}
+		}
+		break;
 	case 18: // push trunk
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -1836,6 +1837,17 @@ void DarkseedEngine::handleObjCollision(int objNum) {
 			case LookAction:
 				lookCode(objNum);
 				break;
+			case 5:
+				useCrowBar(objNum);
+				break;
+				// TODO lots of extra switch cases here for inventory usages.
+			case 8:
+				useCodeMoney(objNum);
+				break;
+				// TODO lots of extra switch cases here for inventory usages.
+			case 14:
+				useCodeGloves(objNum);
+				break;
 			// TODO lots of extra switch cases here for inventory usages.
 			default:
 				break;
@@ -2376,6 +2388,73 @@ void DarkseedEngine::useCode(int objNum) {
 	}
 }
 
+void DarkseedEngine::useCodeGloves(int16 targetObjNum) {
+	if (targetObjNum == 113) {
+		putobjunderpillow(14);
+		return;
+	}
+
+	int16 tosIdx = _objectVar.getUseGlovesTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(14,targetObjNum, tosIdx);
+		}
+	}
+	if (targetObjNum == 57) {
+		_player->loadAnimations("instrshp.nsp");
+		setupOtherNspAnimation(0, 43);
+	} else if (targetObjNum == 117) {
+		_player->loadAnimations("obslev.nsp");
+		setupOtherNspAnimation(0, 45);
+	}
+}
+
+void DarkseedEngine::useCodeMoney(int16 targetObjNum) {
+	if ((targetObjNum != 138) && (targetObjNum != 152)) {
+		int16 tosIdx = _objectVar.getUseMoneyTosIdx(targetObjNum);
+		if (tosIdx == 0) {
+			if (targetObjNum == 7) {
+				_console->printTosText(961);
+			} else if (targetObjNum == 113) {
+				putobjunderpillow(8);
+			}
+		} else if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(8, targetObjNum, tosIdx);
+		}
+		return;
+	}
+	if (_objectVar[138] == 0) {
+		_player->loadAnimations("givclerk.nsp");
+		setupOtherNspAnimation(6, 35);
+	} else {
+		_console->addTextLine("Choose an item before giving clerk more money.");
+	}
+}
+
+void DarkseedEngine::useCrowBar(int16 targetObjNum) {
+	int16 tosIdx = _objectVar.getUseCrowbarTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(5,targetObjNum, tosIdx);
+		}
+	}
+	if (targetObjNum == 42) {
+		if ((_objectVar[42] == 0) || (_objectVar[42] == 4)) {
+			_player->loadAnimations("crowbar.nsp");
+			setupOtherNspAnimation(0, 17);
+		} else {
+			_console->printTosText(962);
+		}
+	}
+}
+
+
 void DarkseedEngine::lookCode(int objNum) {
 	if (objNum == 71 && _objectVar[71] == 2) {
 		_console->addTextLine("You see the car keys in the ignition.");
@@ -2612,6 +2691,7 @@ void DarkseedEngine::lookCode(int objNum) {
 		if (eyeTosIdx < 979 && eyeTosIdx != 0)  {
 			_console->printTosText(eyeTosIdx);
 		}
+		// TODO
 //		else if (978 < *(int *)((int)_eyedescriptions + objNum * 2)) {
 //			genericresponse(3,objNum,*(undefined2 *)((int)_eyedescriptions + objNum * 2));
 //		}
@@ -2699,5 +2779,12 @@ void DarkseedEngine::nextFrame(int nspAminIdx) {
 void DarkseedEngine::stuffPlayer() {
 	// TODO
 }
+void DarkseedEngine::putobjunderpillow(int objNum) {
+	// TODO
+}
+
+void DarkseedEngine::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx) {
+	// TODO
+}
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 4fa0f8df05b..0157fab647f 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -195,6 +195,7 @@ public:
 	void playSound(int16 unk, uint8 unk1, int16 unk2);
 	void nextFrame(int nspAminIdx);
 	void stuffPlayer();
+	void genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx);
 private:
 	void updateAnimation();
 	void advanceAnimationFrame(int nspAminIdx);
@@ -207,6 +208,9 @@ private:
 	void changeToRoom(int newRoomNumber);
 
 	void useCode(int objNum);
+	void useCodeGloves(int16 targetObjNum);
+	void useCodeMoney(int16 targetObjNum);
+	void useCrowBar(int16 targetObjNum);
 	void getPackageObj(int packageType);
 	void wongame();
 	void getPackage(int state);
@@ -214,6 +218,7 @@ private:
 	void keeperanim();
 	void sargoanim();
 	void gancanim();
+	void putobjunderpillow(int objNum);
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
index 6472c0ce269..5fff4840fa2 100644
--- a/engines/darkseed/debugconsole.cpp
+++ b/engines/darkseed/debugconsole.cpp
@@ -32,6 +32,8 @@ DebugConsole::DebugConsole(TosText *tosText) : GUI::Debugger(), tosText(tosText)
 	registerCmd("enablePathfinderOverlay",   WRAP_METHOD(DebugConsole, Cmd_enablePathfinderOverlay));
 	registerCmd("info",   WRAP_METHOD(DebugConsole, Cmd_info));
 	registerCmd("gotoRoom",   WRAP_METHOD(DebugConsole, Cmd_gotoRoom));
+	registerCmd("invAdd",   WRAP_METHOD(DebugConsole, Cmd_invAdd));
+	registerCmd("invRemove",   WRAP_METHOD(DebugConsole, Cmd_invRemove));
 }
 
 DebugConsole::~DebugConsole() {
@@ -136,6 +138,30 @@ bool DebugConsole::Cmd_gotoRoom(int argc, const char **argv) {
 	return true;
 }
 
+bool DebugConsole::Cmd_invAdd(int argc, const char **argv) {
+	if (argc != 2) {
+		debugPrintf("Usage: invAdd <objNum>\n");
+		return true;
+	}
+
+	uint8 objNum = (uint8)atoi(argv[1]);
+
+	g_engine->_inventory.addItem(objNum);
+	return true;
+}
+
+bool DebugConsole::Cmd_invRemove(int argc, const char **argv) {
+	if (argc != 2) {
+		debugPrintf("Usage: invRemove <objNum>\n");
+		return true;
+	}
+
+	uint8 objNum = (uint8)atoi(argv[1]);
+
+	g_engine->_inventory.removeItem(objNum);
+	return true;
+}
+
 void DebugConsole::printDayAndTime() {
 	int hour = g_engine->_currentTimeInSeconds / 60 / 60 + 1;
 	debugPrintf("Day %d at %d:%02d%s (%d seconds)\n",
diff --git a/engines/darkseed/debugconsole.h b/engines/darkseed/debugconsole.h
index 49157c4fa8a..faf3e5f00f0 100644
--- a/engines/darkseed/debugconsole.h
+++ b/engines/darkseed/debugconsole.h
@@ -39,6 +39,8 @@ private:
 	bool Cmd_enablePathfinderOverlay(int argc, const char **argv);
 	bool Cmd_info(int argc, const char **argv);
 	bool Cmd_gotoRoom(int argc, const char **argv);
+	bool Cmd_invAdd(int argc, const char **argv);
+	bool Cmd_invRemove(int argc, const char **argv);
 	bool validateObjVarIndex(int16 varIdx);
 	void printDayAndTime();
 public:
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 28a63518639..22aee055cea 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -73,7 +73,7 @@ void Darkseed::Inventory::update() {
 			_iconList[i+1] = _inventory[i];
 		}
 	} else {
-		for (int i = 0; i < MAX_ICONS; i++) {
+		for (int i = 0; i < MAX_ICONS - 1; i++) {
 			_iconList[i+1] = _inventory[_viewOffset + i];
 		}
 		if (_viewOffset + 8 < _inventoryLength) {
@@ -159,5 +159,7 @@ Common::Error Darkseed::Inventory::sync(Common::Serializer &s) {
 	for (int i = 0; i < _inventoryLength; i++) {
 		s.syncAsByte(_inventory[i]);
 	}
+	_viewOffset = 0;
+	update();
 	return Common::kNoError;
 }
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index 93d4cb80f72..a9bb73cad30 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -197,6 +197,165 @@ static constexpr uint16 handDescriptionsTbl[] = {
 	672, 322, 164
 };
 
+static constexpr int16 glovesTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 525,
+	999, 999, 999, 999,
+	999, 84, 999, 745,
+	999, 999, 84, 999,
+	999, 84, 84, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 84,
+	999, 999, 999, 999,
+	999, 999, 84, 999,
+	84, 999, 84, 49,
+	999, 84, 999, 999,
+	198, 487, 999, 773,
+	999, 0, 999, 84,
+	999, 84, 84, 999,
+	999, 999, 84, 84,
+	84, 999, 999, 84,
+	999, 999, 999, 999,
+	999, 999, 35, 999,
+	84, 999, 999, 999,
+	84, 84, 84, 84,
+	84, 84, 84, 84,
+	84, 84, 84, 84,
+	84, 84, 84, 999,
+	84, 84, 999, 999,
+	999, 999, 999, 999,
+	386, 84, 392, 84,
+	996, 84, 999, 981,
+	999, 796, 999, 808,
+	804, 84, 84, 84,
+	999, 84, 84, 84,
+	999, 998, 991, 84,
+	84, 999, 84, 84,
+	999, 84, 999, 84,
+	999, 999, 84, 185,
+	84, 84, 84, 84,
+	84, 84, 84, 999,
+	999, 84, 84, 999,
+	84, 999, 84, 84,
+	84, 84, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 84, 84,
+	84, 84, 84, 84,
+	84, 84, 999, 999,
+	768, 999, 999, 820,
+	84, 84, 999, 999,
+	999, 999, 999, 84,
+	84, 999, 84, 84,
+	84, 84, 999
+};
+
+static constexpr int16 moneyTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 169,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	961, 961, 961, 961,
+	961, 999, 999, 999,
+	999, 999, 543, 58,
+	872, 999, 999, 999,
+	206, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 461, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	560, 999, 999, 999,
+	999, 436, 999, 586,
+	586, 586, 586, 586,
+	586, 586, 586, 586,
+	586, 586, 586, 999,
+	156, 986, 999, 999,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 0, 999, 999,
+	999, 999, 999, 999,
+	804, 990, 999, 132,
+	999, 281, 86, 111,
+	999, 998, 991, 402,
+	417, 999, 999, 999,
+	999, 303, 0, 999,
+	999, 999, 999, 190,
+	217, 227, 290, 999,
+	999, 999, 999, 999,
+	906, 531, 999, 999,
+	550, 999, 573, 577,
+	999, 999, 999, 633,
+	633, 633, 633, 633,
+	633, 999, 999, 999,
+	988, 687, 999, 999,
+	999, 999, 999, 999,
+	999, 785, 999, 999,
+	980, 982, 999, 999,
+	865, 999, 885, 999,
+	999, 999, 989, 999,
+	999, 326, 999
+};
+
+static constexpr int16 crowBarTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 518,
+	999, 999, 999, 524,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	518, 518, 518, 518,
+	518, 757, 0, 999,
+	999, 999, 999, 51,
+	999, 249, 999, 999,
+	999, 485, 999, 999,
+	999, 999, 979, 411,
+	999, 456, 999, 999,
+	999, 999, 470, 470,
+	470, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 36, 832,
+	999, 999, 999, 999,
+	999, 433, 999, 583,
+	583, 583, 583, 583,
+	583, 583, 583, 583,
+	583, 583, 583, 999,
+	999, 986, 999, 360,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 753, 984, 981,
+	999, 999, 999, 808,
+	804, 990, 999, 999,
+	22, 67, 85, 100,
+	999, 998, 379, 999,
+	999, 999, 479, 479,
+	999, 995, 999, 999,
+	999, 999, 173, 999,
+	215, 224, 286, 999,
+	330, 342, 349, 360,
+	999, 999, 999, 999,
+	550, 999, 999, 579,
+	999, 999, 999, 628,
+	628, 628, 628, 628,
+	628, 999, 999, 999,
+	988, 686, 999, 999,
+	999, 999, 999, 762,
+	999, 782, 999, 983,
+	980, 982, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 989, 999,
+	999, 324, 999
+};
+
 static constexpr char objectNameTbl[199][21] = {
 	"Nothing.",
 	"Box",
@@ -416,6 +575,27 @@ int Darkseed::Objects::getHandDescriptionTosIdx(uint16 objNum) {
 	return handDescriptionsTbl[objNum];
 }
 
+int16 Darkseed::Objects::getUseGlovesTosIdx(uint16 objNum) {
+	if (objNum >= MAX_OBJECTS) {
+		error("getUseGlovesTosIdx: Object Index out of range! %d", objNum);
+	}
+	return glovesTextTbl[objNum];
+}
+
+int16 Darkseed::Objects::getUseMoneyTosIdx(uint16 objNum) {
+	if (objNum >= MAX_OBJECTS) {
+		error("getUseMoneyTosIdx: Object Index out of range! %d", objNum);
+	}
+	return moneyTextTbl[objNum];
+}
+
+int16 Darkseed::Objects::getUseCrowbarTosIdx(uint16 objNum) {
+	if (objNum >= MAX_OBJECTS) {
+		error("getUseCrowbarTosIdx: Object Index out of range! %d", objNum);
+	}
+	return crowBarTextTbl[objNum];
+}
+
 int Darkseed::Objects::getMoveObjectRoom(uint16 idx) {
 	if (idx >= MAX_OBJECTS) {
 		error("getMoveObjectRoom: index out of range.");
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 2c8e137a0b7..8d80c51801a 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -58,6 +58,9 @@ public:
 	void setMoveObjectX(uint8 objIdx, int16 xPos);
 	int getEyeDescriptionTosIdx(uint16 objNum);
 	int getHandDescriptionTosIdx(uint16 objNum);
+	int16 getUseGlovesTosIdx(uint16 objNum);
+	int16 getUseMoneyTosIdx(uint16 objNum);
+	int16 getUseCrowbarTosIdx(uint16 objNum);
 
 	int getMoveObjectRoom(uint16 idx);
 	void setMoveObjectRoom(uint16 idx, uint8 value);
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 99f9241cea7..a2371b1588f 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -158,6 +158,12 @@ bool Darkseed::Room::load() {
 		return false;
 	}
 
+	for (auto &roomObj : _roomObj) {
+		if (roomObj.objNum < 42 && g_engine->_objectVar.getMoveObjectRoom(roomObj.objNum) != 255) {
+			removeObjectFromRoom(roomObj.objNum);
+		}
+	}
+
 	_pal.load(g_engine->getPictureFilePath(Common::Path(Common::String::format("%s.pal", filenameBase.c_str()))));
 
 	_locationSprites.load(Common::Path(Common::String::format("%s.nsp", filenameBase.c_str())));
@@ -767,9 +773,9 @@ void Darkseed::Room::runRoomObjects() {
 				calculateScaledSpriteDimensions(sprite.width, sprite.height, roomObj.yOffset + sprite.height);
 			}
 			if (((roomObj.spriteNum != 7) && (roomObj.spriteNum != 36)) && ((roomObj.spriteNum != 37 && (((roomObj.spriteNum != 38 && (roomObj.spriteNum != 39)) && (roomObj.spriteNum != 40))))) ) {
-				xPos = (sprite.width / 2 + xPos) - g_engine->scaledSpriteHeight / 2;
+				xPos = (sprite.width / 2 + xPos) - g_engine->scaledSpriteWidth / 2;
 			}
-			if (roomObj.spriteNum == 14) {
+			if (roomObj.spriteNum == 14) { // gloves
 				if (g_engine->_objectVar[86] != 0) {
 					g_engine->_sprites.addSpriteToDrawList(
 						xPos,


Commit: e591f3a018f2896df68a76f227e7de8992239bd4
    https://github.com/scummvm/scummvm/commit/e591f3a018f2896df68a76f227e7de8992239bd4
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added more animation display logic

Changed paths:
    engines/darkseed/darkseed.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index f55d16b9df6..a9aad6a47fb 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -989,6 +989,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 				}
 			} else {
 				if (otherNspAnimationType_maybe == 37) {
+					error("anim: 37");
 //					uVar1 = (uint)BYTE_ARRAY_2c85_41e7[1];
 //					uVar7 = *(undefined2 *)((int)CPlayerSpriteWidthTbl + uVar1 * 2);
 //					uVar4 = *(undefined2 *)((int)CPlayerSpriteHeightTbl + uVar1 * 2);
@@ -1087,17 +1088,23 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(x, y, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe == 43 || otherNspAnimationType_maybe == 44) {
-
+						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+						_sprites.addSpriteToDrawList(303, 105, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe == 62) {
-
-					} else if (otherNspAnimationType_maybe == 45 || otherNspAnimationType_maybe == 46) {
-
+						// TODO
+						error("anim display 62");
+					} else if (otherNspAnimationType_maybe == 45 || otherNspAnimationType_maybe == 46) { // pull lever
+						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+						_sprites.addSpriteToDrawList(446, 124, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe == 36) {
-
+						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+						_sprites.addSpriteToDrawList(339, 78, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe == 59) {
-
+						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+						_sprites.addSpriteToDrawList(433, 91, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe == 37) {
-
+						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+						_sprites.addSpriteToDrawList(428, 78, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe == 10 || otherNspAnimationType_maybe == 11) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(118, 62, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, false);
@@ -1105,13 +1112,15 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(407, 73, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, false);
 					} else if (otherNspAnimationType_maybe == 20) {
-
+						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+						_sprites.addSpriteToDrawList((_player->_position.x - animSprite.width / 2) - 4, _player->_position.y - animSprite.height, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe < 30 || otherNspAnimationType_maybe > 34) {
 						if (otherNspAnimationType_maybe == 40) {
-
+							error("anim 40 display"); // TODO
 						} else if (otherNspAnimationType_maybe < 48 || otherNspAnimationType_maybe > 52) {
 							if (otherNspAnimationType_maybe == 35) {
-
+								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+								_sprites.addSpriteToDrawList(_player->_position.x - 10, _player->_position.y - animSprite.height, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 							} else if (otherNspAnimationType_maybe >= 53 && otherNspAnimationType_maybe <= 56) {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
@@ -1149,13 +1158,13 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						scaledSpriteHeight,
 						player_sprite_related_2c85_82f3);
 				} else if (otherNspAnimationType_maybe == 22) {
-					// TODO
+					error("anim: 22"); // TODO
 				} else if (otherNspAnimationType_maybe == 4 || otherNspAnimationType_maybe == 21) {
-					// TODO
+					error("anim: 4 || 21"); // TODO
 				} else if (otherNspAnimationType_maybe == 39) {
-					// TODO
+					error("anim: 39"); // TODO
 				} else if (otherNspAnimationType_maybe == 47) {
-					// TODO
+					error("anim: 47"); // TODO
 				} else {
 					_sprites.addSpriteToDrawList(
 						_player->_position.x - scaledSpriteWidth / 2,


Commit: 86c595b99757c9eeda109ee61a2773c6ae5b5806
    https://github.com/scummvm/scummvm/commit/86c595b99757c9eeda109ee61a2773c6ae5b5806
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fixed ability to walk out onto balcony from attic after moving trunk.

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index a9aad6a47fb..d178d0b8dc6 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1022,16 +1022,13 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 //				iVar9 = *(int *)((int)otherNspWidthTbl + _player->_frameIdx * 2);
 //				iVar8 = *(int *)((int)&otherNspHeightTbl + _player->_frameIdx * 2);
 				if (otherNspAnimationType_maybe == 0x12) {
-					if (trunkPushCounter == 0) {
+					if (_objectVar[22] == 0) {
 						sprite_y_scaling_threshold_maybe = 0xcb;
-					}
-					else if (trunkPushCounter == 1) {
+					} else if (_objectVar[22] == 1) {
 						sprite_y_scaling_threshold_maybe = 0xcb;
-					}
-					else if (trunkPushCounter == 2) {
+					} else if (_objectVar[22] == 2) {
 						sprite_y_scaling_threshold_maybe = 0xc4;
-					}
-					else {
+					} else {
 						sprite_y_scaling_threshold_maybe = 0xaf;
 					}
 				}
@@ -1539,7 +1536,7 @@ void DarkseedEngine::updateAnimation() {
 			_console->printTosText(_objectVar[22] + 662);
 			_objectVar[22] = _objectVar[22] + 1;
 			if (_objectVar[22] == 3) {
-//				getmovedtrunkbkgnd(); TODO
+				_room->loadRoom61AWalkableLocations();
 			}
 		}
 		break;
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 0157fab647f..68c2e3c36ba 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -92,7 +92,6 @@ public:
 	bool isPlayingAnimation_maybe = false;
 	uint16 otherNspAnimationType_maybe = 0;
 	uint16 headAcheMessageCounter = 0;
-	uint16 trunkPushCounter = 0;
 
 	int sprite_y_scaling_threshold_maybe = 0xf0;
 	int scaledWalkSpeed_maybe = 0;
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index a2371b1588f..e156368e4ae 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -168,6 +168,10 @@ bool Darkseed::Room::load() {
 
 	_locationSprites.load(Common::Path(Common::String::format("%s.nsp", filenameBase.c_str())));
 
+	if (_roomNumber == 61 && g_engine->_objectVar[22] > 2) {
+		loadRoom61AWalkableLocations();
+	}
+	// TODO add more logic from getroomstuff();
 	return true;
 }
 
@@ -628,7 +632,7 @@ void Darkseed::Room::getWalkTargetForObjectType_maybe(int objId) {
 					&& _roomObj[selectedObjIndex].yOffset < room1[j].y
 					&& room1[j].y < _roomObj[selectedObjIndex].yOffset + _roomObj[selectedObjIndex].height
 					) {
-					if (_roomNumber != 0x3d || room1[j].roomNumber == 5 || g_engine->trunkPushCounter > 2) {
+					if (_roomNumber != 61 || room1[j].roomNumber == 5 || g_engine->_objectVar[22] > 2) {
 						g_engine->useDoorTarget = true;
 					}
 					g_engine->targetRoomNumber = room1[j].roomNumber;
@@ -1273,3 +1277,17 @@ void Darkseed::Room::runAnim47() {
 		g_engine->_objectVar.setMoveObjectRoom(19, 100);
 	}
 }
+
+void Darkseed::Room::loadRoom61AWalkableLocations() {
+	Common::File file;
+	Common::Path romFilename = g_engine->getRoomFilePath(Common::Path("room61a.rom"));
+	if(!file.open(romFilename)) {
+		return;
+	}
+
+	file.seek(0x7f);
+
+	for (int i = 0; i < 16; i++) {
+		file.read(walkableLocationsMap[i].strip, 40);
+	}
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index 9e54210f726..ec96aece898 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -101,6 +101,7 @@ public:
 	void updateRoomObj(int16 objNum, int16 x, int16 width, int16 y, int16 height);
 	bool advanceFrame(int animIdx);
 	void runAnim47();
+	void loadRoom61AWalkableLocations();
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);


Commit: d29bc6ba978b4dd36cfb85f7eb6b93d64e72813b
    https://github.com/scummvm/scummvm/commit/d29bc6ba978b4dd36cfb85f7eb6b93d64e72813b
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added more room loading code.

Changed paths:
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index e156368e4ae..23679c7d1de 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -171,7 +171,25 @@ bool Darkseed::Room::load() {
 	if (_roomNumber == 61 && g_engine->_objectVar[22] > 2) {
 		loadRoom61AWalkableLocations();
 	}
-	// TODO add more logic from getroomstuff();
+	if (_roomNumber == 10 && ((g_engine->_currentDay == 3 && g_engine->_currentTimeInSeconds > 39600) || g_engine->_objectVar[88] != 0)) {
+		_locationSprites.load(Common::Path("room15.nsp"));
+		g_engine->_objectVar.setObjectRunningCode(72, 1);
+	}
+	g_engine->_objectVar.setMoveObjectX(45, 230);
+	if (g_engine->_objectVar[45] < 3) {
+		g_engine->_objectVar[45] = 0;
+		g_engine->_objectVar.setMoveObjectPosition(19, {230, 205});
+	}
+	if (g_engine->_objectVar[141] == 8) {
+		g_engine->_objectVar[141] = 7;
+	}
+	if (_roomNumber == 30) {
+		g_engine->_player->loadAnimations("copcard.nsp");
+		// TODO find the right vars in this code for these.
+//		*(undefined2 *)_ObjFrame = 0;
+//		*(undefined2 *)&_ObjFrameTimer = 3;
+		g_engine->_objectVar[1] = 2000;
+	}
 	return true;
 }
 


Commit: d5f539e68f0cc40244fb398cd6440e056ee9cab7
    https://github.com/scummvm/scummvm/commit/d5f539e68f0cc40244fb398cd6440e056ee9cab7
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix palette on fullscreen pictures.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/pal.cpp
    engines/darkseed/pal.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index d178d0b8dc6..cecadc2b0e4 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -172,6 +172,7 @@ void DarkseedEngine::gameloop() {
 				_isLeftMouseClicked = false;
 				delete _fullscreenPic;
 				_fullscreenPic = nullptr;
+				_room->updatePalette();
 			}
 		}
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
@@ -2731,6 +2732,11 @@ void DarkseedEngine::showFullscreenPic(const Common::Path &filename) {
 		_fullscreenPic = nullptr;
 		error("Failed to load %s", filename.toString().c_str());
 	}
+	Common::String filePathStr = filename.toString();
+	debug("Loaded %s", filePathStr.c_str());
+	Common::Path palFilename = Common::Path(filePathStr.substr(0, filePathStr.size() - 4) + ".pal");
+	Pal pal;
+	pal.load(palFilename);
 }
 
 void DarkseedEngine::keeperanim() {
diff --git a/engines/darkseed/pal.cpp b/engines/darkseed/pal.cpp
index bd158476672..d4ee5dd17e4 100644
--- a/engines/darkseed/pal.cpp
+++ b/engines/darkseed/pal.cpp
@@ -38,9 +38,12 @@ bool Pal::load(const Common::Path &filename) {
 	for (int i=0; i < DARKSEED_PAL_SIZE; i++) {
 		palData[i] = palData[i] << 2;
 	}
-	g_system->getPaletteManager()->setPalette(palData, 0, DARKSEED_NUM_PAL_ENTRIES);
-
+	installPalette();
 	return true;
 }
 
+void Pal::installPalette() {
+	g_system->getPaletteManager()->setPalette(palData, 0, DARKSEED_NUM_PAL_ENTRIES);
+}
+
 } // namespace Darkseed
\ No newline at end of file
diff --git a/engines/darkseed/pal.h b/engines/darkseed/pal.h
index f448c927203..4a3d9d3d634 100644
--- a/engines/darkseed/pal.h
+++ b/engines/darkseed/pal.h
@@ -35,6 +35,7 @@ public:
 
 public:
 	bool load(const Common::Path &filename);
+	void installPalette();
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 23679c7d1de..2fa1407b644 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -1309,3 +1309,7 @@ void Darkseed::Room::loadRoom61AWalkableLocations() {
 		file.read(walkableLocationsMap[i].strip, 40);
 	}
 }
+
+void Darkseed::Room::updatePalette() {
+	_pal.installPalette();
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index ec96aece898..c4b581ddbc4 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -102,6 +102,7 @@ public:
 	bool advanceFrame(int animIdx);
 	void runAnim47();
 	void loadRoom61AWalkableLocations();
+	void updatePalette();
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);


Commit: 2e068032068254a2731cd5d7241de5a3cf490ea0
    https://github.com/scummvm/scummvm/commit/2e068032068254a2731cd5d7241de5a3cf490ea0
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: print headache strings. Added day change logic.

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index cecadc2b0e4..cc652520893 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -172,15 +172,19 @@ void DarkseedEngine::gameloop() {
 				_isLeftMouseClicked = false;
 				delete _fullscreenPic;
 				_fullscreenPic = nullptr;
-				_room->updatePalette();
+				_room->restorePalette();
 			}
 		}
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
 		if (systemTimerCounter == 5) {
 			handleInput();
+			if (_room->_roomNumber == 30 && _objectVar[1] == 0 && (otherNspAnimationType_maybe != 40 || !isPlayingAnimation_maybe || _currentTimeInSeconds > 79199)) {
+				gotosleepinjail();
+			}
 			updateDisplay();
 			_isRightMouseClicked = false;
 			_isLeftMouseClicked = false;
+			updateHeadache();
 		}
 		_room->update();
 		_frame.draw();
@@ -1225,7 +1229,7 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		break;
 	case 3:
 		// TODO
-//		if ((_SoundDevice != '\x01') && ((char)_day == '\x03')) {
+//		if ((_SoundDevice != '\x01') && ((char)_currentDay == '\x03')) {
 //			LoadModeSong(7);
 //			PlaySound(0,6,-1);
 //		}
@@ -1338,6 +1342,22 @@ void DarkseedEngine::updateAnimation() {
 //			StopVOC(); TODO
 		}
 		break;
+	case 3:
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+		} else {
+			if (_room->isGiger()) {
+				stuffPlayer();
+			} else {
+				if (_room->isOutside() && _currentTimeInSeconds > 61200) {
+					_room->restorePalette();
+				}
+				gotonextmorning();
+				playDayChangeCutscene();
+			}
+		}
+		break;
 	case 5: // goto sleep animation
 		_player->_position.x = 135;
 		_player->_position.y = 91;
@@ -1346,16 +1366,10 @@ void DarkseedEngine::updateAnimation() {
 			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
 		}
 		else {
-			// advanceToNextMorning();
+			gotonextmorning(); // TODO there might be some extra logic required from original function
 			_player->_position.x = 242;
 			_player->_position.y = 187;
-			if (_currentDay == 4) {
-				playCutscene("Y");
-			} else if (_currentDay == 2) {
-				playCutscene("B");
-			} else if (_currentDay == 3) {
-				playCutscene("C");
-			}
+			playDayChangeCutscene();
 		}
 		_player->_position.x = 242;
 		_player->_position.y = 187;
@@ -2799,4 +2813,48 @@ void DarkseedEngine::genericresponse(int16 useObjNum, int16 targetObjNum, int16
 	// TODO
 }
 
+void DarkseedEngine::updateHeadache() {
+	headAcheMessageCounter++;
+	headAcheMessageCounter &= 63;
+	if (headAcheMessageCounter == 0) {
+		headacheMessageIdx++;
+		if (headacheMessageIdx > 4) {
+			headacheMessageIdx = 0;
+		}
+		if (_objectVar[112] == 0) {
+			_console->printTosText(headacheMessageIdx + 9);
+		}
+	}
+}
+
+void DarkseedEngine::gotosleepinjail() {
+	gotonextmorning();
+	playDayChangeCutscene();
+}
+
+void DarkseedEngine::gotonextmorning() {
+	_currentDay++;
+	_objectVar[47] = 0;
+	_objectVar[62] = 0;
+	_objectVar[112] = 0;
+	_objectVar[52] = 1;
+	_currentTimeInSeconds = 32400;
+//	ClearSpeech(4192,unaff_BP + 1); TODO
+	if (_currentDay == 2) {
+		_objectVar.setMoveObjectRoom(7, 253);
+	} else if (_currentDay == 3) {
+		_objectVar.setMoveObjectRoom(7, 255);
+	}
+}
+
+void DarkseedEngine::playDayChangeCutscene() {
+	if (_currentDay == 4) {
+		playCutscene("Y");
+	} else if (_currentDay == 2) {
+		playCutscene("B");
+	} else if (_currentDay == 3) {
+		playCutscene("C");
+	}
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 68c2e3c36ba..00013ba1186 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -92,6 +92,7 @@ public:
 	bool isPlayingAnimation_maybe = false;
 	uint16 otherNspAnimationType_maybe = 0;
 	uint16 headAcheMessageCounter = 0;
+	uint8 headacheMessageIdx = 0;
 
 	int sprite_y_scaling_threshold_maybe = 0xf0;
 	int scaledWalkSpeed_maybe = 0;
@@ -218,6 +219,11 @@ private:
 	void sargoanim();
 	void gancanim();
 	void putobjunderpillow(int objNum);
+	void gotosleepinjail();
+	void gotonextmorning();
+
+	void updateHeadache();
+	void playDayChangeCutscene();
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 2fa1407b644..a890293a157 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -1310,6 +1310,6 @@ void Darkseed::Room::loadRoom61AWalkableLocations() {
 	}
 }
 
-void Darkseed::Room::updatePalette() {
+void Darkseed::Room::restorePalette() {
 	_pal.installPalette();
 }
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index c4b581ddbc4..d73d69b574e 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -102,7 +102,7 @@ public:
 	bool advanceFrame(int animIdx);
 	void runAnim47();
 	void loadRoom61AWalkableLocations();
-	void updatePalette();
+	void restorePalette();
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);


Commit: ca96c7688fce4034dfdf3987e702f59ad2a3a95a
    https://github.com/scummvm/scummvm/commit/ca96c7688fce4034dfdf3987e702f59ad2a3a95a
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: start updating game time.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/inventory.cpp
    engines/darkseed/inventory.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index cc652520893..b131cfacdca 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -178,10 +178,56 @@ void DarkseedEngine::gameloop() {
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
 		if (systemTimerCounter == 5) {
 			handleInput();
+			// TODO lots of logic
+			if (_room->_roomNumber == 52 && _objectVar[79] == 0) {
+				_objectVar.setObjectRunningCode(79, 1);
+			}
+			if (_room->_roomNumber == 55) {
+				_objectVar.setObjectRunningCode(58, 1);
+			}
+			int prevTime = _currentTimeInSeconds;
+			if (_currentTimeInSeconds * 2 != _fttime) {
+				_fttime = _currentTimeInSeconds * 2;
+			}
+			if (!_room->isGiger()) {
+				_fttime += 4;
+			} else {
+				_fttime += 9;
+			}
+			_currentTimeInSeconds = _fttime / 2;
+			if ((_currentTimeInSeconds == 46800 || _currentTimeInSeconds == 46801) && _currentDay == 2 && _room->_roomNumber != 34) {
+				_objectVar[62] = 0;
+			}
+			// TODO lots of logic
+			if (_currentTimeInSeconds > 79199 && !_player->_isAutoWalkingToBed) {
+				if (_room->isOutside() && _room->_roomNumber != 30) {
+					_inventory.endOfDayOutsideLogic();
+				}
+				if (!isPlayingAnimation_maybe) {
+					if (_room->_roomNumber == 30) {
+						gotosleepinjail();
+					} else {
+						if (_room->_roomNumber != 10) {
+							// TODO release memory.
+						}
+//						makeroomname(); TODO
+//						GetLocationSprites((int)&_file_name);
+						if (!_room->isGiger()) {
+							if (_currentDay == 3) {
+								_console->printTosText(749);
+							}
+							_player->loadAnimations("cliedown.nsp");
+						} else {
+							_player->loadAnimations("gliedown.nsp");
+						}
+						setupOtherNspAnimation(0, 3);
+					}
+				}
+			}
 			if (_room->_roomNumber == 30 && _objectVar[1] == 0 && (otherNspAnimationType_maybe != 40 || !isPlayingAnimation_maybe || _currentTimeInSeconds > 79199)) {
 				gotosleepinjail();
 			}
-			updateDisplay();
+			updateDisplay(); // Aka serviceRoom()
 			_isRightMouseClicked = false;
 			_isLeftMouseClicked = false;
 			updateHeadache();
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 00013ba1186..8d1afc7b577 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -85,6 +85,7 @@ public:
 
 	uint8 _currentDay = 1;
 	int _currentTimeInSeconds = 0x7e8e;
+	int _fttime = 0;
 
 	uint8 _previousRoomNumber = 0;
 	uint16 targetRoomNumber = 0;
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 22aee055cea..9fa83a55d4e 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -163,3 +163,12 @@ Common::Error Darkseed::Inventory::sync(Common::Serializer &s) {
 	update();
 	return Common::kNoError;
 }
+
+void Darkseed::Inventory::endOfDayOutsideLogic() {
+	for (int i = 0; i < _inventoryLength; i++) {
+		g_engine->_objectVar.setMoveObjectRoom(_inventory[i], _inventory[i] == 28 ? 255 : 252);
+	}
+	_inventoryLength = 0;
+	_viewOffset = 0;
+	g_engine->_objectVar[53] = 2;
+}
diff --git a/engines/darkseed/inventory.h b/engines/darkseed/inventory.h
index ae083a5c5fe..b006cb993fa 100644
--- a/engines/darkseed/inventory.h
+++ b/engines/darkseed/inventory.h
@@ -40,6 +40,7 @@ public:
 	void removeItem(uint8 item);
 	void draw();
 	void handleClick();
+	void endOfDayOutsideLogic();
 
 	Common::Error sync(Common::Serializer &s);
 


Commit: 09d06fc879ef5acb885531372a0192143b3f5adb
    https://github.com/scummvm/scummvm/commit/09d06fc879ef5acb885531372a0192143b3f5adb
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Darken sky. Close shops. Jail logic.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/inventory.cpp
    engines/darkseed/inventory.h
    engines/darkseed/pal.cpp
    engines/darkseed/pal.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index b131cfacdca..5d256ae9475 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -178,7 +178,41 @@ void DarkseedEngine::gameloop() {
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
 		if (systemTimerCounter == 5) {
 			handleInput();
-			// TODO lots of logic
+			if (_objectVar[1] != 0) {
+				if (_room->_roomNumber == 30) {
+					if (!_inventory.hasObject(18)) {
+						_objectVar[1]--;
+					}
+				} else {
+					_objectVar[1]--;
+				}
+			}
+			closeShops();
+			if (_room->_roomNumber == 57 && _objectVar.getMoveObjectRoom(28) == 255 && _previousRoomNumber == 54) {
+				if (_objectVar.getMoveObjectRoom(28) == 255) {
+					if (_objectVar[56] == 4) {
+						playSound(21,5,-1);
+					}
+					if (_objectVar[56] == 6) {
+//						LoadModeSong(7);
+						playSound(0,6,-1);
+						stuffPlayer();
+					}
+				} else {
+//					dcopanim(); TODO annoyingly this animation runs inside this function.
+					changeToRoom(59); // TODO implement don't place hero flag.
+					_player->_position = {320, 200};
+					_player->updateSprite();
+					_inventory.gotoJailLogic();
+
+					playSound(0,6,-1);
+				}
+			}
+			if (_currentTimeInSeconds > 35999 && _currentTimeInSeconds < 36005 &&
+				((_currentDay == 1 || (_currentDay == 2 && _objectVar[6] != 0)) ||
+				  (_currentDay == 3 && _objectVar[29] != 0))) {
+				_objectVar.setObjectRunningCode(140, 1);
+			}
 			if (_room->_roomNumber == 52 && _objectVar[79] == 0) {
 				_objectVar.setObjectRunningCode(79, 1);
 			}
@@ -198,6 +232,40 @@ void DarkseedEngine::gameloop() {
 			if ((_currentTimeInSeconds == 46800 || _currentTimeInSeconds == 46801) && _currentDay == 2 && _room->_roomNumber != 34) {
 				_objectVar[62] = 0;
 			}
+			if (_currentDay == 2 && _currentTimeInSeconds > 64799 && prevTime < 64800 && _objectVar[141] == 4) {
+				initDelbertAtSide();
+			}
+			if (_currentDay == 1 && _currentTimeInSeconds == 64800 && _room->_roomNumber != 16) {
+				_objectVar.setMoveObjectRoom(7, 253); // remove scotch from shop.
+			}
+			if (_timeAdvanceEventSelected && _currentTimeInSeconds < 79200 && !isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed) { // TODO && !heroWaiting
+				_timeAdvanceEventSelected = false;
+				if (((_room->_roomNumber == 30) || ((0 < _objectVar[141] && (_objectVar[141] < 4)))) ||
+					(((_room->_roomNumber == 31 || (_room->_roomNumber == 32)) &&
+					  (((((_objectVar[141] == 9 || (_objectVar[141] == 6)) || (_objectVar[141] ==  8))
+						 || ((_objectVar[141] == 7 || (_objectVar[141] == 12)))) ||
+						((_objectVar[141] == 10 || (_objectVar[141] == 5)))))))) {
+					if (_room->_roomNumber == 30) {
+						_console->printTosText(943);
+					}
+				} else {
+					_currentTimeInSeconds += 3600;
+					_currentTimeInSeconds -= (_currentTimeInSeconds % 3600);
+					_console->printTosText(942);
+					if (_currentDay == 2 && _currentTimeInSeconds == 64800 && _objectVar[141] == 4) {
+						initDelbertAtSide();
+					}
+				}
+			}
+			if ((_room->_roomNumber < 10 || _room->_roomNumber == 61 || _room->_roomNumber == 62) && _currentTimeInSeconds % 3600 == 0) {
+				if (_room->_roomNumber == 7) {
+					playSound(45,5,-1);
+				}
+				else {
+					playSound(46,5,-1);
+				}
+			}
+			_room->darkenSky();
 			// TODO lots of logic
 			if (_currentTimeInSeconds > 79199 && !_player->_isAutoWalkingToBed) {
 				if (_room->isOutside() && _room->_roomNumber != 30) {
@@ -261,6 +329,11 @@ void DarkseedEngine::updateEvents() {
 //		case Common::EVENT_RBUTTONUP: _isRightMouseClicked = false; break;
 		case Common::EVENT_LBUTTONDOWN: _isLeftMouseClicked = true; break;
 //		case Common::EVENT_LBUTTONUP: _isLeftMouseClicked = false; break;
+		case Common::EVENT_KEYDOWN:
+			if (event.kbd.keycode == Common::KEYCODE_t) {
+				_timeAdvanceEventSelected = true;
+			}
+			break;
 		default: break;
 		}
 	}
@@ -898,9 +971,19 @@ void DarkseedEngine::handlePointerAction() {
 }
 
 void DarkseedEngine::changeToRoom(int newRoomNumber) {
+	_objectVar[99] = 0;
+	_objectVar[66] = 0;
+	_objectVar[67] = 0;
+	_objectVar[68] = 0;
+
+	if (_objectVar[53] == 3) {
+		_objectVar[53] = 0;
+	}
+
 	delete _room;
 	_room = new Room(newRoomNumber);
-	// TODO more logic here.
+
+	_room->darkenSky();
 	if (_room->_roomNumber == 54) {
 		_objectVar[21] = 0;
 	}
@@ -961,9 +1044,7 @@ void DarkseedEngine::changeToRoom(int newRoomNumber) {
 				_player->_walkTarget = _player->_position;
 			}
 		}
-	}
-	// TODO a bunch of other room codes here.
-	else if (newRoomNumber != 0x22 && (newRoomNumber < 0x13 || newRoomNumber > 0x17)) {
+	} else if (newRoomNumber != 0x22 && (newRoomNumber < 0x13 || newRoomNumber > 0x17)) {
 		for (int i = 0; i < _room->room1.size(); i++) {
 			const RoomExit &roomExit = _room->room1[i];
 			if (roomExit.roomNumber == _previousRoomNumber) {
@@ -2903,4 +2984,34 @@ void DarkseedEngine::playDayChangeCutscene() {
 	}
 }
 
+void DarkseedEngine::closeShops() {
+	if (_currentTimeInSeconds > 68400) {
+		if (_room->_roomNumber == 15) {
+			_previousRoomNumber = 15;
+			_console->printTosText(79);
+			changeToRoom(11);
+		}
+		if (_room->_roomNumber == 16) {
+			_previousRoomNumber = 16;
+			_console->printTosText(80);
+			changeToRoom(11);
+		}
+		if (_room->_roomNumber == 28 || (_room->_roomNumber > 16 && _room->_roomNumber < 24)) {
+			_previousRoomNumber = 17;
+			_console->printTosText(98);
+			changeToRoom(12);
+		}
+	}
+}
+
+void DarkseedEngine::initDelbertAtSide() {
+	_objectVar[141] = 12;
+	_objectVar.setMoveObjectX(141, 563);
+	if (!isPlayingAnimation_maybe || otherNspAnimationType_maybe != 26) {
+		_player->_heroMoving = false;
+		_player->_walkTarget = _player->_position;
+		//*(undefined *)&_ActionToPerform = 0; TODO
+	}
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 8d1afc7b577..4518b42f9c9 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -63,6 +63,7 @@ private:
 	Common::RandomSource _randomSource;
 	Pic _frame;
 	Pic *_fullscreenPic = nullptr;
+	bool _timeAdvanceEventSelected = false;
 
 protected:
 	// Engine APIs
@@ -225,6 +226,8 @@ private:
 
 	void updateHeadache();
 	void playDayChangeCutscene();
+	void closeShops();
+	void initDelbertAtSide();
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 9fa83a55d4e..06640f8356a 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -59,8 +59,8 @@ void Darkseed::Inventory::removeItem(uint8 item) {
 
 void Darkseed::Inventory::update() {
 	if (_viewOffset != 0) {
-		if (_inventoryLength <= _viewOffset + MAX_ICONS) {
-			_viewOffset = _inventoryLength - MAX_ICONS;
+		if (_inventoryLength <= _viewOffset + (MAX_ICONS - 1)) {
+			_viewOffset = _inventoryLength - (MAX_ICONS - 1);
 		}
 		if (_viewOffset > 50) {
 			_viewOffset = 0;
@@ -172,3 +172,22 @@ void Darkseed::Inventory::endOfDayOutsideLogic() {
 	_viewOffset = 0;
 	g_engine->_objectVar[53] = 2;
 }
+
+void Darkseed::Inventory::gotoJailLogic() {
+	for (int i = 0; i < _inventoryLength; i++) {
+		g_engine->_objectVar.setMoveObjectRoom(_inventory[i], 100);
+	}
+	g_engine->_objectVar.setMoveObjectRoom(28, 255);
+	_inventoryLength = 0;
+	_viewOffset = 0;
+	update();
+}
+
+bool Darkseed::Inventory::hasObject(uint8 objNum) {
+	for (int i = 0; i < _inventoryLength; i++) {
+		if (_inventory[i] == objNum) {
+			return true;
+		}
+	}
+	return false;
+}
diff --git a/engines/darkseed/inventory.h b/engines/darkseed/inventory.h
index b006cb993fa..b0f0bb0604d 100644
--- a/engines/darkseed/inventory.h
+++ b/engines/darkseed/inventory.h
@@ -41,6 +41,8 @@ public:
 	void draw();
 	void handleClick();
 	void endOfDayOutsideLogic();
+	void gotoJailLogic();
+	bool hasObject(uint8 objNum);
 
 	Common::Error sync(Common::Serializer &s);
 
diff --git a/engines/darkseed/pal.cpp b/engines/darkseed/pal.cpp
index d4ee5dd17e4..4f97f266f98 100644
--- a/engines/darkseed/pal.cpp
+++ b/engines/darkseed/pal.cpp
@@ -27,6 +27,11 @@ namespace Darkseed {
 
 #define DARKSEED_NUM_PAL_ENTRIES 16
 #define DARKSEED_PAL_SIZE DARKSEED_NUM_PAL_ENTRIES * 3
+
+Pal::Pal(const Pal &pal) {
+	memcpy(palData, pal.palData, DARKSEED_PAL_SIZE);
+}
+
 bool Pal::load(const Common::Path &filename) {
 	Common::File file;
 	if(!file.open(filename)) {
diff --git a/engines/darkseed/pal.h b/engines/darkseed/pal.h
index 4a3d9d3d634..f131f2e527a 100644
--- a/engines/darkseed/pal.h
+++ b/engines/darkseed/pal.h
@@ -34,6 +34,8 @@ public:
 	byte palData[DARKSEED_PAL_SIZE];
 
 public:
+	Pal() {};
+	Pal(const Pal &pal);
 	bool load(const Common::Path &filename);
 	void installPalette();
 };
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index a890293a157..00517a50aa7 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -1313,3 +1313,21 @@ void Darkseed::Room::loadRoom61AWalkableLocations() {
 void Darkseed::Room::restorePalette() {
 	_pal.installPalette();
 }
+
+void Darkseed::Room::darkenSky() {
+	if (isOutside() && g_engine->_currentTimeInSeconds / 3600 > 16) {
+		Pal workPal(_pal);
+		int timeOffset = g_engine->_currentTimeInSeconds - 61200;
+		if (timeOffset == 0) {
+			timeOffset = 1;
+		}
+		for (int i = 0; i < DARKSEED_PAL_SIZE; i++) {
+			uint8 p = workPal.palData[i];
+			if (p == 0) {
+				p = 1;
+			}
+			workPal.palData[i] = p - (p / (26 - timeOffset / 750));
+		}
+		workPal.installPalette();
+	}
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index d73d69b574e..8788ff8a2f0 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -103,6 +103,7 @@ public:
 	void runAnim47();
 	void loadRoom61AWalkableLocations();
 	void restorePalette();
+	void darkenSky();
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);


Commit: 94cbe6334e9015fdcf536fabed6a57a8b38eb1a6
    https://github.com/scummvm/scummvm/commit/94cbe6334e9015fdcf536fabed6a57a8b38eb1a6
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: More usecode logic.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 5d256ae9475..d1b6aeda272 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1153,7 +1153,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 				}
 //				iVar9 = *(int *)((int)otherNspWidthTbl + _player->_frameIdx * 2);
 //				iVar8 = *(int *)((int)&otherNspHeightTbl + _player->_frameIdx * 2);
-				if (otherNspAnimationType_maybe == 0x12) {
+				if (otherNspAnimationType_maybe == 18) {
 					if (_objectVar[22] == 0) {
 						sprite_y_scaling_threshold_maybe = 0xcb;
 					} else if (_objectVar[22] == 1) {
@@ -1170,29 +1170,14 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 					_player->_animations.getSpriteAt(_player->_frameIdx).height,
 					nsp_sprite_scaling_y_position != 0 ? nsp_sprite_scaling_y_position : _player->_position.y);
 
-				if (otherNspAnimationType_maybe == 3) {
-//					uVar1 = _curPlayerSpriteWidth & 0xff;
-//					uVar2 = _curPlayerSpriteHeight_maybe & 0xff;
-//					calculateScaledPlayerSpriteDimensions
-//						(*(undefined2 *)((int)otherNspWidthTbl + (_player->_frameIdx + 1) * 2),
-//						 *(undefined2 *)((int)&otherNspHeightTbl + (_player->_frameIdx + 1) * 2),playerSpriteY_maybe);
-//					if (otherNspAnimationType_maybe == 3) {
-//						uVar3 = ((_curPlayerSpriteWidth & 0xff) + uVar1) / 2;
-//						iVar5 = playerSpriteX_maybe - uVar3;
-//					}
-//					else {
-//						uVar11 = 0;
-//						uVar10 = 1000;
-//						uVar7 = scaledWalkSpeed_maybe._2_2_;
-//						uVar4 = LXMUL@(CONCAT22((undefined2)scaledWalkSpeed_maybe,scaledWalkSpeed_maybe._2_2_),0x2d0000);
-//						uVar3 = LUMOD@(uVar4,uVar7,uVar10,uVar11);
-//						iVar5 = playerSpriteX_maybe - uVar3;
-//					}
-//					addSpriteToDraw(iVar5,playerSpriteY_maybe - uVar2,iVar9,iVar8,
-//									*(undefined2 *)((int)otherNspSpritePtr + _player->_frameIdx * 4),
-//									*(undefined2 *)((int)&otherNspSpritePtr[0].Offset + _player->_frameIdx * 4),
-//									240 - playerSpriteY_maybe,uVar1,uVar2,uVar3 & 0xff00);
-//					bVar6 = extraout_AH_01;
+				if (otherNspAnimationType_maybe == 3) { // fall unconscious outside.
+					int curScaledWidth = g_engine->scaledSpriteWidth;
+					int curScaledHeight = g_engine->scaledSpriteHeight;
+					_room->calculateScaledSpriteDimensions(
+						_player->_animations.getSpriteAt(_player->_frameIdx+1).width,
+						_player->_animations.getSpriteAt(_player->_frameIdx+1).height, _player->_position.y);
+					const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+					_sprites.addSpriteToDrawList(_player->_position.x - (curScaledWidth + g_engine->scaledSpriteWidth) / 2, _player->_position.y - curScaledHeight, &animSprite, 240 - _player->_position.y, curScaledWidth, curScaledHeight, false);
 				} else if (!_scaleSequence) {
 					if (otherNspAnimationType_maybe == 17) { // open trunk
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
@@ -1725,7 +1710,7 @@ void DarkseedEngine::updateAnimation() {
 					changeToRoom(newRoomNumber);
 				} else {
 					_objectVar.setObjectRunningCode(140, 0);
-					getPackage(_currentDay);
+					getPackageObj(_currentDay);
 				}
 			}
 			if (otherNspAnimationType_maybe == 25) {
@@ -1791,6 +1776,19 @@ void DarkseedEngine::updateAnimation() {
 		}
 		break;
 	}
+	case 35: // pay shopkeeper
+		advanceAnimationFrame(6);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(6).frameNo[animIndexTbl[6]];
+		} else {
+			_objectVar[8]++;
+			if (_objectVar[8] > 2) {
+				_inventory.removeItem(8);
+			}
+			_objectVar[138]++;
+			_console->printTosText(927);
+		}
+		break;
 	case 41:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -1969,32 +1967,44 @@ Common::Path DarkseedEngine::getPictureFilePath(const Common::Path &filename) {
 	return filename;
 }
 
-void DarkseedEngine::handleObjCollision(int objNum) {
-	if (objNum == 35 && _objectVar[22] < 2 && _cursor.getY() > 40) {
-		objNum = 22;
+void DarkseedEngine::handleObjCollision(int targetObjNum) {
+	if (targetObjNum == 35 && _objectVar[22] < 2 && _cursor.getY() > 40) {
+		targetObjNum = 22;
 	}
-	if (_actionMode == LookAction || _actionMode == HandAction || objNum != 115) {
+	if (_actionMode == LookAction || _actionMode == HandAction || targetObjNum != 115) {
 		if (_cursor.getY() < 10 && _actionMode > LookAction) {
 			// TODO handle inventory
 			// 171d:53c3
 		} else {
 			switch (_actionMode) {
 			case HandAction:
-				useCode(objNum);
+				useCode(targetObjNum);
 				break;
 			case LookAction:
-				lookCode(objNum);
+				lookCode(targetObjNum);
 				break;
 			case 5:
-				useCrowBar(objNum);
+				useCrowBar(targetObjNum);
+				break;
+			case 6:
+			case 12:
+			case 29:
+				useCodeJournal(_actionMode, targetObjNum);
+				break;
+			case 7:
+			case 36:
+			case 37:
+			case 38:
+			case 39:
+			case 40:
+				useCodeShopItems(_actionMode, targetObjNum);
 				break;
-				// TODO lots of extra switch cases here for inventory usages.
 			case 8:
-				useCodeMoney(objNum);
+				useCodeMoney(targetObjNum);
 				break;
 				// TODO lots of extra switch cases here for inventory usages.
 			case 14:
-				useCodeGloves(objNum);
+				useCodeGloves(targetObjNum);
 				break;
 			// TODO lots of extra switch cases here for inventory usages.
 			default:
@@ -2583,6 +2593,280 @@ void DarkseedEngine::useCodeMoney(int16 targetObjNum) {
 	}
 }
 
+void DarkseedEngine::useCodeJournal(int16 actionObjNum, int16 targetObjNum) {
+	if (targetObjNum == 113) {
+		putobjunderpillow(actionObjNum);
+	} else if ((actionObjNum == 6) && (targetObjNum == 47)) {
+		_console->printTosText(46);
+	} else if ((actionObjNum == 6) && (targetObjNum == 100)) {
+		_console->printTosText(145);
+	} else if ((actionObjNum == 6) && (targetObjNum == 136)) {
+		_console->printTosText(999);
+	} else {
+		int16 tosIdx = _objectVar.getUseJournalTosIdx(targetObjNum);
+		if (tosIdx != 0) {
+			if (tosIdx < 979) {
+				_console->printTosText(tosIdx);
+			}
+			else {
+				genericresponse(6,targetObjNum, tosIdx);
+			}
+		}
+	}
+}
+
+void DarkseedEngine::useCodeShopItems(int16 actionObjNum, int16 targetObjNum) {
+	if (actionObjNum == 7) {
+		if (targetObjNum == 44) {
+			_player->loadAnimations("opendoor.nsp");
+			setupOtherNspAnimation(0, 24);
+			_objectVar[44] = 3600;
+			playSound(32, 5, -1);
+			_inventory.removeItem(7);
+			_console->printTosText(730);
+		} else if ((targetObjNum == 141) && (_objectVar[141] == 7)) {
+			_objectVar[141] = 8;
+		} else if (targetObjNum == 47) {
+			_console->printTosText(54);
+		} else if (targetObjNum == 127) {
+			_console->printTosText(106);
+		} else if (targetObjNum == 123) {
+			_console->printTosText(129);
+		} else if (targetObjNum == 100) {
+			_console->printTosText(153);
+		} else if (targetObjNum == 143) {
+			_console->printTosText(189);
+		} else if (targetObjNum == 52) {
+			_console->printTosText(202);
+		} else if (targetObjNum == 145) {
+			_console->printTosText(226);
+		} else if (targetObjNum == 137) {
+			_console->printTosText(300);
+		} else if (targetObjNum == 126) {
+			_console->printTosText(312);
+		} else if (targetObjNum == 103 || targetObjNum == 151) {
+			_console->printTosText(362);
+		} else if (targetObjNum == 109) {
+			_console->printTosText(965);
+		} else if (targetObjNum == 61) {
+			_console->printTosText(460);
+		} else if (targetObjNum == 53) {
+			_console->printTosText(489);
+			throwmikeinjail();
+		} else if (targetObjNum == 46) {
+			_console->printTosText(542);
+		} else if (targetObjNum < 87 || 98 < targetObjNum) {
+			if (targetObjNum < 163 || 168 < targetObjNum) {
+				if (targetObjNum == 171) {
+					_console->printTosText(679);
+				} else if (targetObjNum == 129) {
+					genericresponse(7, 129, 998);
+				} else if (targetObjNum == 108) {
+					_console->printTosText(386);
+				} else if (targetObjNum == 110) {
+					_console->printTosText(392);
+				} else if (targetObjNum == 85) {
+					_console->printTosText(434);
+				} else if (targetObjNum == 194) {
+					genericresponse(7, 194, 989);
+				} else if (targetObjNum == 156) {
+					_console->printTosText(550);
+				} else if (targetObjNum == 172) {
+					genericresponse(7, 172, 988);
+				} else if (targetObjNum == 71) {
+					genericresponse(7, 71, 987);
+				} else if (targetObjNum == 101) {
+					genericresponse(7, 101, 986);
+				} else if (targetObjNum == 120) {
+					_console->printTosText(804);
+				} else if (targetObjNum == 184) {
+					genericresponse(7, 184, 980);
+				} else if (targetObjNum == 185) {
+					genericresponse(7, 185, 982);
+				} else if (targetObjNum == 121) {
+					genericresponse(7, 121, 990);
+				} else {
+					genericresponse(7, targetObjNum, 999);
+				}
+			} else {
+				_console->printTosText(632);
+			}
+		} else {
+			_console->printTosText(585);
+		}
+		return;
+	}
+	if (actionObjNum == 38 && targetObjNum == 78) {
+		_console->printTosText(42);
+		return;
+	}
+	if (actionObjNum == 38 && targetObjNum == 47) {
+		_console->printTosText(60);
+		return;
+	}
+	if (actionObjNum == 36 && targetObjNum == 125) {
+		_console->printTosText(77);
+		return;
+	}
+	if (actionObjNum == 38 && targetObjNum == 125) {
+		_console->printTosText(78);
+		return;
+	}
+	if (actionObjNum == 38 &&
+		(((((targetObjNum == 126 || targetObjNum == 126) || targetObjNum == 197) ||
+		   ((targetObjNum == 131 || (targetObjNum == 89)))) ||
+		  targetObjNum == 171))) {
+		_console->printTosText(89);
+		return;
+	}
+	if (actionObjNum == 37 && targetObjNum == 124) {
+		_console->printTosText(28);
+	} else if (actionObjNum == 38 && targetObjNum == 127) {
+		_console->printTosText(116);
+	} else if ((actionObjNum == 36 || actionObjNum == 37) && targetObjNum == 123) {
+		_console->printTosText(135);
+	} else if (actionObjNum == 38 && (targetObjNum == 123 || targetObjNum == 318)) {
+		_console->printTosText(320);
+	} else if (targetObjNum == 129) {
+		genericresponse(actionObjNum, 129, 998);
+	} else if ((actionObjNum == 37) &&
+			   ((((((targetObjNum == 142 || (targetObjNum == 124)) ||
+					((targetObjNum == 137 || (((targetObjNum == 148 || (targetObjNum == 109)) || (targetObjNum == 59)))))) ||
+				   ((targetObjNum == 66 || (targetObjNum == 67)))) ||
+				  (targetObjNum == 68)) ||
+				 ((((targetObjNum == 133 || (targetObjNum == 194)) ||
+					((targetObjNum == 46 ||
+					  (((((targetObjNum == 156 || (targetObjNum == 158)) || (targetObjNum == 159)) ||
+						 ((targetObjNum == 161 || (targetObjNum == 162)))) ||
+						(targetObjNum == 22)))))) ||
+				   (((targetObjNum == 42 || (targetObjNum == 35)) ||
+					 ((targetObjNum == 196 ||
+					   ((((targetObjNum == 170 || (targetObjNum == 172)) || (targetObjNum == 25)) ||
+						 (((targetObjNum == 71 || (targetObjNum == 101)) || (targetObjNum == 179)))))))))))))) {
+		_console->printTosText(180);
+	} else if ((actionObjNum == 37) && (targetObjNum == 52)) {
+		_console->printTosText(211);
+	} else if ((actionObjNum == 37) && (targetObjNum == 144)) {
+		_console->printTosText(218);
+	} else if ((actionObjNum == 37) && (targetObjNum == 145)) {
+		_console->printTosText(229);
+	} else if ((actionObjNum == 38) && (targetObjNum == 145)) {
+		_console->printTosText(230);
+	} else if (targetObjNum == 112) {
+		genericresponse(actionObjNum, 112, 996);
+	} else if ((actionObjNum == 38) && (targetObjNum == 49)) {
+		_console->printTosText(251);
+	} else if ((targetObjNum == 147) && (actionObjNum != 7)) {
+		_console->printTosText(319);
+	} else if (targetObjNum == 197) {
+		genericresponse(actionObjNum, 197, 993);
+	} else if ((actionObjNum == 38) && (targetObjNum == 150)) {
+		_console->printTosText(354);
+	} else if (targetObjNum == 109) {
+		if (actionObjNum == 38) {
+			_console->printTosText(375);
+		} else {
+			_console->printTosText(374);
+		}
+	} else if (targetObjNum == 130) {
+		genericresponse(actionObjNum, 130, 991);
+	} else if (targetObjNum == 108) {
+		_console->printTosText(386);
+	} else if (targetObjNum == 110) {
+		_console->printTosText(392);
+	} else if ((targetObjNum == 131) && (actionObjNum != 7)) {
+		_console->printTosText(405);
+	} else if (targetObjNum == 85) {
+		_console->printTosText(434);
+	} else if (targetObjNum == 121) {
+		if (actionObjNum == 38) {
+			_console->printTosText(445);
+		} else if (actionObjNum == 40) {
+			_console->printTosText(446);
+		} else {
+			genericresponse(actionObjNum, 121, 990);
+		}
+	} else if ((actionObjNum == 37) && (targetObjNum == 122)) {
+		_console->printTosText(451);
+	} else if ((actionObjNum == 38) || (targetObjNum != 61)) {
+		if ((actionObjNum == 36) && (targetObjNum == 133)) {
+			_console->printTosText(476);
+		} else if (((actionObjNum == 36) || (actionObjNum == 40)) && (targetObjNum == 53)) {
+			_console->printTosText(491);
+		} else if ((actionObjNum == 37) && (targetObjNum == 53)) {
+			_console->printTosText(492);
+		} else if (targetObjNum == 194) {
+			genericresponse(actionObjNum, 194, 989);
+		} else if (targetObjNum == 153) {
+			_console->printTosText(405);
+		} else if ((actionObjNum == 37) && (targetObjNum == 154)) {
+			_console->printTosText(535);
+		} else if ((actionObjNum == 36) && (targetObjNum == 46)) {
+			_console->printTosText(405);
+		} else if ((actionObjNum == 38) && (targetObjNum == 46)) {
+			_console->printTosText(545);
+		} else if ((actionObjNum == 40) && (targetObjNum == 46)) {
+			_console->printTosText(405);
+		} else if (targetObjNum == 156) {
+			_console->printTosText(550);
+		} else if (targetObjNum == 159) {
+			_console->printTosText(577);
+		} else if ((targetObjNum < 87) || (98 < targetObjNum)) {
+			if ((actionObjNum == 37) && ((162 < targetObjNum && (targetObjNum < 169)))) {
+				_console->printTosText(634);
+			} else if ((actionObjNum == 38) && ((162 < targetObjNum && (targetObjNum < 169)))) {
+				_console->printTosText(635);
+			} else if (targetObjNum == 172) {
+				genericresponse(actionObjNum, 172, 988);
+			} else if ((actionObjNum == 37) && (targetObjNum == 174)) {
+				_console->printTosText(690);
+			} else if ((actionObjNum == 38) && (targetObjNum == 25)) {
+				_console->printTosText(696);
+			} else if ((actionObjNum == 40) && (targetObjNum == 26)) {
+				_console->printTosText(700);
+			} else if (targetObjNum == 71) {
+				genericresponse(actionObjNum, 71, 987);
+			} else if ((actionObjNum == 39) && (targetObjNum == 44)) {
+				_console->printTosText(731);
+			} else if (targetObjNum == 101) {
+				genericresponse(actionObjNum, 101, 986);
+			} else if (targetObjNum == 113) {
+				_console->printTosText(753);
+			} else if (targetObjNum == 41) {
+				_console->printTosText(757);
+			} else if ((actionObjNum == 36) && (targetObjNum == 179)) {
+				_console->printTosText(764);
+			} else if ((actionObjNum == 38) && (targetObjNum == 179)) {
+				_console->printTosText(762);
+			} else if ((actionObjNum == 38) && (targetObjNum == 180)) {
+				_console->printTosText(769);
+			} else if (targetObjNum == 120) {
+				_console->printTosText(804);
+			} else if ((actionObjNum == 38) && (targetObjNum == 119)) {
+				_console->printTosText(808);
+			} else if ((actionObjNum == 38) && (targetObjNum == 114)) {
+				genericresponse(38, 114, 984);
+			} else if (targetObjNum == 184) {
+				genericresponse(actionObjNum, 184, 980);
+			} else if (targetObjNum == 185) {
+				genericresponse(actionObjNum, 185, 982);
+			} else if ((actionObjNum == 38) && (targetObjNum == 79)) {
+				_console->printTosText(833);
+			} else if ((targetObjNum == 79) && (actionObjNum != 7)) {
+				_console->printTosText(836);
+			} else if ((actionObjNum == 38) && (targetObjNum == 58)) {
+				_console->printTosText(849);
+			} else {
+				genericresponse(actionObjNum, targetObjNum, 999);
+			}
+		} else {
+			_console->printTosText(587);
+		}
+	} else {
+		_console->printTosText(462);
+	}
+}
+
 void DarkseedEngine::useCrowBar(int16 targetObjNum) {
 	int16 tosIdx = _objectVar.getUseCrowbarTosIdx(targetObjNum);
 	if (tosIdx != 0) {
@@ -2852,11 +3136,6 @@ void DarkseedEngine::wongame() {
 	// TODO
 }
 
-void DarkseedEngine::getPackage(int state) {
-	_console->printTosText(424);
-	// TODO handle different getPackage states.
-}
-
 void DarkseedEngine::printTime() {
 	_console->printTosText(958);
 	int hour = g_engine->_currentTimeInSeconds / 60 / 60 + 1;
@@ -3014,4 +3293,20 @@ void DarkseedEngine::initDelbertAtSide() {
 	}
 }
 
+void DarkseedEngine::throwmikeinjail() {
+	_console->printTosText(912);
+	if (_room->_roomNumber == 15) {
+		playSound(0,6,-1);
+	}
+	_player->_position = {250, 200};
+	isPlayingAnimation_maybe = false;
+	_player->_frameIdx = 26;
+	changeToRoom(30);
+	_objectVar.setMoveObjectRoom(28, 255);
+	_inventory.removeItem(28);
+	_objectVar[1] = 500;
+	_objectVar[88] = 0;
+	_objectVar.setObjectRunningCode(72, 0);
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 4518b42f9c9..9714482ae37 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -192,12 +192,13 @@ public:
 	void debugTeleportToRoom(int newRoomNumber, int entranceNumber);
 	void showFullscreenPic(const Common::Path &filename);
 	void lookCode(int objNum);
-	void handleObjCollision(int objNum);
+	void handleObjCollision(int targetObjNum);
 	void playCutscene(const Common::String cutsceneId);
 	void playSound(int16 unk, uint8 unk1, int16 unk2);
 	void nextFrame(int nspAminIdx);
 	void stuffPlayer();
 	void genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx);
+	void throwmikeinjail();
 private:
 	void updateAnimation();
 	void advanceAnimationFrame(int nspAminIdx);
@@ -212,10 +213,11 @@ private:
 	void useCode(int objNum);
 	void useCodeGloves(int16 targetObjNum);
 	void useCodeMoney(int16 targetObjNum);
+	void useCodeJournal(int16 actionObjNum, int16 targetObjNum);
+	void useCodeShopItems(int16 actionObjNum, int16 targetObjNum);
 	void useCrowBar(int16 targetObjNum);
 	void getPackageObj(int packageType);
 	void wongame();
-	void getPackage(int state);
 	void printTime();
 	void keeperanim();
 	void sargoanim();
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index a9bb73cad30..e0988b6b7bd 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -356,6 +356,59 @@ static constexpr int16 crowBarTextTbl[199] = {
 	999, 324, 999
 };
 
+static constexpr int16 journalTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 486, 999,
+	868, 999, 999, 999,
+	196, 486, 999, 999,
+	999, 999, 999, 999,
+	999, 455, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 986, 999, 999,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 999, 999, 981,
+	999, 999, 999, 999,
+	804, 999, 999, 999,
+	999, 999, 82, 93,
+	999, 998, 991, 999,
+	999, 999, 999, 999,
+	999, 299, 999, 999,
+	999, 999, 999, 999,
+	999, 222, 146, 309,
+	999, 999, 999, 999,
+	486, 999, 999, 999,
+	550, 999, 999, 577,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	988, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	980, 982, 999, 864,
+	999, 999, 999, 999,
+	999, 999, 989, 999,
+	999, 994, 999
+};
+
 static constexpr char objectNameTbl[199][21] = {
 	"Nothing.",
 	"Box",
@@ -596,6 +649,13 @@ int16 Darkseed::Objects::getUseCrowbarTosIdx(uint16 objNum) {
 	return crowBarTextTbl[objNum];
 }
 
+int16 Darkseed::Objects::getUseJournalTosIdx(uint16 objNum) {
+	if (objNum >= MAX_OBJECTS) {
+		error("getUseJournalTosIdx: Object Index out of range! %d", objNum);
+	}
+	return journalTextTbl[objNum];
+}
+
 int Darkseed::Objects::getMoveObjectRoom(uint16 idx) {
 	if (idx >= MAX_OBJECTS) {
 		error("getMoveObjectRoom: index out of range.");
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 8d80c51801a..a58722c7aa0 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -61,6 +61,7 @@ public:
 	int16 getUseGlovesTosIdx(uint16 objNum);
 	int16 getUseMoneyTosIdx(uint16 objNum);
 	int16 getUseCrowbarTosIdx(uint16 objNum);
+	int16 getUseJournalTosIdx(uint16 objNum);
 
 	int getMoveObjectRoom(uint16 idx);
 	void setMoveObjectRoom(uint16 idx, uint8 value);
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 00517a50aa7..7fb9643c536 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -856,7 +856,7 @@ void Darkseed::Room::runRoomObjects() {
 			}
 
 			if (_roomNumber == 16 && g_engine->isPlayingAnimation_maybe && g_engine->otherNspAnimationType_maybe == 35) {
-				const Sprite &sprite = g_engine->_player->getSprite(spriteNum);
+				const Sprite &sprite = g_engine->_player->_animations.getSpriteAt(spriteNum);
 				g_engine->_sprites.addSpriteToDrawList(
 					xPos,
 					yPos,


Commit: 366112c6a40997554e9bb792e5e5c5e194dd9b84
    https://github.com/scummvm/scummvm/commit/366112c6a40997554e9bb792e5e5c5e194dd9b84
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Started on runObjects()

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/player.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index d1b6aeda272..dc3f883caf9 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1088,6 +1088,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 	int currentRoomNumber = _room->_roomNumber;
 	_sprites.clearSpriteDrawList();
 	_room->runRoomObjects();
+	runObjects();
 //	FUN_2022_413a();
 	if (isPlayingAnimation_maybe == 0 ||
 		(otherNspAnimationType_maybe != 6 && otherNspAnimationType_maybe != 7) || currentRoomNumber != 5) {
@@ -3309,4 +3310,62 @@ void DarkseedEngine::throwmikeinjail() {
 	_objectVar.setObjectRunningCode(72, 0);
 }
 
+void DarkseedEngine::runObjects() {
+	if (((g_engine->_objectVar[44] != 0) && (g_engine->_objectVar[71] == 2))) {
+		g_engine->_objectVar[44] -= 2;
+		if (g_engine->_objectVar[44] == 0) {
+			g_engine->_objectVar[71] = 2;
+		}
+	}
+
+	if (g_engine->_objectVar[35] != 0) {
+		g_engine->_objectVar[35]--;
+	}
+	if (((_room->_roomNumber == 46) || (_room->_roomNumber == 60)) &&
+		(((_SoundTimer & 15) == 0 && (g_engine->_objectVar[57] == 1)))) {
+		playSound(9,5,-1);
+	}
+	if ((_room->_roomNumber == 12) && (_SoundTimer > 5)) {
+		_SoundTimer = 0;
+	}
+	if (((_room->_roomNumber == 8) && (_SoundTimer > 5)) && (g_engine->_objectVar[110] != 0)) {
+		_SoundTimer = 0;
+	}
+	if ((_room->_roomNumber == 38) && ((_SoundTimer & 31) == 0)) {
+		playSound(23,5,-1);
+	}
+	if ((_room->_roomNumber == 45) && ((_SoundTimer & 63) == 0)) {
+		playSound(10,5,-1);
+	}
+
+	if (_objectVar[141] == 8 && _room->_roomNumber == 31) {
+
+	}
+	if (_objectVar[141] == 9) {
+
+	}
+	if (_objectVar[141] == 10 && _room->_roomNumber == 31) {
+
+	}
+	if (_objectVar[141] == 7 && _room->_roomNumber == 31) {
+
+	}
+	if ((_objectVar[141] == 7 || _objectVar[141] == 8) && _room->_roomNumber == 31) {
+
+	}
+	if (_objectVar[141] > 0 && _objectVar[141] < 4) {
+		_player->_herowaiting = true;
+		if (_player->_walkToSequence == false && _player->_position.x != 290 && _player->_position.y != 209) {
+			_player->_walkTarget = {290, 209};
+			// TODO reset walk path here
+			_player->playerFaceWalkTarget();
+		}
+		if (_player->_position.x == 290 && _player->_position.y == 209 && !_player->_playerIsChangingDirection && _player->_direction != 3) {
+			_player->changeDirection(_player->_direction, 3);
+		}
+		// TODO more logic here
+	}
+	// TODO more logic here.
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 9714482ae37..d080e8f71f5 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -124,6 +124,8 @@ public:
 
 	bool _debugShowWalkPath = false;
 	int _phoneStatus = 0;
+
+	int16 _SoundTimer = 0;
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	~DarkseedEngine() override;
@@ -199,6 +201,7 @@ public:
 	void stuffPlayer();
 	void genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx);
 	void throwmikeinjail();
+	void runObjects();
 private:
 	void updateAnimation();
 	void advanceAnimationFrame(int nspAminIdx);
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index 33baa85b2d1..edbbf4ed19c 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -46,9 +46,10 @@ public:
 	int16 playerNewFacingDirection_maybe = 0;
 	uint16 playerWalkFrameIdx = 0;
 	bool isPlayerWalking_maybe = false; // player is pathfinding to some destination?
-	bool _playerIsChangingDirection = false;
+	bool _playerIsChangingDirection = false; // AKA _Rotating
 	bool _isAutoWalkingToBed = false;
 	bool _heroMoving = false; // maybe set to true while player is walking around the room.
+	bool _herowaiting = false;
 	int walkPathIndex = -1;
 	uint16 numConnectorsInWalkPath = 0;
 	Common::Array<Common::Point> _connectorList;


Commit: 4b973da7c892759f2f942bca3d1a4d9e90cfa3a6
    https://github.com/scummvm/scummvm/commit/4b973da7c892759f2f942bca3d1a4d9e90cfa3a6
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: More work on delbert shop scene

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index dc3f883caf9..7e6d9c7b83f 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1375,6 +1375,9 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		_player->_position.x = 324;
 		_player->_position.y = 50;
 		break;
+	case 20:
+		spriteAnimCountdownTimer[3] = 3;
+		break;
 	case 26 :
 		_player->_position.x = 324;
 		_player->_position.y = 135;
@@ -1668,6 +1671,14 @@ void DarkseedEngine::updateAnimation() {
 			}
 		}
 		break;
+	case 20: // receive card from delbert
+		advanceAnimationFrame(3);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(3).frameNo[animIndexTbl[3]];
+		} else {
+			_inventory.addItem(18);
+		}
+		break;
 	case 10:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -3074,7 +3085,7 @@ void DarkseedEngine::lookCode(int objNum) {
 		return;
 	}
 	if (objNum == 18 && _cursor.getY() < 40) {
-		showFullscreenPic(_room->isGiger() ? "gbcard.pic" : "cbcard.pic");
+		showFullscreenPic(_room->isGiger() ? "gbcard01.pic" : "cbcard01.pic");
 		return;
 	}
 	if (objNum == 6 && _cursor.getY() < 40) {
@@ -3363,6 +3374,37 @@ void DarkseedEngine::runObjects() {
 		if (_player->_position.x == 290 && _player->_position.y == 209 && !_player->_playerIsChangingDirection && _player->_direction != 3) {
 			_player->changeDirection(_player->_direction, 3);
 		}
+		isAnimFinished_maybe = false;
+		if (!_ct_voice_status && (_objectVar[141] != 2 || _delbertspeech > 64)) {
+			nextFrame(_objectVar[141] - 1);
+		}
+		if (isAnimFinished_maybe) {
+			_objectVar[141]++;
+			if (_objectVar[141] == 2) {
+				_delbertspeech = 63;
+				_console->printTosText(907);
+//				if (_gGameSound == 0) { TODO
+//					waitxticks(240);
+//				}
+			} else if (_objectVar[141] == 4) {
+				_player->_herowaiting = false;
+			}
+			isAnimFinished_maybe = false;
+		}
+		if (_ct_voice_status == 0 && _objectVar[141] == 2) {
+			if (_delbertspeech < 65) {
+				_delbertspeech++;
+			}
+			if (_delbertspeech == 64) {
+				_console->printTosText(908);
+//				WaitForSpeech(); TODO
+			}
+			else if (*(char *)&_delbertspeech == 65) {
+				setupOtherNspAnimation(3, 20);
+				spriteAnimCountdownTimer[1] = 3;
+				_delbertspeech = 72;
+			}
+		}
 		// TODO more logic here
 	}
 	// TODO more logic here.
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index d080e8f71f5..bdc67405f0a 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -64,11 +64,13 @@ private:
 	Pic _frame;
 	Pic *_fullscreenPic = nullptr;
 	bool _timeAdvanceEventSelected = false;
+	uint8 _delbertspeech = 0;
 
 protected:
 	// Engine APIs
 	Common::Error run() override;
 public:
+	bool _ct_voice_status = false;
 	bool _isRightMouseClicked = false;
 	bool _isLeftMouseClicked = false;
 


Commit: 0430f35a0a932d61f00a1b576dbdf054f5f357ee
    https://github.com/scummvm/scummvm/commit/0430f35a0a932d61f00a1b576dbdf054f5f357ee
Author: Eric Fry (efry at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added speech. More work on delbert shop scene.

Changed paths:
  A engines/darkseed/sound.cpp
  A engines/darkseed/sound.h
    engines/darkseed/console.cpp
    engines/darkseed/console.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/module.mk


diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index 00b78886382..d296a75d902 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -24,7 +24,7 @@
 
 namespace Darkseed {
 
-Console::Console(TosText *tosText) : _tosText(tosText) {
+Console::Console(TosText *tosText, Sound *sound) : _tosText(tosText), _sound(sound) {
 	if(!_font.load()) {
 		error("Error loading tosfont.nsp");
 	}
@@ -36,6 +36,7 @@ void Console::printTosText(int tosIndex) {
 	debug(text.c_str());
 	addLine(" ");
 	addTextLine(text);
+	_sound->playTosSpeech(tosIndex);
 }
 
 void Console::addTextLine(const Common::String &text) {
diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
index dd44d8d9957..48f1afc1c0b 100644
--- a/engines/darkseed/console.h
+++ b/engines/darkseed/console.h
@@ -24,6 +24,7 @@
 #define DARKSEED_CONSOLE_H
 
 #include "gamefont.h"
+#include "darkseed/sound.h"
 #include "nsp.h"
 #include "tostext.h"
 
@@ -33,12 +34,13 @@ class Console  {
 private:
 	TosText *_tosText;
 	GameFont _font;
+	Sound *_sound;
 
 	Common::Array<Common::String> _text;
 	int _startIdx = 0;
 
 public:
-	Console(TosText *tostext);
+	Console(TosText *tostext, Sound *sound);
 
 	void printTosText(int tosIndex);
 	void addTextLine(const Common::String &text);
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 7e6d9c7b83f..f80784962cc 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -49,6 +49,7 @@ DarkseedEngine::DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc)
 
 DarkseedEngine::~DarkseedEngine() {
 	delete _screen;
+	delete _sound;
 }
 
 uint32 DarkseedEngine::getFeatures() const {
@@ -61,10 +62,11 @@ Common::String DarkseedEngine::getGameId() const {
 
 Common::Error DarkseedEngine::run() {
 	initGraphics(640, 350);
+	_sound = new Sound(_mixer);
 	_screen = new Graphics::Screen();
 	_tosText = new TosText();
 	_tosText->load();
-	_console = new Console(_tosText);
+	_console = new Console(_tosText, _sound);
 	_player = new Player();
 
 	Img left00Img;
@@ -150,6 +152,9 @@ Common::Error DarkseedEngine::syncGame(Common::Serializer &s) {
 	s.syncAsSint16LE(_player->_position.x);
 	s.syncAsSint16LE(_player->_position.y);
 
+	if (_sound->sync(s).getCode() != Common::kNoError) {
+		error("Failed to sync sound");
+	}
 	return Common::kNoError;
 }
 void DarkseedEngine::fadeOut() {
@@ -3209,9 +3214,11 @@ void DarkseedEngine::playSound(int16 unk, uint8 unk1, int16 unk2) {
 void DarkseedEngine::nextFrame(int nspAminIdx) {
 	isAnimFinished_maybe = false;
 	spriteAnimCountdownTimer[nspAminIdx]--;
+	_FrameAdvanced = false;
 	if (spriteAnimCountdownTimer[nspAminIdx] < 1) {
 		const Obt &anim = _player->_animations.getAnimAt(nspAminIdx);
 		animIndexTbl[nspAminIdx]++;
+		_FrameAdvanced = true;
 		if (animIndexTbl[nspAminIdx] == anim.numFrames) {
 			animIndexTbl[nspAminIdx] = 0;
 			isAnimFinished_maybe = true;
@@ -3239,7 +3246,7 @@ void DarkseedEngine::updateHeadache() {
 		if (headacheMessageIdx > 4) {
 			headacheMessageIdx = 0;
 		}
-		if (_objectVar[112] == 0) {
+		if (_objectVar[112] == 0 && !_sound->isPlayingSpeech()) {
 			_console->printTosText(headacheMessageIdx + 9);
 		}
 	}
@@ -3257,7 +3264,7 @@ void DarkseedEngine::gotonextmorning() {
 	_objectVar[112] = 0;
 	_objectVar[52] = 1;
 	_currentTimeInSeconds = 32400;
-//	ClearSpeech(4192,unaff_BP + 1); TODO
+	_sound->resetSpeech();
 	if (_currentDay == 2) {
 		_objectVar.setMoveObjectRoom(7, 253);
 	} else if (_currentDay == 3) {
@@ -3375,7 +3382,7 @@ void DarkseedEngine::runObjects() {
 			_player->changeDirection(_player->_direction, 3);
 		}
 		isAnimFinished_maybe = false;
-		if (!_ct_voice_status && (_objectVar[141] != 2 || _delbertspeech > 64)) {
+		if (!_sound->isPlayingSpeech() && (_objectVar[141] != 2 || _delbertspeech > 64)) {
 			nextFrame(_objectVar[141] - 1);
 		}
 		if (isAnimFinished_maybe) {
@@ -3391,13 +3398,13 @@ void DarkseedEngine::runObjects() {
 			}
 			isAnimFinished_maybe = false;
 		}
-		if (_ct_voice_status == 0 && _objectVar[141] == 2) {
+		if (!_sound->isPlayingSpeech() && _objectVar[141] == 2) {
 			if (_delbertspeech < 65) {
 				_delbertspeech++;
 			}
 			if (_delbertspeech == 64) {
 				_console->printTosText(908);
-//				WaitForSpeech(); TODO
+				_sound->waitForSpeech();
 			}
 			else if (*(char *)&_delbertspeech == 65) {
 				setupOtherNspAnimation(3, 20);
@@ -3405,7 +3412,26 @@ void DarkseedEngine::runObjects() {
 				_delbertspeech = 72;
 			}
 		}
-		// TODO more logic here
+		const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(_objectVar[141] - 1).frameNo[animIndexTbl[_objectVar[141] - 1]]);
+		Common::Point delbertPosition = _objectVar.getMoveObjectPosition(141);
+		if (_FrameAdvanced) {
+			if (_objectVar[141] == 1) {
+				delbertPosition.x += 15;
+				delbertPosition.y -= 1;
+			} else if (_objectVar[141] == 3) {
+				delbertPosition.x -= 15;
+				delbertPosition.y += 1;
+			}
+			_objectVar.setMoveObjectPosition(141, delbertPosition);
+		}
+		int spriteX = delbertPosition.x;
+		if (_objectVar[141] == 2) {
+			spriteX += 23;
+		}
+		int spriteY = delbertPosition.y - sprite.height;
+		if (_objectVar[141] < 4) {
+			g_engine->_sprites.addSpriteToDrawList(spriteX, spriteY, &sprite, 240 - delbertPosition.y, sprite.width, sprite.height, _objectVar[141] == 3 ? true : false);
+		}
 	}
 	// TODO more logic here.
 }
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index bdc67405f0a..85df34f538a 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -42,6 +42,7 @@
 #include "objects.h"
 #include "player.h"
 #include "room.h"
+#include "sound.h"
 #include "sprites.h"
 #include "tostext.h"
 
@@ -65,6 +66,7 @@ private:
 	Pic *_fullscreenPic = nullptr;
 	bool _timeAdvanceEventSelected = false;
 	uint8 _delbertspeech = 0;
+	bool _FrameAdvanced = false;
 
 protected:
 	// Engine APIs
@@ -74,6 +76,7 @@ public:
 	bool _isRightMouseClicked = false;
 	bool _isLeftMouseClicked = false;
 
+	Sound *_sound = nullptr;
 	Nsp _baseSprites;
 	Cursor _cursor;
 	Graphics::Screen *_screen = nullptr;
diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
index 26cdb7d3914..1ee5cf5bfba 100644
--- a/engines/darkseed/module.mk
+++ b/engines/darkseed/module.mk
@@ -18,7 +18,8 @@ MODULE_OBJS = \
 	player.o \
 	sprites.o \
 	objects.o \
-	inventory.o
+	inventory.o \
+	sound.o
 
 # This module can be built as a plugin
 ifeq ($(ENABLE_DARKSEED), DYNAMIC_PLUGIN)
diff --git a/engines/darkseed/sound.cpp b/engines/darkseed/sound.cpp
new file mode 100644
index 00000000000..81b8f07d001
--- /dev/null
+++ b/engines/darkseed/sound.cpp
@@ -0,0 +1,69 @@
+/* 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 "sound.h"
+#include "audio/audiostream.h"
+#include "audio/decoders/raw.h"
+#include "audio/decoders/voc.h"
+#include "darkseed.h"
+
+Darkseed::Sound::Sound(Audio::Mixer *mixer) : _mixer(mixer) {
+	_didSpeech.resize(978);
+	resetSpeech();
+}
+
+void Darkseed::Sound::playTosSpeech(int tosIdx) {
+	if (!g_engine->isCdVersion() || _didSpeech[tosIdx] == 1) {
+		return;
+	}
+	Common::String filename = Common::String::format("%d.voc", tosIdx + 1);
+	Common::Path path = Common::Path("speech").join(filename);
+	Common::File f;
+	if (!f.open(path)) {
+		return;
+	}
+	Common::SeekableReadStream *srcStream = f.readStream(f.size());
+	Audio::SeekableAudioStream *stream = Audio::makeVOCStream(srcStream,
+															  Audio::FLAG_UNSIGNED, DisposeAfterUse::YES);
+	_mixer->playStream(Audio::Mixer::kSpeechSoundType, &_speechHandle, stream);
+	_didSpeech[tosIdx] = 1;
+}
+
+bool Darkseed::Sound::isPlayingSpeech() {
+	return _mixer->isSoundHandleActive(_speechHandle);
+}
+
+void Darkseed::Sound::waitForSpeech() {
+	while(isPlayingSpeech()) {
+		// TODO poll events / wait a bit here.
+	}
+}
+
+void Darkseed::Sound::resetSpeech() {
+	for (int i = 0; i < _didSpeech.size(); i++) {
+		_didSpeech[i] = 0;
+	}
+}
+
+Common::Error Darkseed::Sound::sync(Common::Serializer &s) {
+	s.syncArray(_didSpeech.data(), _didSpeech.size(), Common::Serializer::Byte);
+	return Common::kNoError;
+}
diff --git a/engines/darkseed/sound.h b/engines/darkseed/sound.h
new file mode 100644
index 00000000000..64ed4442973
--- /dev/null
+++ b/engines/darkseed/sound.h
@@ -0,0 +1,50 @@
+/* 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 DARKSEED_SOUND_H
+#define DARKSEED_SOUND_H
+
+#include "audio/mixer.h"
+#include "common/array.h"
+#include "common/serializer.h"
+#include "common/error.h"
+
+namespace Darkseed {
+
+class Sound {
+private:
+	Audio::Mixer *_mixer;
+	Audio::SoundHandle _speechHandle;
+	Common::Array<uint8> _didSpeech;
+public:
+	explicit Sound(Audio::Mixer *mixer);
+
+	Common::Error sync(Common::Serializer &s);
+
+	void playTosSpeech(int tosIdx);
+	bool isPlayingSpeech();
+	void waitForSpeech();
+	void resetSpeech();
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_SOUND_H


Commit: 806f46025b7196b1e5b20e54382cd3eba9c29c71
    https://github.com/scummvm/scummvm/commit/806f46025b7196b1e5b20e54382cd3eba9c29c71
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added more logic to runObjects()

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index f80784962cc..e9d9096b4f7 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -243,7 +243,7 @@ void DarkseedEngine::gameloop() {
 			if (_currentDay == 1 && _currentTimeInSeconds == 64800 && _room->_roomNumber != 16) {
 				_objectVar.setMoveObjectRoom(7, 253); // remove scotch from shop.
 			}
-			if (_timeAdvanceEventSelected && _currentTimeInSeconds < 79200 && !isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed) { // TODO && !heroWaiting
+			if (_timeAdvanceEventSelected && _currentTimeInSeconds < 79200 && !isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting) {
 				_timeAdvanceEventSelected = false;
 				if (((_room->_roomNumber == 30) || ((0 < _objectVar[141] && (_objectVar[141] < 4)))) ||
 					(((_room->_roomNumber == 31 || (_room->_roomNumber == 32)) &&
@@ -3433,7 +3433,101 @@ void DarkseedEngine::runObjects() {
 			g_engine->_sprites.addSpriteToDrawList(spriteX, spriteY, &sprite, 240 - delbertPosition.y, sprite.width, sprite.height, _objectVar[141] == 3 ? true : false);
 		}
 	}
+	if (_room->_roomNumber == 32 && _currentDay == 2 && _currentTimeInSeconds > 64799 && (_objectVar[141] == 5 || _objectVar[141] == 6)) {
+		_room->advanceFrame(_objectVar[141] - 4);
+		if (_room->_ObjRestarted) {
+			_objectVar[141]++;
+			if (_objectVar[141] == 7) {
+				_player->_herowaiting = false;
+			}
+		}
+		// TODO more logic here.
+	}
+	if (_room->_roomNumber == 32 && _currentDay == 2 && _currentTimeInSeconds > 64799 && _objectVar[141] == 4) {
+		_objectVar.setMoveObjectX(141, 395);
+		const Sprite &sprite = _room->_locationSprites.getSpriteAt(0);
+		g_engine->_sprites.addSpriteToDrawList(395, 132, &sprite, 240 - (sprite.height + 132), sprite.width, sprite.height, false);
+		moveplayertodelbert();
+		if (!_player->_playerIsChangingDirection && !_player->_heroMoving) {
+			_console->printTosText(909);
+			_objectVar[141]++;
+			_player->_herowaiting = true;
+		}
+	}
+	if (_room->_roomNumber == 32 && _currentDay == 2 && _objectVar[141] == 12) {
+		Common::Point delbertPosition = _objectVar.getMoveObjectPosition(141);
+		if(_room->advanceFrame(2)) {
+			delbertPosition.x -= 8;
+			_objectVar.setMoveObjectX(141, delbertPosition.x);
+		}
+		const Sprite &sprite = _room->_locationSprites.getSpriteAt(_room->_locationSprites.getAnimAt(2).frameNo[_room->_locObjFrame[2]]);
+		g_engine->_sprites.addSpriteToDrawList(delbertPosition.x, 135, &sprite, 240 - (sprite.height + 135), sprite.width, sprite.height, true);
+		if (delbertPosition.x < 396) {
+			_room->_locObjFrameTimer[2] = _room->_locationSprites.getAnimAt(2).frameDuration[_room->_locObjFrame[2]];
+			_room->_locObjFrame[2] = 0;
+			_objectVar[141] = 4;
+		}
+		moveplayertodelbert();
+	}
+	if (_objectVar.getObjectRunningCode(72) == 1 &&
+		(_room->_roomNumber < 10 || _room->_roomNumber == 60 || _room->_roomNumber == 61)) {
+		_objectVar.setObjectRunningCode(72, 2);
+		_console->printTosText(933);
+	}
+	// jail sargent
+	if (_room->_roomNumber == 30 && (_objectVar.getObjectRunningCode(53) == 1 || _objectVar.getObjectRunningCode(53) == 2)
+			  && (otherNspAnimationType_maybe != 40 || !isPlayingAnimation_maybe)) {
+		if (_objectVar.getObjectRunningCode(53) == 1) {
+			int oldFrame = animIndexTbl[0];
+			nextFrame(0);
+			if (isAnimFinished_maybe) {
+				_objectVar.setObjectRunningCode(53, 2);
+				animIndexTbl[0] = oldFrame;
+			}
+		}
+		_room->removeObjectFromRoom(189);
+		const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]);
+		g_engine->_sprites.addSpriteToDrawList(463, 99, &sprite, 255, sprite.width, sprite.height, false);
+		_room->updateRoomObj(64,467,200,99,200);
+	}
+	if ((((!isPlayingAnimation_maybe || otherNspAnimationType_maybe != 39) && _room->_roomNumber == 10) &&
+		 _objectVar.getObjectRunningCode(72) != 0) &&
+		((_currentDay == 3 && _currentTimeInSeconds > 39600 && _objectVar[57] == 0) ||
+		  _objectVar[88] != 0)) {
+		if (_player->_position.x == 322 && _player->_position.y == 226) {
+			setupOtherNspAnimation(1, 39);
+		} else {
+			// TODO
+		}
+	}
+	if (_objectVar[79] == 0 && _room->_roomNumber == 53) { // evil fido
+		if (_player->_heroMoving && _player->_walkTarget.x > 279 && _player->_walkTarget.y < 220) {
+//			_player->_CurrentConnector = 255; TODO do we need this?
+			_player->_walkTarget = {323, 202};
+		}
+		if (_player->_position.x == 323 && _player->_position.y == 202) {
+			_objectVar[79] = 4;
+			playSound(20, 5, -1);
+		}
+	}
+	if (((_objectVar.getObjectRunningCode(58) != 0) && (_objectVar[21] == 0)) && (_room->_roomNumber == 55)) {
+		if (_player->_position.x == 369) {
+			rundrekethsequence();
+		}
+		if (_player->_heroMoving && _player->_walkTarget.x > 309) {
+			_player->_walkTarget = {369, 219};
+		}
+	}
 	// TODO more logic here.
 }
 
+void DarkseedEngine::moveplayertodelbert() {
+	//TODO
+}
+
+void DarkseedEngine::rundrekethsequence() {
+	// TODO
+	error("implement rundrekethsequence()");
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 85df34f538a..5b12bd8ba0e 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -66,12 +66,13 @@ private:
 	Pic *_fullscreenPic = nullptr;
 	bool _timeAdvanceEventSelected = false;
 	uint8 _delbertspeech = 0;
-	bool _FrameAdvanced = false;
+
 
 protected:
 	// Engine APIs
 	Common::Error run() override;
 public:
+	bool _FrameAdvanced = false;
 	bool _ct_voice_status = false;
 	bool _isRightMouseClicked = false;
 	bool _isLeftMouseClicked = false;
@@ -161,11 +162,11 @@ public:
 	};
 
 	bool canLoadGameStateCurrently(Common::U32String *msg) override {
-		return !isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed;
+		return !isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting;
 	}
 
 	bool canSaveGameStateCurrently(Common::U32String *msg) override {
-		return !isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed;
+		return !isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting;
 	}
 
 	/**
@@ -238,6 +239,8 @@ private:
 	void playDayChangeCutscene();
 	void closeShops();
 	void initDelbertAtSide();
+	void moveplayertodelbert();
+	void rundrekethsequence();
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 7fb9643c536..85390f4ddaf 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -1268,12 +1268,12 @@ void Darkseed::Room::advanceLocAnimFrame(int roomObjIdx) {
 }
 
 bool Darkseed::Room::advanceFrame(int animIdx) {
-	bool frameAdvanced = false;
+	g_engine->_FrameAdvanced = false;
 	const Obt &anim = _locationSprites.getAnimAt(animIdx);
 	_ObjRestarted = false;
 	_locObjFrameTimer[animIdx]--;
 	if (_locObjFrameTimer[animIdx] < 1) {
-		frameAdvanced = true;
+		g_engine->_FrameAdvanced = true;
 		_locObjFrame[animIdx]++;
 		if (_locObjFrame[animIdx] == anim.numFrames) {
 			_locObjFrame[animIdx] = 0;
@@ -1281,7 +1281,7 @@ bool Darkseed::Room::advanceFrame(int animIdx) {
 		}
 		_locObjFrameTimer[animIdx] = anim.frameDuration[_locObjFrame[animIdx]];
 	}
-	return frameAdvanced;
+	return g_engine->_FrameAdvanced;
 }
 
 void Darkseed::Room::runAnim47() {


Commit: 0b8d8c4e0c206b0013e206ee1eb937c7979e3572
    https://github.com/scummvm/scummvm/commit/0b8d8c4e0c206b0013e206ee1eb937c7979e3572
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added changeDay debug command

Changed paths:
    engines/darkseed/debugconsole.cpp
    engines/darkseed/debugconsole.h


diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
index 5fff4840fa2..921f65b52a6 100644
--- a/engines/darkseed/debugconsole.cpp
+++ b/engines/darkseed/debugconsole.cpp
@@ -34,6 +34,7 @@ DebugConsole::DebugConsole(TosText *tosText) : GUI::Debugger(), tosText(tosText)
 	registerCmd("gotoRoom",   WRAP_METHOD(DebugConsole, Cmd_gotoRoom));
 	registerCmd("invAdd",   WRAP_METHOD(DebugConsole, Cmd_invAdd));
 	registerCmd("invRemove",   WRAP_METHOD(DebugConsole, Cmd_invRemove));
+	registerCmd("changeDay",   WRAP_METHOD(DebugConsole, Cmd_changeDay));
 }
 
 DebugConsole::~DebugConsole() {
@@ -162,6 +163,23 @@ bool DebugConsole::Cmd_invRemove(int argc, const char **argv) {
 	return true;
 }
 
+bool DebugConsole::Cmd_changeDay(int argc, const char **argv) {
+	if (argc != 2) {
+		debugPrintf("Usage: changeDay <newDay>\n");
+		return true;
+	}
+
+	uint8 newDay = (uint8)atoi(argv[1]);
+	if (newDay < 1 || newDay > 3) {
+		debugPrintf("Error: Day must be in range of 1 .. 3\n");
+		return true;
+	}
+	g_engine->_currentDay = newDay;
+	debugPrintf("Current day changed.\n");
+	printDayAndTime();
+	return true;
+}
+
 void DebugConsole::printDayAndTime() {
 	int hour = g_engine->_currentTimeInSeconds / 60 / 60 + 1;
 	debugPrintf("Day %d at %d:%02d%s (%d seconds)\n",
diff --git a/engines/darkseed/debugconsole.h b/engines/darkseed/debugconsole.h
index faf3e5f00f0..e84b7ecd3f5 100644
--- a/engines/darkseed/debugconsole.h
+++ b/engines/darkseed/debugconsole.h
@@ -41,6 +41,7 @@ private:
 	bool Cmd_gotoRoom(int argc, const char **argv);
 	bool Cmd_invAdd(int argc, const char **argv);
 	bool Cmd_invRemove(int argc, const char **argv);
+	bool Cmd_changeDay(int argc, const char **argv);
 	bool validateObjVarIndex(int16 varIdx);
 	void printDayAndTime();
 public:


Commit: 62b63d0f83fcffa20fa2d521f0be2a411e7ed0b5
    https://github.com/scummvm/scummvm/commit/62b63d0f83fcffa20fa2d521f0be2a411e7ed0b5
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Delbert stick throwing logic.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/inventory.cpp
    engines/darkseed/nsp.cpp
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index e9d9096b4f7..d26893edf37 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -3356,20 +3356,146 @@ void DarkseedEngine::runObjects() {
 		playSound(10,5,-1);
 	}
 
+	int16 delbertSpriteIdx = 0;
 	if (_objectVar[141] == 8 && _room->_roomNumber == 31) {
-
+		// Fido brings back stick after player gives delbert the scotch.
+		_player->_herowaiting = true;
+		if (_objectVar[45] == 3) {
+			_room->loadLocationSprites("deldrink.nsp");
+			_objectVar[141] = 9;
+			_room->_locObjFrame[0] = 0;
+			_room->_locObjFrameTimer[0] = 2;
+			delbertSpriteIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
+		} else {
+			delbertSpriteIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
+			if (delbertSpriteIdx != 9) {
+				_room->advanceFrame(0);
+				delbertSpriteIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
+				delthrowstick(delbertSpriteIdx);
+			}
+			if (_objectVar[141] == 8) {
+				const Sprite &sprite = _room->_locationSprites.getSpriteAt(delbertSpriteIdx);
+				delthrowstick(delbertSpriteIdx);
+				g_engine->_sprites.addSpriteToDrawList(145, 140, &sprite, 240 - (sprite.height + 140), sprite.width, sprite.height, false);
+			}
+		}
 	}
 	if (_objectVar[141] == 9) {
-
+		// delbert drinks scotch
+		_room->advanceFrame(0);
+		delbertSpriteIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
+		if (_FrameAdvanced && delbertSpriteIdx == 5) {
+			playSound(32, 5, -1);
+		}
+		if (_room->_ObjRestarted) {
+			_objectVar[141] = 10;
+			_console->printTosText(910);
+			_inventory.removeItem(7);
+		}
+		Common::Point delbertPos = {125, 140};
+		_objectVar.setMoveObjectPosition(141, delbertPos);
+		if (_objectVar[141] == 9) {
+			const Sprite &sprite = _room->_locationSprites.getSpriteAt(delbertSpriteIdx);
+			g_engine->_sprites.addSpriteToDrawList(125, 140, &sprite, 240 - (sprite.height + 140), sprite.width, sprite.height, false);
+		}
 	}
 	if (_objectVar[141] == 10 && _room->_roomNumber == 31) {
-
+		// delbert walks off screen.
+		_room->advanceFrame(1);
+		delbertSpriteIdx = _room->_locationSprites.getAnimAt(1).frameNo[_room->_locObjFrame[1]];
+		Common::Point delbertPos = _objectVar.getMoveObjectPosition(141);
+		if (_FrameAdvanced) {
+			delbertPos.x += 10;
+			_objectVar.setMoveObjectPosition(141, delbertPos);
+		}
+		if (delbertPos.x < 560) {
+			const Sprite &sprite = _room->_locationSprites.getSpriteAt(delbertSpriteIdx);
+			g_engine->_sprites.addSpriteToDrawList(delbertPos.x, 140, &sprite, 240 - (sprite.height + 140), sprite.width, sprite.height, false);
+			_room->updateRoomObj(141,delbertPos.x,sprite.width,140,sprite.height);
+		} else {
+			_objectVar[141] = 11;
+			_room->removeObjectFromRoom(141);
+			_player->_herowaiting = false;
+		}
 	}
 	if (_objectVar[141] == 7 && _room->_roomNumber == 31) {
-
+		_room->advanceFrame(0);
+		delbertSpriteIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
+		const Sprite &sprite = _room->_locationSprites.getSpriteAt(delbertSpriteIdx);
+		delthrowstick(delbertSpriteIdx);
+		g_engine->_sprites.addSpriteToDrawList(145, 140, &sprite, 240 - (sprite.height + 140), sprite.width, sprite.height, false);
+		_room->updateRoomObj(141,145,sprite.width,140,sprite.height);
 	}
 	if ((_objectVar[141] == 7 || _objectVar[141] == 8) && _room->_roomNumber == 31) {
-
+		if (delbertSpriteIdx > 7 && _objectVar[45] == 0) {
+			Common::Point stickPosition = _objectVar.getMoveObjectPosition(19);
+			if (stickPosition.y < 205 && _yvec != 100) {
+				stickPosition.x += 12;
+				stickPosition.y += _yvec;
+				_objectVar.setMoveObjectPosition(19, stickPosition);
+				_yvec++;
+			}
+			if (stickPosition.y > 205) {
+				stickPosition = {495, 205};
+				_objectVar.setMoveObjectPosition(19, stickPosition);
+				_yvec = 100;
+			}
+		}
+		if (_objectVar[45] < 3 && _room->_roomNumber == 31 && _objectVar[141] > 6) {
+			_objectVar.setMoveObjectRoom(19, 100);
+			_room->advanceFrame(_objectVar[45] + 1);
+			Common::Point stickPosition = _objectVar.getMoveObjectPosition(19);
+			if (_room->_ObjRestarted && _objectVar[45] < 2) {
+				_objectVar[45] = (_objectVar[45] == 0) ? 1 : 0;
+				if (_objectVar[45] == 0) {
+					stickPosition = {230, 205};
+				} else {
+					stickPosition.x = 1000;
+				}
+				_objectVar.setMoveObjectPosition(19, stickPosition);
+			}
+			if (stickPosition.x < 1000) {
+				const Sprite &stickSprite = _baseSprites.getSpriteAt(19);
+				g_engine->_sprites.addSpriteToDrawList(stickPosition.x, stickPosition.y, &stickSprite, 255, stickSprite.width, stickSprite.height, false);
+			}
+			Common::Point fidoPosition = _objectVar.getMoveObjectPosition(45);
+			int16 fidoSpriteIdx = _room->_locationSprites.getAnimAt(_objectVar[45] + 1).frameNo[_room->_locObjFrame[_objectVar[45] + 1]];
+			if (_FrameAdvanced) {
+				if (_objectVar[45] == 2) {
+					fidoPosition.x += 30;
+					_objectVar.setMoveObjectPosition(45, fidoPosition);
+					if (fidoPosition.x > 564) {
+						_objectVar.setMoveObjectRoom(19, 31);
+						_objectVar[45]++;
+					}
+				} else if (_objectVar[45] == 0) {
+					if (fidoSpriteIdx > 11 && fidoSpriteIdx < 18) {
+						fidoPosition.x += 30;
+						_objectVar.setMoveObjectPosition(45, fidoPosition);
+					}
+				} else if (fidoSpriteIdx > 19 && fidoSpriteIdx < 26) {
+					fidoPosition.x -= 30;
+					_objectVar.setMoveObjectPosition(45, fidoPosition);
+				}
+			}
+			if (_objectVar[45] < 3) {
+				bool flipFidoSprite = false;
+				if ((_objectVar[45] == 0) && (_room->_locObjFrame[1] < 6)) {
+					flipFidoSprite = true;
+				}
+				if ((_objectVar[45]== 1) && (7 < _room->_locObjFrame[2])) {
+					flipFidoSprite = true;
+				}
+				if (((_objectVar[45] == 1) && (_room->_locObjFrame[2] == 9)) && (_objectVar[141] ==  8)
+				) {
+					stickPosition = {230, 205};
+					_objectVar.setMoveObjectPosition(19, stickPosition);
+					_objectVar[45] = 2;
+				}
+				const Sprite &fidoSprite = _room->_locationSprites.getSpriteAt(fidoSpriteIdx);
+				g_engine->_sprites.addSpriteToDrawList(fidoPosition.x, 173, &fidoSprite, 240 - (fidoSprite.height + 173), fidoSprite.width, fidoSprite.height, flipFidoSprite);
+			}
+		}
 	}
 	if (_objectVar[141] > 0 && _objectVar[141] < 4) {
 		_player->_herowaiting = true;
@@ -3434,6 +3560,7 @@ void DarkseedEngine::runObjects() {
 		}
 	}
 	if (_room->_roomNumber == 32 && _currentDay == 2 && _currentTimeInSeconds > 64799 && (_objectVar[141] == 5 || _objectVar[141] == 6)) {
+		// walk delbert off into garden.
 		_room->advanceFrame(_objectVar[141] - 4);
 		if (_room->_ObjRestarted) {
 			_objectVar[141]++;
@@ -3441,7 +3568,15 @@ void DarkseedEngine::runObjects() {
 				_player->_herowaiting = false;
 			}
 		}
-		// TODO more logic here.
+		Common::Point delbertPosition = _objectVar.getMoveObjectPosition(141);
+		const Sprite &sprite = _room->_locationSprites.getSpriteAt(_room->_locationSprites.getAnimAt(_objectVar[141] - 4).frameNo[_room->_locObjFrame[_objectVar[141] - 4]]);
+		if (_FrameAdvanced && _objectVar[141] > 5) {
+			delbertPosition.x += 8;
+			_objectVar.setMoveObjectX(141, delbertPosition.x);
+		}
+		if (_objectVar[141] != 7) {
+			g_engine->_sprites.addSpriteToDrawList(delbertPosition.x, 135, &sprite, 240 - (sprite.height + 132), sprite.width, sprite.height, false);
+		}
 	}
 	if (_room->_roomNumber == 32 && _currentDay == 2 && _currentTimeInSeconds > 64799 && _objectVar[141] == 4) {
 		_objectVar.setMoveObjectX(141, 395);
@@ -3522,7 +3657,22 @@ void DarkseedEngine::runObjects() {
 }
 
 void DarkseedEngine::moveplayertodelbert() {
-	//TODO
+	if (_room->_roomNumber == 32 && !isPlayingAnimation_maybe) {
+		_player->_herowaiting = true;
+		if (!_player->_heroMoving && _player->_position.x != 364 && _player->_position.y != 198) {
+			Common::Point oldCursor = g_engine->_cursor.getPosition();
+			Common::Point newTarget = {364,198};
+			g_engine->_cursor.setPosition(newTarget);
+			_player->calculateWalkTarget();
+			g_engine->_cursor.setPosition(oldCursor);
+			_player->playerFaceWalkTarget();
+		}
+		if (_player->_position.x == 364 && _player->_position.y == 198 && !_player->_playerIsChangingDirection && _player->_direction != 1) {
+			_player->changeDirection(_player->_direction, 1);
+			_player->_walkTarget = _player->_position;
+			_player->_heroMoving = false;
+		}
+	}
 }
 
 void DarkseedEngine::rundrekethsequence() {
@@ -3530,4 +3680,16 @@ void DarkseedEngine::rundrekethsequence() {
 	error("implement rundrekethsequence()");
 }
 
+void DarkseedEngine::delthrowstick(int16 spriteNum) {
+	if (_FrameAdvanced && spriteNum == 8) {
+		Common::Point stickPos = {265, 150};
+		_objectVar.setMoveObjectPosition(19, stickPos);
+		_yvec = -6;
+		playSound(3, 1, -1);
+	}
+	if (_room->_locObjFrame[0] == 2) {
+		_objectVar.setMoveObjectX(19, 1000);
+	}
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 5b12bd8ba0e..cecab462fb3 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -66,7 +66,7 @@ private:
 	Pic *_fullscreenPic = nullptr;
 	bool _timeAdvanceEventSelected = false;
 	uint8 _delbertspeech = 0;
-
+	int16 _yvec = 0; //delbert throw stick related.
 
 protected:
 	// Engine APIs
@@ -241,6 +241,7 @@ private:
 	void initDelbertAtSide();
 	void moveplayertodelbert();
 	void rundrekethsequence();
+	void delthrowstick(int16 spriteNum);
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 06640f8356a..21f92214620 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -52,6 +52,7 @@ void Darkseed::Inventory::removeItem(uint8 item) {
 				_inventory[j] = _inventory[j+1];
 			}
 			_inventoryLength--;
+			update();
 			break;
 		}
 	}
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index d5fb0cc120f..e33108e3da6 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -53,7 +53,11 @@ bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
 }
 
 void Darkseed::Sprite::draw(int x, int y) const {
-	g_engine->_screen->copyRectToSurfaceWithKey(pixels.data(), pitch, x, y, width, height, 0xf);
+	uint16 clippedWidth = width;
+	if (x + width > g_engine->_screen->w) {
+		clippedWidth = g_engine->_screen->w - x;
+	}
+	g_engine->_screen->copyRectToSurfaceWithKey(pixels.data(), pitch, x, y, clippedWidth, height, 0xf);
 }
 
 void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destHeight, bool flipX) const {
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 85390f4ddaf..1d48b7b606f 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -1331,3 +1331,7 @@ void Darkseed::Room::darkenSky() {
 		workPal.installPalette();
 	}
 }
+
+void Darkseed::Room::loadLocationSprites(const Common::Path &path) {
+	_locationSprites.load(path);
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index 8788ff8a2f0..e4597735011 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -104,6 +104,7 @@ public:
 	void loadRoom61AWalkableLocations();
 	void restorePalette();
 	void darkenSky();
+	void loadLocationSprites(const Common::Path &path);
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);


Commit: 82944a78bdfb7fe4c422805016f6549df584e635
    https://github.com/scummvm/scummvm/commit/82944a78bdfb7fe4c422805016f6549df584e635
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Cop outside house logic

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index d26893edf37..8b892a6f3c3 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -975,6 +975,43 @@ void DarkseedEngine::handlePointerAction() {
 	}
 }
 
+void DarkseedEngine::loadRoom(int roomNumber) {
+//	*(undefined *)&_erasemenu = 1;
+//	*(undefined2 *)&_gShipOff = 0;
+	_sound->waitForSpeech();
+	if (roomNumber == 33 && _objectVar[62] == 101) {
+		_objectVar[62] = 0;
+	}
+	_printedcomeheredawson = false;
+	_objectVar.setObjectRunningCode(53, 0);
+	_objectVar[56] = 0;
+	_objectVar.setObjectRunningCode(72, 0);
+	for (int i = 31; i < 34; i++) {
+		if (_objectVar.getMoveObjectRoom(i) == 99) {
+			_objectVar.setMoveObjectRoom(i, 10);
+		}
+	}
+	if (_objectVar[28] == 1) {
+		_objectVar[28] = 2;
+	}
+	if (_objectVar[29] == 1) {
+		_objectVar[29] = 2;
+	}
+	if (_objectVar[141] == 10) {
+		_objectVar[141] = 11;
+	}
+
+	delete _room;
+	_room = new Room(roomNumber); // getroomstuff
+
+	if (roomNumber == 46 && _previousRoomNumber == 60 && _objectVar[57] == 1) {
+		return;
+	}
+	if (roomNumber == 15 && _objectVar.getMoveObjectRoom(28) != 255) {
+		setupOtherNspAnimation(1, 39);
+	}
+}
+
 void DarkseedEngine::changeToRoom(int newRoomNumber) {
 	_objectVar[99] = 0;
 	_objectVar[66] = 0;
@@ -985,8 +1022,7 @@ void DarkseedEngine::changeToRoom(int newRoomNumber) {
 		_objectVar[53] = 0;
 	}
 
-	delete _room;
-	_room = new Room(newRoomNumber);
+	loadRoom(newRoomNumber);
 
 	_room->darkenSky();
 	if (_room->_roomNumber == 54) {
@@ -1094,13 +1130,12 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 	_sprites.clearSpriteDrawList();
 	_room->runRoomObjects();
 	runObjects();
-//	FUN_2022_413a();
 	if (isPlayingAnimation_maybe == 0 ||
 		(otherNspAnimationType_maybe != 6 && otherNspAnimationType_maybe != 7) || currentRoomNumber != 5) {
-		_frameBottom = 0xf0;
+		_frameBottom = 240;
 	}
 	else {
-		_frameBottom = 0xd0;
+		_frameBottom = 208;
 	}
 
 	if (currentRoomNumber != 0x22 && currentRoomNumber != 0x13 &&
@@ -3632,7 +3667,34 @@ void DarkseedEngine::runObjects() {
 		if (_player->_position.x == 322 && _player->_position.y == 226) {
 			setupOtherNspAnimation(1, 39);
 		} else {
-			// TODO
+			const Sprite &sprite = _room->_locationSprites.getSpriteAt(4);
+			_room->calculateScaledSpriteDimensions(sprite.width, sprite.height, 224);
+			g_engine->_sprites.addSpriteToDrawList(348 - scaledSpriteWidth, 224 - scaledSpriteHeight, &sprite, 224, scaledSpriteWidth, scaledSpriteHeight, false);
+			if (_player->_heroMoving && _player->_playerIsChangingDirection == 0 && _player->_direction != 1 &&
+				(_player->_position.x < 368 || _player->_position.y < 200) &&
+				   (!isPlayingAnimation_maybe || otherNspAnimationType_maybe == 53) && _player->_walkTarget.x != 322 &&
+				  _player->_walkTarget.y != 226) {
+				_player->_heroMoving = false;
+			}
+			if (_player->_position.x < 369 && !_player->_heroMoving &&
+				 (!isPlayingAnimation_maybe || otherNspAnimationType_maybe == 53) &&
+				(_player->_position.x != 322 || _player->_position.y != 226)) {
+				if (isPlayingAnimation_maybe && otherNspAnimationType_maybe == 53) {
+					isPlayingAnimation_maybe = false;
+				}
+				if (!_player->_heroMoving) {
+					Common::Point oldCursor = g_engine->_cursor.getPosition();
+					Common::Point newTarget = {322,226};
+					g_engine->_cursor.setPosition(newTarget);
+					_player->calculateWalkTarget();
+					g_engine->_cursor.setPosition(oldCursor);
+					_player->playerFaceWalkTarget();
+					if (!_printedcomeheredawson) {
+						_console->printTosText(934);
+						_printedcomeheredawson = true;
+					}
+				}
+			}
 		}
 	}
 	if (_objectVar[79] == 0 && _room->_roomNumber == 53) { // evil fido
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index cecab462fb3..652046093f5 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -132,6 +132,7 @@ public:
 	int _phoneStatus = 0;
 
 	int16 _SoundTimer = 0;
+	bool _printedcomeheredawson = false;
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	~DarkseedEngine() override;
@@ -217,6 +218,7 @@ private:
 	void handleInput();
 	void wait();
 	void handlePointerAction();
+	void loadRoom(int roomNumber);
 	void changeToRoom(int newRoomNumber);
 
 	void useCode(int objNum);


Commit: b67718dcc0a4141f705bec67ebd594e65d406fd0
    https://github.com/scummvm/scummvm/commit/b67718dcc0a4141f705bec67ebd594e65d406fd0
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added phone ring logic

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/objects.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 8b892a6f3c3..088b2015ed0 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -976,7 +976,7 @@ void DarkseedEngine::handlePointerAction() {
 }
 
 void DarkseedEngine::loadRoom(int roomNumber) {
-//	*(undefined *)&_erasemenu = 1;
+//	*(undefined *)&_erasemenu = 1; TODO do we need these?
 //	*(undefined2 *)&_gShipOff = 0;
 	_sound->waitForSpeech();
 	if (roomNumber == 33 && _objectVar[62] == 101) {
@@ -1609,8 +1609,7 @@ void DarkseedEngine::updateAnimation() {
 					_objectVar[47] = 1;
 					_console->printTosText(922);
 				}
-				// TODO
-//				WaitForSpeech();
+				_sound->waitForSpeech();
 				setupOtherNspAnimation(1, 9);
 			}
 		}
@@ -3715,6 +3714,31 @@ void DarkseedEngine::runObjects() {
 			_player->_walkTarget = {369, 219};
 		}
 	}
+	if (_objectVar._objectRunningCode[47] != 0 && (_currentDay == 1 || _currentDay == 3)) {
+		_objectVar._objectRunningCode[47] += 2;
+		switch (_objectVar._objectRunningCode[47]) {
+		case 120:
+		case 300:
+		case 480:
+		case 660:
+		case 900:
+			if (_room->_roomNumber < 10 || _room->_roomNumber == 61 || _room->_roomNumber == 62) {
+				if (_room->_roomNumber == 0) {
+					playSound(24, 5, -1);
+				} else {
+					playSound(25, 5, -1);
+				}
+				_console->addTextLine("The phone is ringing.");
+			}
+			break;
+		case 1080:
+			_objectVar._objectRunningCode[47] = 0;
+			_objectVar[47] = 1;
+			break;
+		default:
+			break;
+		}
+	}
 	// TODO more logic here.
 }
 
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index a58722c7aa0..1e785715770 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -35,10 +35,12 @@ enum ObjType {
 class Objects {
 private:
 	Common::Array<int16> _objectVar;
-	Common::Array<int16> _objectRunningCode;
 	Common::Array<Common::Point> _moveObjectXY;
 	Common::Array<uint8> _moveObjectRoom;
 
+public:
+	Common::Array<int16> _objectRunningCode;
+
 public:
 	static constexpr int MAX_MOVED_OBJECTS = 42;
 	static constexpr int MAX_OBJECTS = 199;


Commit: 7b4816b7c0f13442dba49e8f0b2e4a7aa40037ab
    https://github.com/scummvm/scummvm/commit/7b4816b7c0f13442dba49e8f0b2e4a7aa40037ab
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Package delivery logic.

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 088b2015ed0..f9a6fe19a84 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -216,7 +216,7 @@ void DarkseedEngine::gameloop() {
 			if (_currentTimeInSeconds > 35999 && _currentTimeInSeconds < 36005 &&
 				((_currentDay == 1 || (_currentDay == 2 && _objectVar[6] != 0)) ||
 				  (_currentDay == 3 && _objectVar[29] != 0))) {
-				_objectVar.setObjectRunningCode(140, 1);
+				_objectVar.setObjectRunningCode(140, 1); // package delivered.
 			}
 			if (_room->_roomNumber == 52 && _objectVar[79] == 0) {
 				_objectVar.setObjectRunningCode(79, 1);
@@ -3714,6 +3714,7 @@ void DarkseedEngine::runObjects() {
 			_player->_walkTarget = {369, 219};
 		}
 	}
+	// phone ringing logic
 	if (_objectVar._objectRunningCode[47] != 0 && (_currentDay == 1 || _currentDay == 3)) {
 		_objectVar._objectRunningCode[47] += 2;
 		switch (_objectVar._objectRunningCode[47]) {
@@ -3739,7 +3740,36 @@ void DarkseedEngine::runObjects() {
 			break;
 		}
 	}
-	// TODO more logic here.
+	// handle package logic.
+	if (_objectVar._objectRunningCode[140] != 0) {
+		switch(_currentTimeInSeconds - 36000) {
+		case 120:
+		case 121:
+		case 420:
+		case 421:
+		case 720:
+		case 721:
+			if (((_room->_roomNumber < 10) || (_room->_roomNumber == 61)) || (_room->_roomNumber == 62)) {
+				if (_room->_roomNumber == 6) {
+//					FUN_1208_0dac_sound_related(93,5); TODO floppy sound
+					playSound(27, 5, -1);
+				}
+				else {
+					playSound(29, 5, -1);
+//					FUN_1208_0dac_sound_related(95,5); TODO floppy sound
+				}
+				_console->addTextLine("The doorbell is ringing.");
+			}
+			break;
+		case 900:
+		case 901:
+			leavepackage();
+			break;
+		}
+		if (_currentTimeInSeconds - 36000 > 901 && _objectVar._objectRunningCode[140] != 0) {
+			leavepackage();
+		}
+	}
 }
 
 void DarkseedEngine::moveplayertodelbert() {
@@ -3778,4 +3808,18 @@ void DarkseedEngine::delthrowstick(int16 spriteNum) {
 	}
 }
 
+void DarkseedEngine::leavepackage() {
+	int packageObjNum = _currentDay + 30;
+	int16 xPos = _currentDay * 10 + 299;
+	Common::Point packagePos = {xPos, 191};
+	_objectVar.setMoveObjectPosition(packageObjNum, packagePos);
+	if (_room->_roomNumber == 10) {
+		_objectVar.setMoveObjectRoom(packageObjNum, 99);
+	} else {
+		_objectVar.setMoveObjectRoom(packageObjNum, 10);
+	}
+//	_MoveObjectDepth[packageObjNum] = 0; TODO do we need this? It doesn't appear to be used.
+	_objectVar._objectRunningCode[140] = 0;
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 652046093f5..3593d15e870 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -244,6 +244,7 @@ private:
 	void moveplayertodelbert();
 	void rundrekethsequence();
 	void delthrowstick(int16 spriteNum);
+	void leavepackage();
 };
 
 extern DarkseedEngine *g_engine;


Commit: 9ece6e77b1bd1a1bce77908d1aa62e320794c625
    https://github.com/scummvm/scummvm/commit/9ece6e77b1bd1a1bce77908d1aa62e320794c625
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Move usecode logic into UseCode class.

Changed paths:
  A engines/darkseed/usecode.cpp
  A engines/darkseed/usecode.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/module.mk


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index f9a6fe19a84..d01018aff4c 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -68,6 +68,7 @@ Common::Error DarkseedEngine::run() {
 	_tosText->load();
 	_console = new Console(_tosText, _sound);
 	_player = new Player();
+	_useCode = new UseCode(_console, _player, _objectVar, _inventory);
 
 	Img left00Img;
 	left00Img.load("art/left00.img");
@@ -1162,7 +1163,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 				}
 			} else {
 				if (otherNspAnimationType_maybe == 37) {
-					error("anim: 37");
+					error("anim: 37"); // TODO
 //					uVar1 = (uint)BYTE_ARRAY_2c85_41e7[1];
 //					uVar7 = *(undefined2 *)((int)CPlayerSpriteWidthTbl + uVar1 * 2);
 //					uVar4 = *(undefined2 *)((int)CPlayerSpriteHeightTbl + uVar1 * 2);
@@ -1173,8 +1174,9 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 //									*(undefined2 *)((int)&CPlayerSpritePtrTbl[0].Offset + uVar1 * 4),240 - playerSpriteY_maybe ,
 //									_curPlayerSpriteWidth,_curPlayerSpriteHeight_maybe,_player_sprite_related_2c85_82f3);
 				}
-				if (otherNspAnimationType_maybe == 0x27 || otherNspAnimationType_maybe == 0x3b ||
-					 otherNspAnimationType_maybe == 0x3c || otherNspAnimationType_maybe == 0x3d) {
+				if (otherNspAnimationType_maybe == 39 || otherNspAnimationType_maybe == 59 ||
+					 otherNspAnimationType_maybe == 60 || otherNspAnimationType_maybe == 61) {
+					error("anim: 39 || 59..61"); // TODO
 //					uVar1 = (uint)BYTE_ARRAY_2c85_41e7[1];
 //					uVar7 = *(undefined2 *)((int)CPlayerSpriteWidthTbl + uVar1 * 2);
 //					uVar4 = *(undefined2 *)((int)CPlayerSpriteHeightTbl + uVar1 * 2);
@@ -2029,18 +2031,18 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 		} else {
 			switch (_actionMode) {
 			case HandAction:
-				useCode(targetObjNum);
+				_useCode->useCode(targetObjNum);
 				break;
 			case LookAction:
 				lookCode(targetObjNum);
 				break;
 			case 5:
-				useCrowBar(targetObjNum);
+				_useCode->useCrowBar(targetObjNum);
 				break;
 			case 6:
 			case 12:
 			case 29:
-				useCodeJournal(_actionMode, targetObjNum);
+				_useCode->useCodeJournal(_actionMode, targetObjNum);
 				break;
 			case 7:
 			case 36:
@@ -2048,14 +2050,14 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			case 38:
 			case 39:
 			case 40:
-				useCodeShopItems(_actionMode, targetObjNum);
+				_useCode->useCodeShopItems(_actionMode, targetObjNum);
 				break;
 			case 8:
-				useCodeMoney(targetObjNum);
+				_useCode->useCodeMoney(targetObjNum);
 				break;
 				// TODO lots of extra switch cases here for inventory usages.
 			case 14:
-				useCodeGloves(targetObjNum);
+				_useCode->useCodeGloves(targetObjNum);
 				break;
 			// TODO lots of extra switch cases here for inventory usages.
 			default:
@@ -2068,874 +2070,7 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 	}
 }
 
-void DarkseedEngine::useCode(int objNum) {
-	debug("useCode: objNum = %d", objNum);
 
-	if (objNum == 141) {
-		_console->addTextLine("You touch Delbert...");
-		return;
-	}
-	if (objNum == 189) {
-		_console->addTextLine("You touch the cold iron bars.");
-		return;
-	}
-	if (objNum == 42) {
-		switch(_objectVar[42]) {
-		case 0:
-			_console->printTosText(653);
-			break;
-		case 1:
-			_console->printTosText(655);
-			_objectVar[42] = 0;
-			break;
-		case 2:
-			_console->printTosText(660);
-			_inventory.addItem(6);
-			_objectVar[42] = 3;
-			break;
-		case 3:
-			_console->printTosText(655);
-			_objectVar[42] = 4;
-			break;
-		case 4:
-			_console->printTosText(653);
-		}
-		return;
-	}
-	if (objNum == 9) {
-		_room->_collisionType = 0;
-		_room->removeObjectFromRoom(9);
-		_objectVar.setMoveObjectRoom(9, 100);
-		showFullscreenPic(g_engine->isCdVersion() ? "paper_c.pic" : "paper-c.pic");
-		return;
-	}
-	if (objNum == 35) {
-		_objectVar[35] = 3600;
-	}
-	if (objNum == 47) {
-		_player->loadAnimations("phone.nsp");
-		if (_objectVar.getObjectRunningCode(47) == 0) {
-			setupOtherNspAnimation(2,63);
-		}
-		else {
-			setupOtherNspAnimation(0,8);
-		}
-		_player->_direction = 3;
-	}
-	if (objNum == 194) {
-		if (_objectVar[53] == 2) {
-			_console->printTosText(948);
-			for (int i = 0; i < Objects::MAX_MOVED_OBJECTS; i++) {
-				if (_objectVar.getMoveObjectRoom(i) == 252) {
-					_objectVar.setMoveObjectRoom(i, 254);
-					_inventory.addItem(i);
-				}
-			}
-			_objectVar[53] = 3;
-		} else {
-			_console->printTosText(566);
-		}
-		return;
-	}
-	if (objNum == 113) {
-		bool foundMatch = false;
-		for (int i = 0; i < Objects::MAX_MOVED_OBJECTS; i++) {
-			if (_objectVar.getMoveObjectRoom(i) == 250) {
-				_objectVar.setMoveObjectRoom(i, 254);
-				_inventory.addItem(i);
-				foundMatch = true;
-			}
-		}
-		if (foundMatch) {
-			_objectVar[113] = 0;
-			_console->printTosText(948);
-		} else {
-			_console->printTosText(751);
-		}
-	}
-	if (objNum == 123) {
-		if (_currentTimeInSeconds < 61200) {
-			_console->printTosText(119);
-		} else {
-			_player->loadAnimations("bedsleep.nsp");
-			setupOtherNspAnimation(1, 5);
-		}
-		return;
-	}
-	if (objNum == 71 && _objectVar[71] == 2) { // car ignition
-		_objectVar[71] = 0;
-		_console->printTosText(949);
-		_inventory.addItem(26);
-		return;
-	}
-	if ((162 < objNum) && (objNum < 169)) {
-		playSound(47,5,-1);
-	}
-	if (objNum == 175) {
-		playSound(39,5,-1);
-//		while (iVar2 = VOCPlaying(), iVar2 != 0) {
-//			VOCPoll();
-//		}
-		_console->printTosText(719);
-		return;
-	}
-	if (objNum == 187) {
-		if (_objectVar[187] == 0) {
-			_console->printTosText(856);
-			setupOtherNspAnimation(0, 60);
-		} else {
-			setupOtherNspAnimation(1, 61);
-		}
-		return;
-	}
-	if (objNum == 137 || objNum == 30) {
-		if (_objectVar[30] == 0) {
-			_objectVar[30] = 1;
-			_room->_collisionType = 0;
-			_room->removeObjectFromRoom(30);
-			_objectVar.setMoveObjectRoom(30, 100);
-			showFullscreenPic(g_engine->isCdVersion() ? "note_c.pic" : "note-c.pic");
-		} else {
-			_console->printTosText(296);
-		}
-		return;
-	}
-	if (_room->_roomNumber == 21 && objNum == 12) {
-		if (_objectVar[12] == 0 && _objectVar[10] == 1) {
-			_objectVar[12] = 1;
-			_inventory.addItem(12);
-			_console->printTosText(568);
-		} else {
-			_console->printTosText(566);
-		}
-		return;
-	}
-	if (objNum == 46) {
-		if (_objectVar[46] == 1) {
-			setupOtherNspAnimation(0,19);
-		} else {
-			_console->printTosText(539);
-		}
-		return;
-	}
-	if (objNum != 7 && objNum != 36 && objNum != 37 && objNum != 38 && objNum != 39 && objNum != 40) {
-		int handTosIdx = _objectVar.getHandDescriptionTosIdx(objNum);
-		if (handTosIdx != 0 && handTosIdx < 979) {
-			_console->printTosText(handTosIdx);
-		} else if (handTosIdx > 978) {
-			// TODO genericresponse
-		}
-		if (objNum == 80) {
-			_console->printTosText(553 + (_objectVar[80] & 1));
-			_objectVar[80] = (_objectVar[80] & 2) + ((_objectVar[80] & 1) == 0 ? 1 : 0);
-			return;
-		}
-		if ((objNum == 59 || objNum == 78) && _objectVar[34] == 0) {
-			return;
-		}
-		if (objNum == 100) {
-			if (_objectVar[100] == 0 || _objectVar[100] == 1 || _objectVar[100] == 3) {
-				_console->printTosText(140);
-			} else if (_objectVar[100] == 2) {
-				_objectVar[100] = 3;
-				_inventory.addItem(10);
-				_objectVar[10] = 254;
-				_console->printTosText(142);
-			}
-			return;
-		}
-		if (objNum == 114) {
-			gancanim();
-			return;
-		}
-		if ((objNum == 28) && (_objectVar[28] == 2)) {
-			_console->addTextLine("The sergeant says 'Nice gun eh? It's a Browning'");
-			return;
-		}
-		if (objNum > 103 && objNum < 111) {
-			if (objNum < 110) {
-				_player->loadAnimations("opendrwr.nsp");
-				if (objNum == 108) {
-					if (_objectVar[108] == 0) {
-						_console->printTosText(383);
-					}
-					else {
-						_console->printTosText(385);
-					}
-					setupOtherNspAnimation(0, 52);
-				}
-				else {
-					if (_objectVar[objNum] == 0) {
-						_console->printTosText(371);
-					}
-					else {
-						_console->printTosText(373);
-					}
-					setupOtherNspAnimation(0,objNum - 56);
-				}
-			}
-			else {
-				if (_objectVar[objNum] == 0) {
-					_console->printTosText(389);
-				}
-				else {
-					_console->printTosText(391);
-				}
-				_objectVar[objNum] = _objectVar[objNum] == 0 ? 1 : 0;
-			}
-			return;
-		}
-		if (objNum == 111) { // tap
-			_player->loadAnimations("aspirin.nsp");
-			setupOtherNspAnimation(0,30);
-			_console->printTosText(242);
-			return;
-		}
-		if (objNum == 112) { // mirror cabinet
-			_player->loadAnimations("aspirin.nsp");
-			setupOtherNspAnimation(2,32);
-			return;
-		}
-		if (objNum > 30 && objNum < 34) {
-			_room->removeObjectFromRoom(objNum);
-			getPackageObj(objNum - 30);
-			return;
-		}
-		if ((objNum == 14) && (_objectVar[86] == 0)) {
-			_objectVar[86] = 1;
-			return;
-		}
-		if ((objNum == 102) && (_objectVar[23] == 1)) {
-			_player->loadAnimations("slide.nsp");
-			setupOtherNspAnimation(1, 26);
-			return;
-		}
-		if (objNum == 101) {
-			switch(_objectVar[101]) {
-			case 0:
-				_player->loadAnimations("opendoor.nsp");
-				setupOtherNspAnimation(0,65);
-				playSound(31,5,-1);
-				_objectVar[101] = 1;
-				_console->printTosText(733);
-				break;
-			case 1:
-				_player->loadAnimations("opendoor.nsp");
-				setupOtherNspAnimation(0,65);
-				playSound(31,5,-1);
-				_objectVar[101] = 0;
-				_console->printTosText(737);
-				break;
-			case 2:
-				_inventory.addItem(5);
-				_console->printTosText(950);
-				_objectVar[101] = 3;
-				return;
-			case 3:
-				_player->loadAnimations("opendoor.nsp");
-				setupOtherNspAnimation(0,65);
-				playSound(31,5,-1);
-				_objectVar[101] = 4;
-				_console->printTosText(737);
-				break;
-			case 4:
-				_player->loadAnimations("opendoor.nsp");
-				setupOtherNspAnimation(0,65);
-				playSound(31,5,-1);
-				_objectVar[101] = 3;
-				_console->printTosText(733);
-				break;
-			default:
-				break;
-			}
-		}
-		if (objNum == 81) {
-			if (_objectVar[81] == 0) {
-				_console->printTosText(951);
-				for (int i = 0; i < Objects::MAX_MOVED_OBJECTS; i++) {
-					if (_objectVar.getMoveObjectRoom(i) == 251) {
-						_objectVar.setMoveObjectRoom(i, 254);
-						_inventory.addItem(i);
-					}
-				}
-				_objectVar[81] = 1;
-			} else {
-				_console->printTosText(952);
-			}
-			return;
-		}
-		if (objNum == 25) {
-			if (1 < _objectVar[80]) {
-				if (_objectVar[25] == 0) {
-					_objectVar[25] = 1;
-					_console->printTosText(953);
-					_inventory.addItem(25);
-				} else if (_objectVar[25] == 2) {
-					_objectVar[26] = 1;
-					_console->printTosText(954);
-					_inventory.addItem(26);
-					_objectVar[25] = _objectVar[25] + 1;
-				} else if (_objectVar[25] == 1 || _objectVar[25] == 3 ||
-						 _objectVar[25] == 101 || _objectVar[25] == 103) {
-					_console->printTosText(694);
-				}
-			}
-			return;
-		}
-		if (objNum < 42 && objNum != 22 && (objNum != 7 || _objectVar[7] == 1) &&
-			objNum != 31 && objNum != 33 && objNum != 32 && objNum != 86) {
-			_console->printTosText(955); // "You pick up the "
-			_console->addToCurrentLine(Common::String::format("%s.", _objectVar.getObjectName(objNum)));
-			_inventory.addItem(objNum);
-			_room->_collisionType = 0;
-			if (((objNum != 25) || (_objectVar[25] == 1)) || (_objectVar[25] == 101)) {
-				_room->removeObjectFromRoom(objNum);
-			}
-			_objectVar.setMoveObjectRoom(objNum, 254);
-			if (objNum == 28) {
-				_objectVar[28] = 1;
-			}
-		} else if (objNum == 86) {
-			_objectVar[86] = _objectVar[86] == 0 ? 1 : 0;
-			playSound(42,5,-1);
-		} else if (objNum == 22) {
-			if (_objectVar[22] < 4) {
-				_player->loadAnimations("push.nsp");
-				setupOtherNspAnimation(0, 18);
-			} else {
-				_console->printTosText(665);
-			}
-		} else if (objNum == 165) {
-			if (_objectVar[165] == 0) {
-				_objectVar[165] = 1;
-				_console->printTosText(639);
-				_inventory.addItem(13);
-			} else {
-				_console->printTosText(640);
-			}
-		} else if (objNum == 57) {
-			_player->loadAnimations("instrshp.nsp");
-			if (_objectVar[71] == 2) {
-				_console->printTosText(4);
-				setupOtherNspAnimation(1, 44);
-			} else {
-				setupOtherNspAnimation(0, 43);
-			}
-		} else if (objNum == 117) {
-			_player->loadAnimations("obslev.nsp");
-			setupOtherNspAnimation(1, 46);
-		} else if (objNum == 62) {
-			if (((_objectVar[49] == 0) || (1 < _objectVar[62])) || (_currentDay != 1)) {
-				if (((_objectVar[49] == 0) || (1 < _objectVar[62])) || (_currentDay != 2)) {
-					if (((_objectVar[49] == 0) || (1 < _objectVar[62])) || (_currentDay != 3)) {
-						if (_objectVar[62] < 101) {
-//							LoadModeSong(9);
-							playSound(0,6,-1);
-							_objectVar[62] = 101;
-							_console->addTextLine("You turn on the music.");
-						} else if (_objectVar[62] == 101) {
-//							KillAllSound();
-//							TerminateRoomSong();
-							_objectVar[62] = 100;
-							_console->addTextLine("You turn off the music.");
-						}
-					} else {
-						_objectVar[62] = _objectVar[62] + 1;
-						_console->printTosText(921);
-					}
-				} else {
-					_objectVar[62] = _objectVar[62] + 1;
-					_console->printTosText(920);
-				}
-			} else {
-				_objectVar[62] = _objectVar[62] + 1;
-				_console->printTosText(919);
-			}
-		} else if (objNum == 63) {
-//			Ordinal_184(unaff_CS,(int)&_file_name,4192,(int)s_room33.nnn_1060_319f);
-//			_Room = 33;
-//			InitRoom();
-//			LoadRoomAndDumpPic();
-//			SetHeroSpriteNumber();
-		} else if (objNum == 83) {
-//			Ordinal_184(unaff_CS,(int)&_file_name,4192,(int)s_room28.nnn_1060_31ab);
-//			_Room = 28;
-//			InitRoom();
-//			LoadRoomAndDumpPic();
-//			SetHeroSpriteNumber();
-		} else if (objNum == 82) {
-			if (_room->_roomNumber == 41) {
-				_room->_roomNumber = 44;
-				_console->printTosText(956);
-			}
-			else {
-				_room->_roomNumber = 41;
-				_console->printTosText(957);
-			}
-//			LoadRoomAndDumpPic();
-//			InitRoom();
-//			SetHeroSpriteNumber();
-		} else if (objNum == 52) {
-//			_NoScroll = 0;
-			if (_objectVar[52] == 1) {
-				_player->loadAnimations("shower.nsp");
-				setupOtherNspAnimation(0, 2);
-				_console->printTosText(193);
-				playSound(2,4,-1);
-			} else {
-				_console->printTosText(194);
-			}
-		} else if (objNum == 59) {
-			if (_objectVar[59] == 2) {
-				_objectVar[59] = 1;
-				if (_room->_roomNumber == 0 || _room->_roomNumber == 9) {
-					_console->printTosText(409);
-				}
-			}
-			else {
-				if (_room->_roomNumber == 0 || _room->_roomNumber == 9) {
-					_console->printTosText(407);
-				}
-				_objectVar[59] = 2;
-			}
-		} else if (objNum == 78) {
-			if (_objectVar[78] == 2) {
-				_objectVar[78] = 1;
-				if (_room->_roomNumber == 0 || _room->_roomNumber == 9) {
-					_console->printTosText(409);
-				}
-			}
-			else {
-				playSound(41,5,-1);
-				if (_room->_roomNumber == 0 || _room->_roomNumber == 9) {
-					_console->printTosText(32);
-				}
-				_objectVar[78] = 2;
-			}
-		} else if (objNum == 139) {
-			_player->loadAnimations("ltladder.nsp");
-			setupOtherNspAnimation(0,10);
-		} else if (objNum == 76) {
-//			_NoScroll = 0;
-//			Ordinal_184(unaff_CS,(int)&_file_name,4192,(int)s_room3.nnn_1060_31e1);
-//			_Room = 3;
-//			LoadRoomAndDumpPic();
-//			InitRoom();
-//			SetHeroSpriteNumber();
-		} else if (objNum == 77) {
-			_player->loadAnimations("rtladder.nsp");
-			setupOtherNspAnimation(0, 12);
-		} else if (objNum == 66 && _objectVar[68] == 0) {
-			if (_objectVar[12] == 2) {
-				playSound(5,5,-1);
-				if (_objectVar[66] == 0) {
-					if (_objectVar[67] == 0 && _objectVar[68] == 0) {
-						_objectVar[66] = 1;
-					} else {
-						_objectVar[66] = 2;
-					}
-				} else {
-					_objectVar[66] = 0;
-				}
-			} else {
-				_console->addTextLine("You touch the surface of the ornate sigil.");
-			}
-		} else if (objNum == 67 && _objectVar[68] == 0) {
-			if (_objectVar[12] == 2) {
-				playSound(5,5,-1);
-				if (_objectVar[67] == 0) {
-					if (_objectVar[66] == 1 && _objectVar[68] == 0) {
-						_objectVar[67] = 1;
-					} else {
-						_objectVar[67] = 2;
-					}
-				} else {
-					_objectVar[67] = 0;
-				}
-			} else {
-				_console->addTextLine("You touch the surface of the ornate sigil.");
-			}
-		} else if ((objNum == 68) && (_objectVar[68] == 0)) {
-			if (_objectVar[12] == 2) {
-				if (true) {
-					if ((_objectVar[66] == 1) && (_objectVar[67] == 1)) {
-						playSound(13,5,-1);
-						_objectVar[68] = 1;
-						setupOtherNspAnimation(0,23);
-					} else {
-						_objectVar[68] = 2;
-					}
-				} else {
-					_objectVar[68] = 0;
-				}
-			} else {
-				_console->addTextLine("You touch the surface of the ornate sigil.");
-			}
-		}
-		else if (objNum == 84) {
-			_console->printTosText(566);
-		}
-//		_NoScroll = 0;
-		return;
-	}
-	if (_objectVar[138] == 0) {
-		_console->printTosText(906);
-	}
-	else {
-		_inventory.addItem(objNum);
-		_room->removeObjectFromRoom(objNum);
-		_objectVar[138] = 0;
-		updateDisplay();
-		if ((objNum == 7) && _currentDay == 1) {
-			_console->printTosText(905);
-			_objectVar[141] = 1;
-			_player->loadAnimations("delstore.nsp");
-			_objectVar.setMoveObjectPosition(141, {60, 221});
-			_objectVar.setMoveObjectRoom(7, 100);
-			_objectVar[7] = 1;
-		}
-	}
-}
-
-void DarkseedEngine::useCodeGloves(int16 targetObjNum) {
-	if (targetObjNum == 113) {
-		putobjunderpillow(14);
-		return;
-	}
-
-	int16 tosIdx = _objectVar.getUseGlovesTosIdx(targetObjNum);
-	if (tosIdx != 0) {
-		if (tosIdx < 979) {
-			_console->printTosText(tosIdx);
-		} else {
-			genericresponse(14,targetObjNum, tosIdx);
-		}
-	}
-	if (targetObjNum == 57) {
-		_player->loadAnimations("instrshp.nsp");
-		setupOtherNspAnimation(0, 43);
-	} else if (targetObjNum == 117) {
-		_player->loadAnimations("obslev.nsp");
-		setupOtherNspAnimation(0, 45);
-	}
-}
-
-void DarkseedEngine::useCodeMoney(int16 targetObjNum) {
-	if ((targetObjNum != 138) && (targetObjNum != 152)) {
-		int16 tosIdx = _objectVar.getUseMoneyTosIdx(targetObjNum);
-		if (tosIdx == 0) {
-			if (targetObjNum == 7) {
-				_console->printTosText(961);
-			} else if (targetObjNum == 113) {
-				putobjunderpillow(8);
-			}
-		} else if (tosIdx < 979) {
-			_console->printTosText(tosIdx);
-		} else {
-			genericresponse(8, targetObjNum, tosIdx);
-		}
-		return;
-	}
-	if (_objectVar[138] == 0) {
-		_player->loadAnimations("givclerk.nsp");
-		setupOtherNspAnimation(6, 35);
-	} else {
-		_console->addTextLine("Choose an item before giving clerk more money.");
-	}
-}
-
-void DarkseedEngine::useCodeJournal(int16 actionObjNum, int16 targetObjNum) {
-	if (targetObjNum == 113) {
-		putobjunderpillow(actionObjNum);
-	} else if ((actionObjNum == 6) && (targetObjNum == 47)) {
-		_console->printTosText(46);
-	} else if ((actionObjNum == 6) && (targetObjNum == 100)) {
-		_console->printTosText(145);
-	} else if ((actionObjNum == 6) && (targetObjNum == 136)) {
-		_console->printTosText(999);
-	} else {
-		int16 tosIdx = _objectVar.getUseJournalTosIdx(targetObjNum);
-		if (tosIdx != 0) {
-			if (tosIdx < 979) {
-				_console->printTosText(tosIdx);
-			}
-			else {
-				genericresponse(6,targetObjNum, tosIdx);
-			}
-		}
-	}
-}
-
-void DarkseedEngine::useCodeShopItems(int16 actionObjNum, int16 targetObjNum) {
-	if (actionObjNum == 7) {
-		if (targetObjNum == 44) {
-			_player->loadAnimations("opendoor.nsp");
-			setupOtherNspAnimation(0, 24);
-			_objectVar[44] = 3600;
-			playSound(32, 5, -1);
-			_inventory.removeItem(7);
-			_console->printTosText(730);
-		} else if ((targetObjNum == 141) && (_objectVar[141] == 7)) {
-			_objectVar[141] = 8;
-		} else if (targetObjNum == 47) {
-			_console->printTosText(54);
-		} else if (targetObjNum == 127) {
-			_console->printTosText(106);
-		} else if (targetObjNum == 123) {
-			_console->printTosText(129);
-		} else if (targetObjNum == 100) {
-			_console->printTosText(153);
-		} else if (targetObjNum == 143) {
-			_console->printTosText(189);
-		} else if (targetObjNum == 52) {
-			_console->printTosText(202);
-		} else if (targetObjNum == 145) {
-			_console->printTosText(226);
-		} else if (targetObjNum == 137) {
-			_console->printTosText(300);
-		} else if (targetObjNum == 126) {
-			_console->printTosText(312);
-		} else if (targetObjNum == 103 || targetObjNum == 151) {
-			_console->printTosText(362);
-		} else if (targetObjNum == 109) {
-			_console->printTosText(965);
-		} else if (targetObjNum == 61) {
-			_console->printTosText(460);
-		} else if (targetObjNum == 53) {
-			_console->printTosText(489);
-			throwmikeinjail();
-		} else if (targetObjNum == 46) {
-			_console->printTosText(542);
-		} else if (targetObjNum < 87 || 98 < targetObjNum) {
-			if (targetObjNum < 163 || 168 < targetObjNum) {
-				if (targetObjNum == 171) {
-					_console->printTosText(679);
-				} else if (targetObjNum == 129) {
-					genericresponse(7, 129, 998);
-				} else if (targetObjNum == 108) {
-					_console->printTosText(386);
-				} else if (targetObjNum == 110) {
-					_console->printTosText(392);
-				} else if (targetObjNum == 85) {
-					_console->printTosText(434);
-				} else if (targetObjNum == 194) {
-					genericresponse(7, 194, 989);
-				} else if (targetObjNum == 156) {
-					_console->printTosText(550);
-				} else if (targetObjNum == 172) {
-					genericresponse(7, 172, 988);
-				} else if (targetObjNum == 71) {
-					genericresponse(7, 71, 987);
-				} else if (targetObjNum == 101) {
-					genericresponse(7, 101, 986);
-				} else if (targetObjNum == 120) {
-					_console->printTosText(804);
-				} else if (targetObjNum == 184) {
-					genericresponse(7, 184, 980);
-				} else if (targetObjNum == 185) {
-					genericresponse(7, 185, 982);
-				} else if (targetObjNum == 121) {
-					genericresponse(7, 121, 990);
-				} else {
-					genericresponse(7, targetObjNum, 999);
-				}
-			} else {
-				_console->printTosText(632);
-			}
-		} else {
-			_console->printTosText(585);
-		}
-		return;
-	}
-	if (actionObjNum == 38 && targetObjNum == 78) {
-		_console->printTosText(42);
-		return;
-	}
-	if (actionObjNum == 38 && targetObjNum == 47) {
-		_console->printTosText(60);
-		return;
-	}
-	if (actionObjNum == 36 && targetObjNum == 125) {
-		_console->printTosText(77);
-		return;
-	}
-	if (actionObjNum == 38 && targetObjNum == 125) {
-		_console->printTosText(78);
-		return;
-	}
-	if (actionObjNum == 38 &&
-		(((((targetObjNum == 126 || targetObjNum == 126) || targetObjNum == 197) ||
-		   ((targetObjNum == 131 || (targetObjNum == 89)))) ||
-		  targetObjNum == 171))) {
-		_console->printTosText(89);
-		return;
-	}
-	if (actionObjNum == 37 && targetObjNum == 124) {
-		_console->printTosText(28);
-	} else if (actionObjNum == 38 && targetObjNum == 127) {
-		_console->printTosText(116);
-	} else if ((actionObjNum == 36 || actionObjNum == 37) && targetObjNum == 123) {
-		_console->printTosText(135);
-	} else if (actionObjNum == 38 && (targetObjNum == 123 || targetObjNum == 318)) {
-		_console->printTosText(320);
-	} else if (targetObjNum == 129) {
-		genericresponse(actionObjNum, 129, 998);
-	} else if ((actionObjNum == 37) &&
-			   ((((((targetObjNum == 142 || (targetObjNum == 124)) ||
-					((targetObjNum == 137 || (((targetObjNum == 148 || (targetObjNum == 109)) || (targetObjNum == 59)))))) ||
-				   ((targetObjNum == 66 || (targetObjNum == 67)))) ||
-				  (targetObjNum == 68)) ||
-				 ((((targetObjNum == 133 || (targetObjNum == 194)) ||
-					((targetObjNum == 46 ||
-					  (((((targetObjNum == 156 || (targetObjNum == 158)) || (targetObjNum == 159)) ||
-						 ((targetObjNum == 161 || (targetObjNum == 162)))) ||
-						(targetObjNum == 22)))))) ||
-				   (((targetObjNum == 42 || (targetObjNum == 35)) ||
-					 ((targetObjNum == 196 ||
-					   ((((targetObjNum == 170 || (targetObjNum == 172)) || (targetObjNum == 25)) ||
-						 (((targetObjNum == 71 || (targetObjNum == 101)) || (targetObjNum == 179)))))))))))))) {
-		_console->printTosText(180);
-	} else if ((actionObjNum == 37) && (targetObjNum == 52)) {
-		_console->printTosText(211);
-	} else if ((actionObjNum == 37) && (targetObjNum == 144)) {
-		_console->printTosText(218);
-	} else if ((actionObjNum == 37) && (targetObjNum == 145)) {
-		_console->printTosText(229);
-	} else if ((actionObjNum == 38) && (targetObjNum == 145)) {
-		_console->printTosText(230);
-	} else if (targetObjNum == 112) {
-		genericresponse(actionObjNum, 112, 996);
-	} else if ((actionObjNum == 38) && (targetObjNum == 49)) {
-		_console->printTosText(251);
-	} else if ((targetObjNum == 147) && (actionObjNum != 7)) {
-		_console->printTosText(319);
-	} else if (targetObjNum == 197) {
-		genericresponse(actionObjNum, 197, 993);
-	} else if ((actionObjNum == 38) && (targetObjNum == 150)) {
-		_console->printTosText(354);
-	} else if (targetObjNum == 109) {
-		if (actionObjNum == 38) {
-			_console->printTosText(375);
-		} else {
-			_console->printTosText(374);
-		}
-	} else if (targetObjNum == 130) {
-		genericresponse(actionObjNum, 130, 991);
-	} else if (targetObjNum == 108) {
-		_console->printTosText(386);
-	} else if (targetObjNum == 110) {
-		_console->printTosText(392);
-	} else if ((targetObjNum == 131) && (actionObjNum != 7)) {
-		_console->printTosText(405);
-	} else if (targetObjNum == 85) {
-		_console->printTosText(434);
-	} else if (targetObjNum == 121) {
-		if (actionObjNum == 38) {
-			_console->printTosText(445);
-		} else if (actionObjNum == 40) {
-			_console->printTosText(446);
-		} else {
-			genericresponse(actionObjNum, 121, 990);
-		}
-	} else if ((actionObjNum == 37) && (targetObjNum == 122)) {
-		_console->printTosText(451);
-	} else if ((actionObjNum == 38) || (targetObjNum != 61)) {
-		if ((actionObjNum == 36) && (targetObjNum == 133)) {
-			_console->printTosText(476);
-		} else if (((actionObjNum == 36) || (actionObjNum == 40)) && (targetObjNum == 53)) {
-			_console->printTosText(491);
-		} else if ((actionObjNum == 37) && (targetObjNum == 53)) {
-			_console->printTosText(492);
-		} else if (targetObjNum == 194) {
-			genericresponse(actionObjNum, 194, 989);
-		} else if (targetObjNum == 153) {
-			_console->printTosText(405);
-		} else if ((actionObjNum == 37) && (targetObjNum == 154)) {
-			_console->printTosText(535);
-		} else if ((actionObjNum == 36) && (targetObjNum == 46)) {
-			_console->printTosText(405);
-		} else if ((actionObjNum == 38) && (targetObjNum == 46)) {
-			_console->printTosText(545);
-		} else if ((actionObjNum == 40) && (targetObjNum == 46)) {
-			_console->printTosText(405);
-		} else if (targetObjNum == 156) {
-			_console->printTosText(550);
-		} else if (targetObjNum == 159) {
-			_console->printTosText(577);
-		} else if ((targetObjNum < 87) || (98 < targetObjNum)) {
-			if ((actionObjNum == 37) && ((162 < targetObjNum && (targetObjNum < 169)))) {
-				_console->printTosText(634);
-			} else if ((actionObjNum == 38) && ((162 < targetObjNum && (targetObjNum < 169)))) {
-				_console->printTosText(635);
-			} else if (targetObjNum == 172) {
-				genericresponse(actionObjNum, 172, 988);
-			} else if ((actionObjNum == 37) && (targetObjNum == 174)) {
-				_console->printTosText(690);
-			} else if ((actionObjNum == 38) && (targetObjNum == 25)) {
-				_console->printTosText(696);
-			} else if ((actionObjNum == 40) && (targetObjNum == 26)) {
-				_console->printTosText(700);
-			} else if (targetObjNum == 71) {
-				genericresponse(actionObjNum, 71, 987);
-			} else if ((actionObjNum == 39) && (targetObjNum == 44)) {
-				_console->printTosText(731);
-			} else if (targetObjNum == 101) {
-				genericresponse(actionObjNum, 101, 986);
-			} else if (targetObjNum == 113) {
-				_console->printTosText(753);
-			} else if (targetObjNum == 41) {
-				_console->printTosText(757);
-			} else if ((actionObjNum == 36) && (targetObjNum == 179)) {
-				_console->printTosText(764);
-			} else if ((actionObjNum == 38) && (targetObjNum == 179)) {
-				_console->printTosText(762);
-			} else if ((actionObjNum == 38) && (targetObjNum == 180)) {
-				_console->printTosText(769);
-			} else if (targetObjNum == 120) {
-				_console->printTosText(804);
-			} else if ((actionObjNum == 38) && (targetObjNum == 119)) {
-				_console->printTosText(808);
-			} else if ((actionObjNum == 38) && (targetObjNum == 114)) {
-				genericresponse(38, 114, 984);
-			} else if (targetObjNum == 184) {
-				genericresponse(actionObjNum, 184, 980);
-			} else if (targetObjNum == 185) {
-				genericresponse(actionObjNum, 185, 982);
-			} else if ((actionObjNum == 38) && (targetObjNum == 79)) {
-				_console->printTosText(833);
-			} else if ((targetObjNum == 79) && (actionObjNum != 7)) {
-				_console->printTosText(836);
-			} else if ((actionObjNum == 38) && (targetObjNum == 58)) {
-				_console->printTosText(849);
-			} else {
-				genericresponse(actionObjNum, targetObjNum, 999);
-			}
-		} else {
-			_console->printTosText(587);
-		}
-	} else {
-		_console->printTosText(462);
-	}
-}
-
-void DarkseedEngine::useCrowBar(int16 targetObjNum) {
-	int16 tosIdx = _objectVar.getUseCrowbarTosIdx(targetObjNum);
-	if (tosIdx != 0) {
-		if (tosIdx < 979) {
-			_console->printTosText(tosIdx);
-		} else {
-			genericresponse(5,targetObjNum, tosIdx);
-		}
-	}
-	if (targetObjNum == 42) {
-		if ((_objectVar[42] == 0) || (_objectVar[42] == 4)) {
-			_player->loadAnimations("crowbar.nsp");
-			setupOtherNspAnimation(0, 17);
-		} else {
-			_console->printTosText(962);
-		}
-	}
-}
 
 
 void DarkseedEngine::lookCode(int objNum) {
@@ -3222,10 +2357,6 @@ void DarkseedEngine::playCutscene(const Common::String cutsceneId) {
 	debug("Play Cutscene %s", cutsceneId.c_str()); // TODO play cutscenes.
 }
 
-void DarkseedEngine::gancanim() {
-	// TODO
-}
-
 void DarkseedEngine::getPackageObj(int packageType) {
 	_console->printTosText(424);
 	if (packageType == 1) {
@@ -3264,13 +2395,6 @@ void DarkseedEngine::nextFrame(int nspAminIdx) {
 void DarkseedEngine::stuffPlayer() {
 	// TODO
 }
-void DarkseedEngine::putobjunderpillow(int objNum) {
-	// TODO
-}
-
-void DarkseedEngine::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx) {
-	// TODO
-}
 
 void DarkseedEngine::updateHeadache() {
 	headAcheMessageCounter++;
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 3593d15e870..b2bb83d2c8f 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -45,6 +45,7 @@
 #include "sound.h"
 #include "sprites.h"
 #include "tostext.h"
+#include "usecode.h"
 
 namespace Darkseed {
 
@@ -89,6 +90,7 @@ public:
 	Sprites _sprites;
 	Objects _objectVar;
 	Inventory _inventory;
+	UseCode *_useCode = nullptr;
 
 	uint8 _currentDay = 1;
 	int _currentTimeInSeconds = 0x7e8e;
@@ -206,9 +208,10 @@ public:
 	void playSound(int16 unk, uint8 unk1, int16 unk2);
 	void nextFrame(int nspAminIdx);
 	void stuffPlayer();
-	void genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx);
+
 	void throwmikeinjail();
 	void runObjects();
+	void getPackageObj(int packageType);
 private:
 	void updateAnimation();
 	void advanceAnimationFrame(int nspAminIdx);
@@ -221,19 +224,11 @@ private:
 	void loadRoom(int roomNumber);
 	void changeToRoom(int newRoomNumber);
 
-	void useCode(int objNum);
-	void useCodeGloves(int16 targetObjNum);
-	void useCodeMoney(int16 targetObjNum);
-	void useCodeJournal(int16 actionObjNum, int16 targetObjNum);
-	void useCodeShopItems(int16 actionObjNum, int16 targetObjNum);
-	void useCrowBar(int16 targetObjNum);
-	void getPackageObj(int packageType);
 	void wongame();
 	void printTime();
 	void keeperanim();
 	void sargoanim();
-	void gancanim();
-	void putobjunderpillow(int objNum);
+
 	void gotosleepinjail();
 	void gotonextmorning();
 
diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
index 1ee5cf5bfba..fbb5af23b08 100644
--- a/engines/darkseed/module.mk
+++ b/engines/darkseed/module.mk
@@ -19,7 +19,8 @@ MODULE_OBJS = \
 	sprites.o \
 	objects.o \
 	inventory.o \
-	sound.o
+	sound.o \
+	usecode.o
 
 # This module can be built as a plugin
 ifeq ($(ENABLE_DARKSEED), DYNAMIC_PLUGIN)
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
new file mode 100644
index 00000000000..8c816970ff9
--- /dev/null
+++ b/engines/darkseed/usecode.cpp
@@ -0,0 +1,911 @@
+/* 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 "darkseed/darkseed.h"
+#include "darkseed/usecode.h"
+#include "common/debug.h"
+
+namespace Darkseed {
+
+UseCode::UseCode(Console *console, Player *player, Objects &objectVar, Inventory &inventory) : _console(console), _player(player), _objectVar(objectVar), _inventory(inventory) {}
+
+
+void Darkseed::UseCode::useCode(int objNum) {
+	debug("useCode: objNum = %d", objNum);
+	
+	if (objNum == 141) {
+		_console->addTextLine("You touch Delbert...");
+		return;
+	}
+	if (objNum == 189) {
+		_console->addTextLine("You touch the cold iron bars.");
+		return;
+	}
+	if (objNum == 42) {
+		switch(_objectVar[42]) {
+		case 0:
+			_console->printTosText(653);
+			break;
+		case 1:
+			_console->printTosText(655);
+			_objectVar[42] = 0;
+			break;
+		case 2:
+			_console->printTosText(660);
+			_inventory.addItem(6);
+			_objectVar[42] = 3;
+			break;
+		case 3:
+			_console->printTosText(655);
+			_objectVar[42] = 4;
+			break;
+		case 4:
+			_console->printTosText(653);
+		}
+		return;
+	}
+	if (objNum == 9) {
+		g_engine->_room->_collisionType = 0;
+		g_engine->_room->removeObjectFromRoom(9);
+		_objectVar.setMoveObjectRoom(9, 100);
+		g_engine->showFullscreenPic(g_engine->isCdVersion() ? "paper_c.pic" : "paper-c.pic");
+		return;
+	}
+	if (objNum == 35) {
+		_objectVar[35] = 3600;
+	}
+	if (objNum == 47) {
+		_player->loadAnimations("phone.nsp");
+		if (_objectVar.getObjectRunningCode(47) == 0) {
+			g_engine->setupOtherNspAnimation(2,63);
+		}
+		else {
+			g_engine->setupOtherNspAnimation(0,8);
+		}
+		_player->_direction = 3;
+	}
+	if (objNum == 194) {
+		if (_objectVar[53] == 2) {
+			_console->printTosText(948);
+			for (int i = 0; i < Objects::MAX_MOVED_OBJECTS; i++) {
+				if (_objectVar.getMoveObjectRoom(i) == 252) {
+					_objectVar.setMoveObjectRoom(i, 254);
+					_inventory.addItem(i);
+				}
+			}
+			_objectVar[53] = 3;
+		} else {
+			_console->printTosText(566);
+		}
+		return;
+	}
+	if (objNum == 113) {
+		bool foundMatch = false;
+		for (int i = 0; i < Objects::MAX_MOVED_OBJECTS; i++) {
+			if (_objectVar.getMoveObjectRoom(i) == 250) {
+				_objectVar.setMoveObjectRoom(i, 254);
+				_inventory.addItem(i);
+				foundMatch = true;
+			}
+		}
+		if (foundMatch) {
+			_objectVar[113] = 0;
+			_console->printTosText(948);
+		} else {
+			_console->printTosText(751);
+		}
+	}
+	if (objNum == 123) {
+		if (g_engine->_currentTimeInSeconds < 61200) {
+			_console->printTosText(119);
+		} else {
+			_player->loadAnimations("bedsleep.nsp");
+			g_engine->setupOtherNspAnimation(1, 5);
+		}
+		return;
+	}
+	if (objNum == 71 && _objectVar[71] == 2) { // car ignition
+		_objectVar[71] = 0;
+		_console->printTosText(949);
+		_inventory.addItem(26);
+		return;
+	}
+	if ((162 < objNum) && (objNum < 169)) {
+		g_engine->playSound(47,5,-1);
+	}
+	if (objNum == 175) {
+		g_engine->playSound(39,5,-1);
+		//		while (iVar2 = VOCPlaying(), iVar2 != 0) {
+		//			VOCPoll();
+		//		}
+		_console->printTosText(719);
+		return;
+	}
+	if (objNum == 187) {
+		if (_objectVar[187] == 0) {
+			_console->printTosText(856);
+			g_engine->setupOtherNspAnimation(0, 60);
+		} else {
+			g_engine->setupOtherNspAnimation(1, 61);
+		}
+		return;
+	}
+	if (objNum == 137 || objNum == 30) {
+		if (_objectVar[30] == 0) {
+			_objectVar[30] = 1;
+			g_engine->_room->_collisionType = 0;
+			g_engine->_room->removeObjectFromRoom(30);
+			_objectVar.setMoveObjectRoom(30, 100);
+			g_engine->showFullscreenPic(g_engine->isCdVersion() ? "note_c.pic" : "note-c.pic");
+		} else {
+			_console->printTosText(296);
+		}
+		return;
+	}
+	if (g_engine->_room->_roomNumber == 21 && objNum == 12) {
+		if (_objectVar[12] == 0 && _objectVar[10] == 1) {
+			_objectVar[12] = 1;
+			_inventory.addItem(12);
+			_console->printTosText(568);
+		} else {
+			_console->printTosText(566);
+		}
+		return;
+	}
+	if (objNum == 46) {
+		if (_objectVar[46] == 1) {
+			g_engine->setupOtherNspAnimation(0,19);
+		} else {
+			_console->printTosText(539);
+		}
+		return;
+	}
+	if (objNum != 7 && objNum != 36 && objNum != 37 && objNum != 38 && objNum != 39 && objNum != 40) {
+		int handTosIdx = _objectVar.getHandDescriptionTosIdx(objNum);
+		if (handTosIdx != 0 && handTosIdx < 979) {
+			_console->printTosText(handTosIdx);
+		} else if (handTosIdx > 978) {
+			// TODO genericresponse
+		}
+		if (objNum == 80) {
+			_console->printTosText(553 + (_objectVar[80] & 1));
+			_objectVar[80] = (_objectVar[80] & 2) + ((_objectVar[80] & 1) == 0 ? 1 : 0);
+			return;
+		}
+		if ((objNum == 59 || objNum == 78) && _objectVar[34] == 0) {
+			return;
+		}
+		if (objNum == 100) {
+			if (_objectVar[100] == 0 || _objectVar[100] == 1 || _objectVar[100] == 3) {
+				_console->printTosText(140);
+			} else if (_objectVar[100] == 2) {
+				_objectVar[100] = 3;
+				_inventory.addItem(10);
+				_objectVar[10] = 254;
+				_console->printTosText(142);
+			}
+			return;
+		}
+		if (objNum == 114) {
+			gancanim();
+			return;
+		}
+		if ((objNum == 28) && (_objectVar[28] == 2)) {
+			_console->addTextLine("The sergeant says 'Nice gun eh? It's a Browning'");
+			return;
+		}
+		if (objNum > 103 && objNum < 111) {
+			if (objNum < 110) {
+				_player->loadAnimations("opendrwr.nsp");
+				if (objNum == 108) {
+					if (_objectVar[108] == 0) {
+						_console->printTosText(383);
+					}
+					else {
+						_console->printTosText(385);
+					}
+					g_engine->setupOtherNspAnimation(0, 52);
+				}
+				else {
+					if (_objectVar[objNum] == 0) {
+						_console->printTosText(371);
+					}
+					else {
+						_console->printTosText(373);
+					}
+					g_engine->setupOtherNspAnimation(0,objNum - 56);
+				}
+			}
+			else {
+				if (_objectVar[objNum] == 0) {
+					_console->printTosText(389);
+				}
+				else {
+					_console->printTosText(391);
+				}
+				_objectVar[objNum] = _objectVar[objNum] == 0 ? 1 : 0;
+			}
+			return;
+		}
+		if (objNum == 111) { // tap
+			_player->loadAnimations("aspirin.nsp");
+			g_engine->setupOtherNspAnimation(0,30);
+			_console->printTosText(242);
+			return;
+		}
+		if (objNum == 112) { // mirror cabinet
+			_player->loadAnimations("aspirin.nsp");
+			g_engine->setupOtherNspAnimation(2,32);
+			return;
+		}
+		if (objNum > 30 && objNum < 34) {
+			g_engine->_room->removeObjectFromRoom(objNum);
+			g_engine->getPackageObj(objNum - 30);
+			return;
+		}
+		if ((objNum == 14) && (_objectVar[86] == 0)) {
+			_objectVar[86] = 1;
+			return;
+		}
+		if ((objNum == 102) && (_objectVar[23] == 1)) {
+			_player->loadAnimations("slide.nsp");
+			g_engine->setupOtherNspAnimation(1, 26);
+			return;
+		}
+		if (objNum == 101) {
+			switch(_objectVar[101]) {
+			case 0:
+				_player->loadAnimations("opendoor.nsp");
+				g_engine->setupOtherNspAnimation(0,65);
+				g_engine->playSound(31,5,-1);
+				_objectVar[101] = 1;
+				_console->printTosText(733);
+				break;
+			case 1:
+				_player->loadAnimations("opendoor.nsp");
+				g_engine->setupOtherNspAnimation(0,65);
+				g_engine->playSound(31,5,-1);
+				_objectVar[101] = 0;
+				_console->printTosText(737);
+				break;
+			case 2:
+				_inventory.addItem(5);
+				_console->printTosText(950);
+				_objectVar[101] = 3;
+				return;
+			case 3:
+				_player->loadAnimations("opendoor.nsp");
+				g_engine->setupOtherNspAnimation(0,65);
+				g_engine->playSound(31,5,-1);
+				_objectVar[101] = 4;
+				_console->printTosText(737);
+				break;
+			case 4:
+				_player->loadAnimations("opendoor.nsp");
+				g_engine->setupOtherNspAnimation(0,65);
+				g_engine->playSound(31,5,-1);
+				_objectVar[101] = 3;
+				_console->printTosText(733);
+				break;
+			default:
+				break;
+			}
+		}
+		if (objNum == 81) {
+			if (_objectVar[81] == 0) {
+				_console->printTosText(951);
+				for (int i = 0; i < Objects::MAX_MOVED_OBJECTS; i++) {
+					if (_objectVar.getMoveObjectRoom(i) == 251) {
+						_objectVar.setMoveObjectRoom(i, 254);
+						_inventory.addItem(i);
+					}
+				}
+				_objectVar[81] = 1;
+			} else {
+				_console->printTosText(952);
+			}
+			return;
+		}
+		if (objNum == 25) {
+			if (1 < _objectVar[80]) {
+				if (_objectVar[25] == 0) {
+					_objectVar[25] = 1;
+					_console->printTosText(953);
+					_inventory.addItem(25);
+				} else if (_objectVar[25] == 2) {
+					_objectVar[26] = 1;
+					_console->printTosText(954);
+					_inventory.addItem(26);
+					_objectVar[25] = _objectVar[25] + 1;
+				} else if (_objectVar[25] == 1 || _objectVar[25] == 3 ||
+						   _objectVar[25] == 101 || _objectVar[25] == 103) {
+					_console->printTosText(694);
+				}
+			}
+			return;
+		}
+		if (objNum < 42 && objNum != 22 && (objNum != 7 || _objectVar[7] == 1) &&
+			objNum != 31 && objNum != 33 && objNum != 32 && objNum != 86) {
+			_console->printTosText(955); // "You pick up the "
+			_console->addToCurrentLine(Common::String::format("%s.", _objectVar.getObjectName(objNum)));
+			_inventory.addItem(objNum);
+			g_engine->_room->_collisionType = 0;
+			if (((objNum != 25) || (_objectVar[25] == 1)) || (_objectVar[25] == 101)) {
+				g_engine->_room->removeObjectFromRoom(objNum);
+			}
+			_objectVar.setMoveObjectRoom(objNum, 254);
+			if (objNum == 28) {
+				_objectVar[28] = 1;
+			}
+		} else if (objNum == 86) {
+			_objectVar[86] = _objectVar[86] == 0 ? 1 : 0;
+			g_engine->playSound(42,5,-1);
+		} else if (objNum == 22) {
+			if (_objectVar[22] < 4) {
+				_player->loadAnimations("push.nsp");
+				g_engine->setupOtherNspAnimation(0, 18);
+			} else {
+				_console->printTosText(665);
+			}
+		} else if (objNum == 165) {
+			if (_objectVar[165] == 0) {
+				_objectVar[165] = 1;
+				_console->printTosText(639);
+				_inventory.addItem(13);
+			} else {
+				_console->printTosText(640);
+			}
+		} else if (objNum == 57) {
+			_player->loadAnimations("instrshp.nsp");
+			if (_objectVar[71] == 2) {
+				_console->printTosText(4);
+				g_engine->setupOtherNspAnimation(1, 44);
+			} else {
+				g_engine->setupOtherNspAnimation(0, 43);
+			}
+		} else if (objNum == 117) {
+			_player->loadAnimations("obslev.nsp");
+			g_engine->setupOtherNspAnimation(1, 46);
+		} else if (objNum == 62) {
+			if (((_objectVar[49] == 0) || (1 < _objectVar[62])) || (g_engine->_currentDay != 1)) {
+				if (((_objectVar[49] == 0) || (1 < _objectVar[62])) || (g_engine->_currentDay != 2)) {
+					if (((_objectVar[49] == 0) || (1 < _objectVar[62])) || (g_engine->_currentDay != 3)) {
+						if (_objectVar[62] < 101) {
+							//							LoadModeSong(9);
+							g_engine->playSound(0,6,-1);
+							_objectVar[62] = 101;
+							_console->addTextLine("You turn on the music.");
+						} else if (_objectVar[62] == 101) {
+							//							KillAllSound();
+							//							TerminateRoomSong();
+							_objectVar[62] = 100;
+							_console->addTextLine("You turn off the music.");
+						}
+					} else {
+						_objectVar[62] = _objectVar[62] + 1;
+						_console->printTosText(921);
+					}
+				} else {
+					_objectVar[62] = _objectVar[62] + 1;
+					_console->printTosText(920);
+				}
+			} else {
+				_objectVar[62] = _objectVar[62] + 1;
+				_console->printTosText(919);
+			}
+		} else if (objNum == 63) {
+			//			Ordinal_184(unaff_CS,(int)&_file_name,4192,(int)sg_engine->_room33.nnn_1060_319f);
+			//			_Room = 33;
+			//			InitRoom();
+			//			LoadRoomAndDumpPic();
+			//			SetHeroSpriteNumber();
+		} else if (objNum == 83) {
+			//			Ordinal_184(unaff_CS,(int)&_file_name,4192,(int)sg_engine->_room28.nnn_1060_31ab);
+			//			_Room = 28;
+			//			InitRoom();
+			//			LoadRoomAndDumpPic();
+			//			SetHeroSpriteNumber();
+		} else if (objNum == 82) {
+			if (g_engine->_room->_roomNumber == 41) {
+				g_engine->_room->_roomNumber = 44;
+				_console->printTosText(956);
+			}
+			else {
+				g_engine->_room->_roomNumber = 41;
+				_console->printTosText(957);
+			}
+			//			LoadRoomAndDumpPic();
+			//			InitRoom();
+			//			SetHeroSpriteNumber();
+		} else if (objNum == 52) {
+			//			_NoScroll = 0;
+			if (_objectVar[52] == 1) {
+				_player->loadAnimations("shower.nsp");
+				g_engine->setupOtherNspAnimation(0, 2);
+				_console->printTosText(193);
+				g_engine->playSound(2,4,-1);
+			} else {
+				_console->printTosText(194);
+			}
+		} else if (objNum == 59) {
+			if (_objectVar[59] == 2) {
+				_objectVar[59] = 1;
+				if (g_engine->_room->_roomNumber == 0 || g_engine->_room->_roomNumber == 9) {
+					_console->printTosText(409);
+				}
+			}
+			else {
+				if (g_engine->_room->_roomNumber == 0 || g_engine->_room->_roomNumber == 9) {
+					_console->printTosText(407);
+				}
+				_objectVar[59] = 2;
+			}
+		} else if (objNum == 78) {
+			if (_objectVar[78] == 2) {
+				_objectVar[78] = 1;
+				if (g_engine->_room->_roomNumber == 0 || g_engine->_room->_roomNumber == 9) {
+					_console->printTosText(409);
+				}
+			}
+			else {
+				g_engine->playSound(41,5,-1);
+				if (g_engine->_room->_roomNumber == 0 || g_engine->_room->_roomNumber == 9) {
+					_console->printTosText(32);
+				}
+				_objectVar[78] = 2;
+			}
+		} else if (objNum == 139) {
+			_player->loadAnimations("ltladder.nsp");
+			g_engine->setupOtherNspAnimation(0,10);
+		} else if (objNum == 76) {
+			//			_NoScroll = 0;
+			//			Ordinal_184(unaff_CS,(int)&_file_name,4192,(int)sg_engine->_room3.nnn_1060_31e1);
+			//			_Room = 3;
+			//			LoadRoomAndDumpPic();
+			//			InitRoom();
+			//			SetHeroSpriteNumber();
+		} else if (objNum == 77) {
+			_player->loadAnimations("rtladder.nsp");
+			g_engine->setupOtherNspAnimation(0, 12);
+		} else if (objNum == 66 && _objectVar[68] == 0) {
+			if (_objectVar[12] == 2) {
+				g_engine->playSound(5,5,-1);
+				if (_objectVar[66] == 0) {
+					if (_objectVar[67] == 0 && _objectVar[68] == 0) {
+						_objectVar[66] = 1;
+					} else {
+						_objectVar[66] = 2;
+					}
+				} else {
+					_objectVar[66] = 0;
+				}
+			} else {
+				_console->addTextLine("You touch the surface of the ornate sigil.");
+			}
+		} else if (objNum == 67 && _objectVar[68] == 0) {
+			if (_objectVar[12] == 2) {
+				g_engine->playSound(5,5,-1);
+				if (_objectVar[67] == 0) {
+					if (_objectVar[66] == 1 && _objectVar[68] == 0) {
+						_objectVar[67] = 1;
+					} else {
+						_objectVar[67] = 2;
+					}
+				} else {
+					_objectVar[67] = 0;
+				}
+			} else {
+				_console->addTextLine("You touch the surface of the ornate sigil.");
+			}
+		} else if ((objNum == 68) && (_objectVar[68] == 0)) {
+			if (_objectVar[12] == 2) {
+				if (true) {
+					if ((_objectVar[66] == 1) && (_objectVar[67] == 1)) {
+						g_engine->playSound(13,5,-1);
+						_objectVar[68] = 1;
+						g_engine->setupOtherNspAnimation(0,23);
+					} else {
+						_objectVar[68] = 2;
+					}
+				} else {
+					_objectVar[68] = 0;
+				}
+			} else {
+				_console->addTextLine("You touch the surface of the ornate sigil.");
+			}
+		}
+		else if (objNum == 84) {
+			_console->printTosText(566);
+		}
+		//		_NoScroll = 0;
+		return;
+	}
+	if (_objectVar[138] == 0) {
+		_console->printTosText(906);
+	}
+	else {
+		_inventory.addItem(objNum);
+		g_engine->_room->removeObjectFromRoom(objNum);
+		_objectVar[138] = 0;
+		g_engine->updateDisplay();
+		if ((objNum == 7) && g_engine->_currentDay == 1) {
+			_console->printTosText(905);
+			_objectVar[141] = 1;
+			_player->loadAnimations("delstore.nsp");
+			_objectVar.setMoveObjectPosition(141, {60, 221});
+			_objectVar.setMoveObjectRoom(7, 100);
+			_objectVar[7] = 1;
+		}
+	}
+}
+
+void Darkseed::UseCode::useCodeGloves(int16 targetObjNum) {
+	if (targetObjNum == 113) {
+		putobjunderpillow(14);
+		return;
+	}
+
+	int16 tosIdx = _objectVar.getUseGlovesTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(14,targetObjNum, tosIdx);
+		}
+	}
+	if (targetObjNum == 57) {
+		_player->loadAnimations("instrshp.nsp");
+		g_engine->setupOtherNspAnimation(0, 43);
+	} else if (targetObjNum == 117) {
+		_player->loadAnimations("obslev.nsp");
+		g_engine->setupOtherNspAnimation(0, 45);
+	}
+}
+
+void Darkseed::UseCode::useCodeMoney(int16 targetObjNum) {
+	if ((targetObjNum != 138) && (targetObjNum != 152)) {
+		int16 tosIdx = _objectVar.getUseMoneyTosIdx(targetObjNum);
+		if (tosIdx == 0) {
+			if (targetObjNum == 7) {
+				_console->printTosText(961);
+			} else if (targetObjNum == 113) {
+				putobjunderpillow(8);
+			}
+		} else if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(8, targetObjNum, tosIdx);
+		}
+		return;
+	}
+	if (_objectVar[138] == 0) {
+		_player->loadAnimations("givclerk.nsp");
+		g_engine->setupOtherNspAnimation(6, 35);
+	} else {
+		_console->addTextLine("Choose an item before giving clerk more money.");
+	}
+}
+
+void Darkseed::UseCode::useCodeJournal(int16 actionObjNum, int16 targetObjNum) {
+	if (targetObjNum == 113) {
+		putobjunderpillow(actionObjNum);
+	} else if ((actionObjNum == 6) && (targetObjNum == 47)) {
+		_console->printTosText(46);
+	} else if ((actionObjNum == 6) && (targetObjNum == 100)) {
+		_console->printTosText(145);
+	} else if ((actionObjNum == 6) && (targetObjNum == 136)) {
+		_console->printTosText(999);
+	} else {
+		int16 tosIdx = _objectVar.getUseJournalTosIdx(targetObjNum);
+		if (tosIdx != 0) {
+			if (tosIdx < 979) {
+				_console->printTosText(tosIdx);
+			}
+			else {
+				genericresponse(6,targetObjNum, tosIdx);
+			}
+		}
+	}
+}
+
+void Darkseed::UseCode::useCodeShopItems(int16 actionObjNum, int16 targetObjNum) {
+	if (actionObjNum == 7) {
+		if (targetObjNum == 44) {
+			_player->loadAnimations("opendoor.nsp");
+			g_engine->setupOtherNspAnimation(0, 24);
+			_objectVar[44] = 3600;
+			g_engine->playSound(32, 5, -1);
+			_inventory.removeItem(7);
+			_console->printTosText(730);
+		} else if ((targetObjNum == 141) && (_objectVar[141] == 7)) {
+			_objectVar[141] = 8;
+		} else if (targetObjNum == 47) {
+			_console->printTosText(54);
+		} else if (targetObjNum == 127) {
+			_console->printTosText(106);
+		} else if (targetObjNum == 123) {
+			_console->printTosText(129);
+		} else if (targetObjNum == 100) {
+			_console->printTosText(153);
+		} else if (targetObjNum == 143) {
+			_console->printTosText(189);
+		} else if (targetObjNum == 52) {
+			_console->printTosText(202);
+		} else if (targetObjNum == 145) {
+			_console->printTosText(226);
+		} else if (targetObjNum == 137) {
+			_console->printTosText(300);
+		} else if (targetObjNum == 126) {
+			_console->printTosText(312);
+		} else if (targetObjNum == 103 || targetObjNum == 151) {
+			_console->printTosText(362);
+		} else if (targetObjNum == 109) {
+			_console->printTosText(965);
+		} else if (targetObjNum == 61) {
+			_console->printTosText(460);
+		} else if (targetObjNum == 53) {
+			_console->printTosText(489);
+			g_engine->throwmikeinjail();
+		} else if (targetObjNum == 46) {
+			_console->printTosText(542);
+		} else if (targetObjNum < 87 || 98 < targetObjNum) {
+			if (targetObjNum < 163 || 168 < targetObjNum) {
+				if (targetObjNum == 171) {
+					_console->printTosText(679);
+				} else if (targetObjNum == 129) {
+					genericresponse(7, 129, 998);
+				} else if (targetObjNum == 108) {
+					_console->printTosText(386);
+				} else if (targetObjNum == 110) {
+					_console->printTosText(392);
+				} else if (targetObjNum == 85) {
+					_console->printTosText(434);
+				} else if (targetObjNum == 194) {
+					genericresponse(7, 194, 989);
+				} else if (targetObjNum == 156) {
+					_console->printTosText(550);
+				} else if (targetObjNum == 172) {
+					genericresponse(7, 172, 988);
+				} else if (targetObjNum == 71) {
+					genericresponse(7, 71, 987);
+				} else if (targetObjNum == 101) {
+					genericresponse(7, 101, 986);
+				} else if (targetObjNum == 120) {
+					_console->printTosText(804);
+				} else if (targetObjNum == 184) {
+					genericresponse(7, 184, 980);
+				} else if (targetObjNum == 185) {
+					genericresponse(7, 185, 982);
+				} else if (targetObjNum == 121) {
+					genericresponse(7, 121, 990);
+				} else {
+					genericresponse(7, targetObjNum, 999);
+				}
+			} else {
+				_console->printTosText(632);
+			}
+		} else {
+			_console->printTosText(585);
+		}
+		return;
+	}
+	if (actionObjNum == 38 && targetObjNum == 78) {
+		_console->printTosText(42);
+		return;
+	}
+	if (actionObjNum == 38 && targetObjNum == 47) {
+		_console->printTosText(60);
+		return;
+	}
+	if (actionObjNum == 36 && targetObjNum == 125) {
+		_console->printTosText(77);
+		return;
+	}
+	if (actionObjNum == 38 && targetObjNum == 125) {
+		_console->printTosText(78);
+		return;
+	}
+	if (actionObjNum == 38 &&
+		(((((targetObjNum == 126 || targetObjNum == 126) || targetObjNum == 197) ||
+		   ((targetObjNum == 131 || (targetObjNum == 89)))) ||
+		  targetObjNum == 171))) {
+		_console->printTosText(89);
+		return;
+	}
+	if (actionObjNum == 37 && targetObjNum == 124) {
+		_console->printTosText(28);
+	} else if (actionObjNum == 38 && targetObjNum == 127) {
+		_console->printTosText(116);
+	} else if ((actionObjNum == 36 || actionObjNum == 37) && targetObjNum == 123) {
+		_console->printTosText(135);
+	} else if (actionObjNum == 38 && (targetObjNum == 123 || targetObjNum == 318)) {
+		_console->printTosText(320);
+	} else if (targetObjNum == 129) {
+		genericresponse(actionObjNum, 129, 998);
+	} else if ((actionObjNum == 37) &&
+			   ((((((targetObjNum == 142 || (targetObjNum == 124)) ||
+					((targetObjNum == 137 || (((targetObjNum == 148 || (targetObjNum == 109)) || (targetObjNum == 59)))))) ||
+				   ((targetObjNum == 66 || (targetObjNum == 67)))) ||
+				  (targetObjNum == 68)) ||
+				 ((((targetObjNum == 133 || (targetObjNum == 194)) ||
+					((targetObjNum == 46 ||
+					  (((((targetObjNum == 156 || (targetObjNum == 158)) || (targetObjNum == 159)) ||
+						 ((targetObjNum == 161 || (targetObjNum == 162)))) ||
+						(targetObjNum == 22)))))) ||
+				   (((targetObjNum == 42 || (targetObjNum == 35)) ||
+					 ((targetObjNum == 196 ||
+					   ((((targetObjNum == 170 || (targetObjNum == 172)) || (targetObjNum == 25)) ||
+						 (((targetObjNum == 71 || (targetObjNum == 101)) || (targetObjNum == 179)))))))))))))) {
+		_console->printTosText(180);
+	} else if ((actionObjNum == 37) && (targetObjNum == 52)) {
+		_console->printTosText(211);
+	} else if ((actionObjNum == 37) && (targetObjNum == 144)) {
+		_console->printTosText(218);
+	} else if ((actionObjNum == 37) && (targetObjNum == 145)) {
+		_console->printTosText(229);
+	} else if ((actionObjNum == 38) && (targetObjNum == 145)) {
+		_console->printTosText(230);
+	} else if (targetObjNum == 112) {
+		genericresponse(actionObjNum, 112, 996);
+	} else if ((actionObjNum == 38) && (targetObjNum == 49)) {
+		_console->printTosText(251);
+	} else if ((targetObjNum == 147) && (actionObjNum != 7)) {
+		_console->printTosText(319);
+	} else if (targetObjNum == 197) {
+		genericresponse(actionObjNum, 197, 993);
+	} else if ((actionObjNum == 38) && (targetObjNum == 150)) {
+		_console->printTosText(354);
+	} else if (targetObjNum == 109) {
+		if (actionObjNum == 38) {
+			_console->printTosText(375);
+		} else {
+			_console->printTosText(374);
+		}
+	} else if (targetObjNum == 130) {
+		genericresponse(actionObjNum, 130, 991);
+	} else if (targetObjNum == 108) {
+		_console->printTosText(386);
+	} else if (targetObjNum == 110) {
+		_console->printTosText(392);
+	} else if ((targetObjNum == 131) && (actionObjNum != 7)) {
+		_console->printTosText(405);
+	} else if (targetObjNum == 85) {
+		_console->printTosText(434);
+	} else if (targetObjNum == 121) {
+		if (actionObjNum == 38) {
+			_console->printTosText(445);
+		} else if (actionObjNum == 40) {
+			_console->printTosText(446);
+		} else {
+			genericresponse(actionObjNum, 121, 990);
+		}
+	} else if ((actionObjNum == 37) && (targetObjNum == 122)) {
+		_console->printTosText(451);
+	} else if ((actionObjNum == 38) || (targetObjNum != 61)) {
+		if ((actionObjNum == 36) && (targetObjNum == 133)) {
+			_console->printTosText(476);
+		} else if (((actionObjNum == 36) || (actionObjNum == 40)) && (targetObjNum == 53)) {
+			_console->printTosText(491);
+		} else if ((actionObjNum == 37) && (targetObjNum == 53)) {
+			_console->printTosText(492);
+		} else if (targetObjNum == 194) {
+			genericresponse(actionObjNum, 194, 989);
+		} else if (targetObjNum == 153) {
+			_console->printTosText(405);
+		} else if ((actionObjNum == 37) && (targetObjNum == 154)) {
+			_console->printTosText(535);
+		} else if ((actionObjNum == 36) && (targetObjNum == 46)) {
+			_console->printTosText(405);
+		} else if ((actionObjNum == 38) && (targetObjNum == 46)) {
+			_console->printTosText(545);
+		} else if ((actionObjNum == 40) && (targetObjNum == 46)) {
+			_console->printTosText(405);
+		} else if (targetObjNum == 156) {
+			_console->printTosText(550);
+		} else if (targetObjNum == 159) {
+			_console->printTosText(577);
+		} else if ((targetObjNum < 87) || (98 < targetObjNum)) {
+			if ((actionObjNum == 37) && ((162 < targetObjNum && (targetObjNum < 169)))) {
+				_console->printTosText(634);
+			} else if ((actionObjNum == 38) && ((162 < targetObjNum && (targetObjNum < 169)))) {
+				_console->printTosText(635);
+			} else if (targetObjNum == 172) {
+				genericresponse(actionObjNum, 172, 988);
+			} else if ((actionObjNum == 37) && (targetObjNum == 174)) {
+				_console->printTosText(690);
+			} else if ((actionObjNum == 38) && (targetObjNum == 25)) {
+				_console->printTosText(696);
+			} else if ((actionObjNum == 40) && (targetObjNum == 26)) {
+				_console->printTosText(700);
+			} else if (targetObjNum == 71) {
+				genericresponse(actionObjNum, 71, 987);
+			} else if ((actionObjNum == 39) && (targetObjNum == 44)) {
+				_console->printTosText(731);
+			} else if (targetObjNum == 101) {
+				genericresponse(actionObjNum, 101, 986);
+			} else if (targetObjNum == 113) {
+				_console->printTosText(753);
+			} else if (targetObjNum == 41) {
+				_console->printTosText(757);
+			} else if ((actionObjNum == 36) && (targetObjNum == 179)) {
+				_console->printTosText(764);
+			} else if ((actionObjNum == 38) && (targetObjNum == 179)) {
+				_console->printTosText(762);
+			} else if ((actionObjNum == 38) && (targetObjNum == 180)) {
+				_console->printTosText(769);
+			} else if (targetObjNum == 120) {
+				_console->printTosText(804);
+			} else if ((actionObjNum == 38) && (targetObjNum == 119)) {
+				_console->printTosText(808);
+			} else if ((actionObjNum == 38) && (targetObjNum == 114)) {
+				genericresponse(38, 114, 984);
+			} else if (targetObjNum == 184) {
+				genericresponse(actionObjNum, 184, 980);
+			} else if (targetObjNum == 185) {
+				genericresponse(actionObjNum, 185, 982);
+			} else if ((actionObjNum == 38) && (targetObjNum == 79)) {
+				_console->printTosText(833);
+			} else if ((targetObjNum == 79) && (actionObjNum != 7)) {
+				_console->printTosText(836);
+			} else if ((actionObjNum == 38) && (targetObjNum == 58)) {
+				_console->printTosText(849);
+			} else {
+				genericresponse(actionObjNum, targetObjNum, 999);
+			}
+		} else {
+			_console->printTosText(587);
+		}
+	} else {
+		_console->printTosText(462);
+	}
+}
+
+void Darkseed::UseCode::useCrowBar(int16 targetObjNum) {
+	int16 tosIdx = _objectVar.getUseCrowbarTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(5,targetObjNum, tosIdx);
+		}
+	}
+	if (targetObjNum == 42) {
+		if ((_objectVar[42] == 0) || (_objectVar[42] == 4)) {
+			_player->loadAnimations("crowbar.nsp");
+			g_engine->setupOtherNspAnimation(0, 17);
+		} else {
+			_console->printTosText(962);
+		}
+	}
+}
+
+void UseCode::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx) {
+	// TODO implement me!
+}
+void UseCode::putobjunderpillow(int objNum) {
+	// TODO
+}
+
+void UseCode::gancanim() {
+	// TODO
+}
+
+}
\ No newline at end of file
diff --git a/engines/darkseed/usecode.h b/engines/darkseed/usecode.h
new file mode 100644
index 00000000000..27f085dacea
--- /dev/null
+++ b/engines/darkseed/usecode.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 DARKSEED_USECODE_H
+#define DARKSEED_USECODE_H
+
+#include "common/scummsys.h"
+#include "console.h"
+#include "inventory.h"
+#include "objects.h"
+#include "player.h"
+
+namespace Darkseed {
+class UseCode {
+private:
+	Console *_console = nullptr;
+	Player *_player = nullptr;
+	Objects &_objectVar;
+	Inventory &_inventory;
+
+public:
+	UseCode(Console *console, Player *player, Objects &objectVar, Inventory &inventory);
+
+public:
+	void useCode(int objNum);
+	void useCodeGloves(int16 targetObjNum);
+	void useCodeMoney(int16 targetObjNum);
+	void useCodeJournal(int16 actionObjNum, int16 targetObjNum);
+	void useCodeShopItems(int16 actionObjNum, int16 targetObjNum);
+	void useCrowBar(int16 targetObjNum);
+
+private:
+	void gancanim();
+	void putobjunderpillow(int objNum);
+	void genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx);
+};
+} // namespace Darkseed
+
+#endif // DARKSEED_USECODE_H


Commit: 37d64ef80fe8bd59024087ee5637bf018ffaf945
    https://github.com/scummvm/scummvm/commit/37d64ef80fe8bd59024087ee5637bf018ffaf945
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Moved usecode tos lookup tables into seperate header file. Added usecode for newspaper (unused) and library card.

Changed paths:
  A engines/darkseed/usecode_tos_tables.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/inventory.cpp
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h
    engines/darkseed/usecode.cpp
    engines/darkseed/usecode.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index d01018aff4c..117487742f8 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -2055,6 +2055,12 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			case 8:
 				_useCode->useCodeMoney(targetObjNum);
 				break;
+			case 9:
+				_useCode->useCodeNewspaper(targetObjNum);
+				break;
+			case 10:
+				_useCode->useCodeLibraryCard(targetObjNum);
+				break;
 				// TODO lots of extra switch cases here for inventory usages.
 			case 14:
 				_useCode->useCodeGloves(targetObjNum);
@@ -2946,4 +2952,8 @@ void DarkseedEngine::leavepackage() {
 	_objectVar._objectRunningCode[140] = 0;
 }
 
+void DarkseedEngine::libanim(bool mode) {
+	// TODO
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index b2bb83d2c8f..67fc11e600c 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -212,6 +212,8 @@ public:
 	void throwmikeinjail();
 	void runObjects();
 	void getPackageObj(int packageType);
+	void libanim(bool mode);
+
 private:
 	void updateAnimation();
 	void advanceAnimationFrame(int nspAminIdx);
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 21f92214620..16d05b406fa 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -101,7 +101,6 @@ void Darkseed::Inventory::draw() {
 		if (g_engine->_actionMode == _iconList[i] && g_engine->_actionMode > 4) {
 			const Sprite &selectedSprite = g_engine->_baseSprites.getSpriteAt(95);
 			g_engine->_sprites.addSpriteToDrawList(139 + i * 37, 20 - selectedSprite.height / 2, &selectedSprite, 255, selectedSprite.width, selectedSprite.height, false);
-
 		}
 		const Sprite &iconSprite = g_engine->_baseSprites.getSpriteAt(icon);
 		g_engine->_sprites.addSpriteToDrawList(140 + i * 37, 20 - iconSprite.height / 2, &iconSprite, 255, iconSprite.width, iconSprite.height, false);
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index e0988b6b7bd..056a64d2298 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -144,271 +144,6 @@ static constexpr uint16 eyeDescriptionsTbl[] = {
 	671, 321, 163
 };
 
-static constexpr uint16 handDescriptionsTbl[] = {
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	791, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0, 652, 0,
-	729, 0, 0, 0,
-	0, 0, 0, 852,
-	0, 0, 0, 772,
-	0, 0, 846, 0,
-	0, 453, 0, 0,
-	484, 0, 0, 0,
-	0, 0, 0, 706,
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0, 0, 609,
-	611, 607, 605, 603,
-	601, 599, 597, 595,
-	593, 591, 589, 0,
-	0, 0, 0, 355,
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0, 0, 827,
-	839, 0, 798, 807,
-	803, 441, 449, 118,
-	260, 272, 306, 91,
-	162, 137, 377, 399,
-	415, 475, 478, 481,
-	0, 0, 999, 253,
-	0, 0, 171, 183,
-	213, 220, 285, 316,
-	329, 338, 338, 357,
-	516, 527, 534, 0,
-	548, 562, 571, 576,
-	614, 616, 621, 625,
-	637, 0, 642, 644,
-	646, 0, 674, 678,
-	681, 684, 689, 0,
-	726, 747, 0, 760,
-	766, 781, 788, 819,
-	823, 825, 0, 0,
-	863, 0, 881, 888,
-	892, 901, 0, 0,
-	672, 322, 164
-};
-
-static constexpr int16 glovesTextTbl[199] = {
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 525,
-	999, 999, 999, 999,
-	999, 84, 999, 745,
-	999, 999, 84, 999,
-	999, 84, 84, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 84,
-	999, 999, 999, 999,
-	999, 999, 84, 999,
-	84, 999, 84, 49,
-	999, 84, 999, 999,
-	198, 487, 999, 773,
-	999, 0, 999, 84,
-	999, 84, 84, 999,
-	999, 999, 84, 84,
-	84, 999, 999, 84,
-	999, 999, 999, 999,
-	999, 999, 35, 999,
-	84, 999, 999, 999,
-	84, 84, 84, 84,
-	84, 84, 84, 84,
-	84, 84, 84, 84,
-	84, 84, 84, 999,
-	84, 84, 999, 999,
-	999, 999, 999, 999,
-	386, 84, 392, 84,
-	996, 84, 999, 981,
-	999, 796, 999, 808,
-	804, 84, 84, 84,
-	999, 84, 84, 84,
-	999, 998, 991, 84,
-	84, 999, 84, 84,
-	999, 84, 999, 84,
-	999, 999, 84, 185,
-	84, 84, 84, 84,
-	84, 84, 84, 999,
-	999, 84, 84, 999,
-	84, 999, 84, 84,
-	84, 84, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 84, 84,
-	84, 84, 84, 84,
-	84, 84, 999, 999,
-	768, 999, 999, 820,
-	84, 84, 999, 999,
-	999, 999, 999, 84,
-	84, 999, 84, 84,
-	84, 84, 999
-};
-
-static constexpr int16 moneyTextTbl[199] = {
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 169,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	961, 961, 961, 961,
-	961, 999, 999, 999,
-	999, 999, 543, 58,
-	872, 999, 999, 999,
-	206, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 461, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 987,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	560, 999, 999, 999,
-	999, 436, 999, 586,
-	586, 586, 586, 586,
-	586, 586, 586, 586,
-	586, 586, 586, 999,
-	156, 986, 999, 999,
-	999, 999, 999, 999,
-	386, 992, 392, 999,
-	996, 0, 999, 999,
-	999, 999, 999, 999,
-	804, 990, 999, 132,
-	999, 281, 86, 111,
-	999, 998, 991, 402,
-	417, 999, 999, 999,
-	999, 303, 0, 999,
-	999, 999, 999, 190,
-	217, 227, 290, 999,
-	999, 999, 999, 999,
-	906, 531, 999, 999,
-	550, 999, 573, 577,
-	999, 999, 999, 633,
-	633, 633, 633, 633,
-	633, 999, 999, 999,
-	988, 687, 999, 999,
-	999, 999, 999, 999,
-	999, 785, 999, 999,
-	980, 982, 999, 999,
-	865, 999, 885, 999,
-	999, 999, 989, 999,
-	999, 326, 999
-};
-
-static constexpr int16 crowBarTextTbl[199] = {
-	999, 999, 999, 999,
-	999, 999, 999, 518,
-	999, 999, 999, 524,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	518, 518, 518, 518,
-	518, 757, 0, 999,
-	999, 999, 999, 51,
-	999, 249, 999, 999,
-	999, 485, 999, 999,
-	999, 999, 979, 411,
-	999, 456, 999, 999,
-	999, 999, 470, 470,
-	470, 999, 999, 987,
-	999, 999, 999, 999,
-	999, 999, 36, 832,
-	999, 999, 999, 999,
-	999, 433, 999, 583,
-	583, 583, 583, 583,
-	583, 583, 583, 583,
-	583, 583, 583, 999,
-	999, 986, 999, 360,
-	999, 999, 999, 999,
-	386, 992, 392, 999,
-	996, 753, 984, 981,
-	999, 999, 999, 808,
-	804, 990, 999, 999,
-	22, 67, 85, 100,
-	999, 998, 379, 999,
-	999, 999, 479, 479,
-	999, 995, 999, 999,
-	999, 999, 173, 999,
-	215, 224, 286, 999,
-	330, 342, 349, 360,
-	999, 999, 999, 999,
-	550, 999, 999, 579,
-	999, 999, 999, 628,
-	628, 628, 628, 628,
-	628, 999, 999, 999,
-	988, 686, 999, 999,
-	999, 999, 999, 762,
-	999, 782, 999, 983,
-	980, 982, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 989, 999,
-	999, 324, 999
-};
-
-static constexpr int16 journalTextTbl[199] = {
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 486, 999,
-	868, 999, 999, 999,
-	196, 486, 999, 999,
-	999, 999, 999, 999,
-	999, 455, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 987,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 986, 999, 999,
-	999, 999, 999, 999,
-	386, 992, 392, 999,
-	996, 999, 999, 981,
-	999, 999, 999, 999,
-	804, 999, 999, 999,
-	999, 999, 82, 93,
-	999, 998, 991, 999,
-	999, 999, 999, 999,
-	999, 299, 999, 999,
-	999, 999, 999, 999,
-	999, 222, 146, 309,
-	999, 999, 999, 999,
-	486, 999, 999, 999,
-	550, 999, 999, 577,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	988, 999, 999, 999,
-	999, 999, 999, 999,
-	999, 999, 999, 999,
-	980, 982, 999, 864,
-	999, 999, 999, 999,
-	999, 999, 989, 999,
-	999, 994, 999
-};
-
 static constexpr char objectNameTbl[199][21] = {
 	"Nothing.",
 	"Box",
@@ -611,9 +346,6 @@ static constexpr char objectNameTbl[199][21] = {
 	"bed bottom",
 };
 
-
-
-
 int Darkseed::Objects::getEyeDescriptionTosIdx(uint16 objNum) {
 	if (objNum >= MAX_OBJECTS) {
 		error("getEyeDescriptionTosIdx: Object Index out of range! %d", objNum);
@@ -621,41 +353,6 @@ int Darkseed::Objects::getEyeDescriptionTosIdx(uint16 objNum) {
 	return eyeDescriptionsTbl[objNum];
 }
 
-int Darkseed::Objects::getHandDescriptionTosIdx(uint16 objNum) {
-	if (objNum >= MAX_OBJECTS) {
-		error("getHandDescriptionTosIdx: Object Index out of range! %d", objNum);
-	}
-	return handDescriptionsTbl[objNum];
-}
-
-int16 Darkseed::Objects::getUseGlovesTosIdx(uint16 objNum) {
-	if (objNum >= MAX_OBJECTS) {
-		error("getUseGlovesTosIdx: Object Index out of range! %d", objNum);
-	}
-	return glovesTextTbl[objNum];
-}
-
-int16 Darkseed::Objects::getUseMoneyTosIdx(uint16 objNum) {
-	if (objNum >= MAX_OBJECTS) {
-		error("getUseMoneyTosIdx: Object Index out of range! %d", objNum);
-	}
-	return moneyTextTbl[objNum];
-}
-
-int16 Darkseed::Objects::getUseCrowbarTosIdx(uint16 objNum) {
-	if (objNum >= MAX_OBJECTS) {
-		error("getUseCrowbarTosIdx: Object Index out of range! %d", objNum);
-	}
-	return crowBarTextTbl[objNum];
-}
-
-int16 Darkseed::Objects::getUseJournalTosIdx(uint16 objNum) {
-	if (objNum >= MAX_OBJECTS) {
-		error("getUseJournalTosIdx: Object Index out of range! %d", objNum);
-	}
-	return journalTextTbl[objNum];
-}
-
 int Darkseed::Objects::getMoveObjectRoom(uint16 idx) {
 	if (idx >= MAX_OBJECTS) {
 		error("getMoveObjectRoom: index out of range.");
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 1e785715770..5492bdac142 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -59,11 +59,6 @@ public:
 	void setMoveObjectPosition(uint8 objIdx, const Common::Point &newPoint);
 	void setMoveObjectX(uint8 objIdx, int16 xPos);
 	int getEyeDescriptionTosIdx(uint16 objNum);
-	int getHandDescriptionTosIdx(uint16 objNum);
-	int16 getUseGlovesTosIdx(uint16 objNum);
-	int16 getUseMoneyTosIdx(uint16 objNum);
-	int16 getUseCrowbarTosIdx(uint16 objNum);
-	int16 getUseJournalTosIdx(uint16 objNum);
 
 	int getMoveObjectRoom(uint16 idx);
 	void setMoveObjectRoom(uint16 idx, uint8 value);
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 8c816970ff9..38faf0ed301 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -21,6 +21,7 @@
 
 #include "darkseed/darkseed.h"
 #include "darkseed/usecode.h"
+#include "darkseed/usecode_tos_tables.h"
 #include "common/debug.h"
 
 namespace Darkseed {
@@ -28,6 +29,48 @@ namespace Darkseed {
 UseCode::UseCode(Console *console, Player *player, Objects &objectVar, Inventory &inventory) : _console(console), _player(player), _objectVar(objectVar), _inventory(inventory) {}
 
 
+int Darkseed::UseCode::getHandDescriptionTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getHandDescriptionTosIdx: Object Index out of range! %d", objNum);
+	}
+	return handDescriptionsTbl[objNum];
+}
+
+int16 Darkseed::UseCode::getUseGlovesTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseGlovesTosIdx: Object Index out of range! %d", objNum);
+	}
+	return glovesTextTbl[objNum];
+}
+
+int16 Darkseed::UseCode::getUseMoneyTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseMoneyTosIdx: Object Index out of range! %d", objNum);
+	}
+	return moneyTextTbl[objNum];
+}
+
+int16 Darkseed::UseCode::getUseCrowbarTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseCrowbarTosIdx: Object Index out of range! %d", objNum);
+	}
+	return crowBarTextTbl[objNum];
+}
+
+int16 Darkseed::UseCode::getUseJournalTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseJournalTosIdx: Object Index out of range! %d", objNum);
+	}
+	return journalTextTbl[objNum];
+}
+
+int16 Darkseed::UseCode::getUseLibraryCardTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseLibraryCardTosIdx: Object Index out of range! %d", objNum);
+	}
+	return libraryCardTextTbl[objNum];
+}
+
 void Darkseed::UseCode::useCode(int objNum) {
 	debug("useCode: objNum = %d", objNum);
 	
@@ -179,7 +222,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 		return;
 	}
 	if (objNum != 7 && objNum != 36 && objNum != 37 && objNum != 38 && objNum != 39 && objNum != 40) {
-		int handTosIdx = _objectVar.getHandDescriptionTosIdx(objNum);
+		int handTosIdx = getHandDescriptionTosIdx(objNum);
 		if (handTosIdx != 0 && handTosIdx < 979) {
 			_console->printTosText(handTosIdx);
 		} else if (handTosIdx > 978) {
@@ -563,7 +606,7 @@ void Darkseed::UseCode::useCodeGloves(int16 targetObjNum) {
 		return;
 	}
 
-	int16 tosIdx = _objectVar.getUseGlovesTosIdx(targetObjNum);
+	int16 tosIdx = getUseGlovesTosIdx(targetObjNum);
 	if (tosIdx != 0) {
 		if (tosIdx < 979) {
 			_console->printTosText(tosIdx);
@@ -582,7 +625,7 @@ void Darkseed::UseCode::useCodeGloves(int16 targetObjNum) {
 
 void Darkseed::UseCode::useCodeMoney(int16 targetObjNum) {
 	if ((targetObjNum != 138) && (targetObjNum != 152)) {
-		int16 tosIdx = _objectVar.getUseMoneyTosIdx(targetObjNum);
+		int16 tosIdx = getUseMoneyTosIdx(targetObjNum);
 		if (tosIdx == 0) {
 			if (targetObjNum == 7) {
 				_console->printTosText(961);
@@ -614,7 +657,7 @@ void Darkseed::UseCode::useCodeJournal(int16 actionObjNum, int16 targetObjNum) {
 	} else if ((actionObjNum == 6) && (targetObjNum == 136)) {
 		_console->printTosText(999);
 	} else {
-		int16 tosIdx = _objectVar.getUseJournalTosIdx(targetObjNum);
+		int16 tosIdx = getUseJournalTosIdx(targetObjNum);
 		if (tosIdx != 0) {
 			if (tosIdx < 979) {
 				_console->printTosText(tosIdx);
@@ -879,7 +922,7 @@ void Darkseed::UseCode::useCodeShopItems(int16 actionObjNum, int16 targetObjNum)
 }
 
 void Darkseed::UseCode::useCrowBar(int16 targetObjNum) {
-	int16 tosIdx = _objectVar.getUseCrowbarTosIdx(targetObjNum);
+	int16 tosIdx = getUseCrowbarTosIdx(targetObjNum);
 	if (tosIdx != 0) {
 		if (tosIdx < 979) {
 			_console->printTosText(tosIdx);
@@ -897,6 +940,100 @@ void Darkseed::UseCode::useCrowBar(int16 targetObjNum) {
 	}
 }
 
+// All this code is unused as you cannot add the newspaper to your inventory. :( I wonder why they didn't add it. It is also missing the inventory icon image.
+void UseCode::useCodeNewspaper(int16 targetObjNum) {
+	if (targetObjNum == 124) {
+		_console->printTosText(26);
+	} else if (targetObjNum == 126) {
+		_console->printTosText(82);
+	} else if (targetObjNum == 127) {
+		_console->printTosText(112);
+	} else if (targetObjNum == 123) {
+		_console->printTosText(133);
+	} else if (targetObjNum == 100) {
+		_console->printTosText(157);
+	} else if (targetObjNum == 52) {
+		_console->printTosText(207);
+	} else if (targetObjNum == 145) {
+		_console->printTosText(222);
+	} else if (targetObjNum == 124) { // Bug in the original engine. This code is never reachable
+		_console->printTosText(268); // this is a duplicate of tosId: 26
+	} else if (targetObjNum == 137) {
+		_console->printTosText(299);
+	} else if (targetObjNum == 147) {
+		_console->printTosText(309);
+	} else if (targetObjNum == 197) {
+		_console->printTosText(993);
+	} else if (targetObjNum == 150) {
+		_console->printTosText(352);
+	} else if ((targetObjNum == 103) || (targetObjNum == 151)) {
+		_console->printTosText(367);
+	} else if (targetObjNum == 108) {
+		_console->printTosText(386);
+	} else if (targetObjNum == 110) {
+		_console->printTosText(392);
+	} else if (targetObjNum == 61) {
+		_console->printTosText(455);
+	} else if (targetObjNum == 53) {
+		_console->printTosText(490);
+	} else if (targetObjNum == 156) {
+		_console->printTosText(550);
+	} else if (targetObjNum == 159) {
+		_console->printTosText(577);
+	} else if (targetObjNum == 113) {
+		_console->printTosText(753);
+	} else if (targetObjNum == 120) {
+		_console->printTosText(804);
+	} else if (targetObjNum == 116) {
+		_console->printTosText(832);
+	} else if (targetObjNum == 79) {
+		_console->printTosText(834);
+	} else if (targetObjNum == 185) {
+		genericresponse(9, 185, 982);
+	} else if (targetObjNum == 184) {
+		genericresponse(9, 184, 980);
+	} else if (targetObjNum == 71) {
+		genericresponse(9, 71, 987);
+	} else if (targetObjNum == 101) {
+		genericresponse(9, 101, 986);
+	} else if (targetObjNum == 172) {
+		genericresponse(9, 172, 988);
+	} else if (targetObjNum == 194) {
+		genericresponse(9, 194, 989);
+	} else if (targetObjNum == 121) {
+		genericresponse(9, 121, 990);
+	} else if (targetObjNum == 109) {
+		genericresponse(9, 109, 992);
+	} else if (targetObjNum == 130) {
+		genericresponse(9, 130, 991);
+	} else if (targetObjNum == 129) {
+		genericresponse(9, 129, 998);
+	} else if (targetObjNum == 112) {
+		genericresponse(9, 112, 996);
+	} else {
+		genericresponse(9, targetObjNum, 999);
+	}
+}
+
+void UseCode::useCodeLibraryCard(int16 targetObjNum) {
+	int16 tosIdx = getUseLibraryCardTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(10, targetObjNum, tosIdx);
+		}
+	}
+	if (targetObjNum == 46) {
+		g_engine->_cursor.setCursorType(Pointer);
+		_inventory.removeItem(10);
+		g_engine->libanim(false);
+		_objectVar[10] = 1;
+	} else if (targetObjNum == 113) {
+		putobjunderpillow(10);
+	}
+}
+
 void UseCode::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx) {
 	// TODO implement me!
 }
diff --git a/engines/darkseed/usecode.h b/engines/darkseed/usecode.h
index 27f085dacea..fa3e980160f 100644
--- a/engines/darkseed/usecode.h
+++ b/engines/darkseed/usecode.h
@@ -46,8 +46,17 @@ public:
 	void useCodeJournal(int16 actionObjNum, int16 targetObjNum);
 	void useCodeShopItems(int16 actionObjNum, int16 targetObjNum);
 	void useCrowBar(int16 targetObjNum);
+	void useCodeNewspaper(int16 targetObjNum);
+	void useCodeLibraryCard(int16 targetObjNum);
 
 private:
+	int getHandDescriptionTosIdx(uint16 objNum);
+	int16 getUseGlovesTosIdx(uint16 objNum);
+	int16 getUseMoneyTosIdx(uint16 objNum);
+	int16 getUseCrowbarTosIdx(uint16 objNum);
+	int16 getUseJournalTosIdx(uint16 objNum);
+	int16 getUseLibraryCardTosIdx(uint16 objNum);
+
 	void gancanim();
 	void putobjunderpillow(int objNum);
 	void genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx);
diff --git a/engines/darkseed/usecode_tos_tables.h b/engines/darkseed/usecode_tos_tables.h
new file mode 100644
index 00000000000..2bcb2941953
--- /dev/null
+++ b/engines/darkseed/usecode_tos_tables.h
@@ -0,0 +1,346 @@
+/* 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 DARKSEED_USECODE_TOS_TABLES_H
+#define DARKSEED_USECODE_TOS_TABLES_H
+
+namespace Darkseed {
+static constexpr uint16 handDescriptionsTbl[] = {
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	791, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 652, 0,
+	729, 0, 0, 0,
+	0, 0, 0, 852,
+	0, 0, 0, 772,
+	0, 0, 846, 0,
+	0, 453, 0, 0,
+	484, 0, 0, 0,
+	0, 0, 0, 706,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 609,
+	611, 607, 605, 603,
+	601, 599, 597, 595,
+	593, 591, 589, 0,
+	0, 0, 0, 355,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 827,
+	839, 0, 798, 807,
+	803, 441, 449, 118,
+	260, 272, 306, 91,
+	162, 137, 377, 399,
+	415, 475, 478, 481,
+	0, 0, 999, 253,
+	0, 0, 171, 183,
+	213, 220, 285, 316,
+	329, 338, 338, 357,
+	516, 527, 534, 0,
+	548, 562, 571, 576,
+	614, 616, 621, 625,
+	637, 0, 642, 644,
+	646, 0, 674, 678,
+	681, 684, 689, 0,
+	726, 747, 0, 760,
+	766, 781, 788, 819,
+	823, 825, 0, 0,
+	863, 0, 881, 888,
+	892, 901, 0, 0,
+	672, 322, 164
+};
+
+static constexpr int16 glovesTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 525,
+	999, 999, 999, 999,
+	999, 84, 999, 745,
+	999, 999, 84, 999,
+	999, 84, 84, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 84,
+	999, 999, 999, 999,
+	999, 999, 84, 999,
+	84, 999, 84, 49,
+	999, 84, 999, 999,
+	198, 487, 999, 773,
+	999, 0, 999, 84,
+	999, 84, 84, 999,
+	999, 999, 84, 84,
+	84, 999, 999, 84,
+	999, 999, 999, 999,
+	999, 999, 35, 999,
+	84, 999, 999, 999,
+	84, 84, 84, 84,
+	84, 84, 84, 84,
+	84, 84, 84, 84,
+	84, 84, 84, 999,
+	84, 84, 999, 999,
+	999, 999, 999, 999,
+	386, 84, 392, 84,
+	996, 84, 999, 981,
+	999, 796, 999, 808,
+	804, 84, 84, 84,
+	999, 84, 84, 84,
+	999, 998, 991, 84,
+	84, 999, 84, 84,
+	999, 84, 999, 84,
+	999, 999, 84, 185,
+	84, 84, 84, 84,
+	84, 84, 84, 999,
+	999, 84, 84, 999,
+	84, 999, 84, 84,
+	84, 84, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 84, 84,
+	84, 84, 84, 84,
+	84, 84, 999, 999,
+	768, 999, 999, 820,
+	84, 84, 999, 999,
+	999, 999, 999, 84,
+	84, 999, 84, 84,
+	84, 84, 999
+};
+
+static constexpr int16 moneyTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 169,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	961, 961, 961, 961,
+	961, 999, 999, 999,
+	999, 999, 543, 58,
+	872, 999, 999, 999,
+	206, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 461, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	560, 999, 999, 999,
+	999, 436, 999, 586,
+	586, 586, 586, 586,
+	586, 586, 586, 586,
+	586, 586, 586, 999,
+	156, 986, 999, 999,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 0, 999, 999,
+	999, 999, 999, 999,
+	804, 990, 999, 132,
+	999, 281, 86, 111,
+	999, 998, 991, 402,
+	417, 999, 999, 999,
+	999, 303, 0, 999,
+	999, 999, 999, 190,
+	217, 227, 290, 999,
+	999, 999, 999, 999,
+	906, 531, 999, 999,
+	550, 999, 573, 577,
+	999, 999, 999, 633,
+	633, 633, 633, 633,
+	633, 999, 999, 999,
+	988, 687, 999, 999,
+	999, 999, 999, 999,
+	999, 785, 999, 999,
+	980, 982, 999, 999,
+	865, 999, 885, 999,
+	999, 999, 989, 999,
+	999, 326, 999
+};
+
+static constexpr int16 crowBarTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 518,
+	999, 999, 999, 524,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	518, 518, 518, 518,
+	518, 757, 0, 999,
+	999, 999, 999, 51,
+	999, 249, 999, 999,
+	999, 485, 999, 999,
+	999, 999, 979, 411,
+	999, 456, 999, 999,
+	999, 999, 470, 470,
+	470, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 36, 832,
+	999, 999, 999, 999,
+	999, 433, 999, 583,
+	583, 583, 583, 583,
+	583, 583, 583, 583,
+	583, 583, 583, 999,
+	999, 986, 999, 360,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 753, 984, 981,
+	999, 999, 999, 808,
+	804, 990, 999, 999,
+	22, 67, 85, 100,
+	999, 998, 379, 999,
+	999, 999, 479, 479,
+	999, 995, 999, 999,
+	999, 999, 173, 999,
+	215, 224, 286, 999,
+	330, 342, 349, 360,
+	999, 999, 999, 999,
+	550, 999, 999, 579,
+	999, 999, 999, 628,
+	628, 628, 628, 628,
+	628, 999, 999, 999,
+	988, 686, 999, 999,
+	999, 999, 999, 762,
+	999, 782, 999, 983,
+	980, 982, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 989, 999,
+	999, 324, 999
+};
+
+static constexpr int16 journalTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 486, 999,
+	868, 999, 999, 999,
+	196, 486, 999, 999,
+	999, 999, 999, 999,
+	999, 455, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 986, 999, 999,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 999, 999, 981,
+	999, 999, 999, 999,
+	804, 999, 999, 999,
+	999, 999, 82, 93,
+	999, 998, 991, 999,
+	999, 999, 999, 999,
+	999, 299, 999, 999,
+	999, 999, 999, 999,
+	999, 222, 146, 309,
+	999, 999, 999, 999,
+	486, 999, 999, 999,
+	550, 999, 999, 577,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	988, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	980, 982, 999, 864,
+	999, 999, 999, 999,
+	999, 999, 989, 999,
+	999, 994, 999
+};
+
+static constexpr int16 libraryCardTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 0, 56,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	559, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	154, 999, 999, 999,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 0, 999, 981,
+	999, 999, 999, 999,
+	804, 443, 999, 999,
+	999, 999, 999, 999,
+	999, 998, 991, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 177, 999,
+	999, 222, 288, 309,
+	999, 999, 999, 999,
+	519, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 499, 999,
+	999, 993, 999
+};
+
+} // namespace Darkseed
+
+#endif // DARKSEED_USECODE_TOS_TABLES_H


Commit: d3f80d0a02d85ab4ae39e45af66ae651090d2dd0
    https://github.com/scummvm/scummvm/commit/d3f80d0a02d85ab4ae39e45af66ae651090d2dd0
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Add librarian sequence

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 117487742f8..9d868fffdb2 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -176,9 +176,7 @@ void DarkseedEngine::gameloop() {
 			if (_isLeftMouseClicked || _isRightMouseClicked) {
 				_isRightMouseClicked = false;
 				_isLeftMouseClicked = false;
-				delete _fullscreenPic;
-				_fullscreenPic = nullptr;
-				_room->restorePalette();
+				removeFullscreenPic();
 			}
 		}
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
@@ -2348,7 +2346,7 @@ void DarkseedEngine::showFullscreenPic(const Common::Path &filename) {
 	debug("Loaded %s", filePathStr.c_str());
 	Common::Path palFilename = Common::Path(filePathStr.substr(0, filePathStr.size() - 4) + ".pal");
 	Pal pal;
-	pal.load(palFilename);
+	pal.load(g_engine->getPictureFilePath(palFilename));
 }
 
 void DarkseedEngine::keeperanim() {
@@ -2952,8 +2950,88 @@ void DarkseedEngine::leavepackage() {
 	_objectVar._objectRunningCode[140] = 0;
 }
 
-void DarkseedEngine::libanim(bool mode) {
-	// TODO
+static constexpr uint8 libList[100] = {
+	5, 6, 7, 8,
+	9, 10, 9, 8,
+	7, 6, 5, 6,
+	7, 6, 7, 8,
+	7, 6, 5, 6,
+	5, 6, 7, 8,
+	9, 10, 9, 8,
+	7, 6, 5, 6,
+	7, 6, 7, 8,
+	7, 6, 5, 6,
+	5, 6, 7, 8,
+	9, 10, 9, 8,
+	7, 6, 5, 6,
+	5, 6, 7, 6,
+	7, 8, 7, 6,
+	5, 6, 7, 6,
+	7, 8, 7, 6,
+	5, 6, 5, 6,
+	5, 6, 7, 6,
+	7, 8, 7, 6,
+	5, 6, 7, 8,
+	9, 10, 9, 8,
+	7, 6, 5, 6,
+	7, 8, 9, 10,
+	9, 8, 7, 6
+};
+
+void DarkseedEngine::libanim(bool pickingUpReservedBook) {
+	_player->loadAnimations("libparts.nsp");
+	showFullscreenPic("libinlib.pic");
+
+	_console->printTosText(pickingUpReservedBook ? 928 : 924);
+
+	spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0).frameDuration[0];
+	uint8 lipsIdx = 0;
+	while (_sound->isPlayingSpeech()) {
+		_sprites.clearSpriteDrawList();
+		_frame.draw();
+		if (_fullscreenPic) {
+			_fullscreenPic->draw(0x45, 0x28);
+		}
+		_console->draw();
+
+		advanceAnimationFrame(0);
+		const Sprite &eyesSprite = _player->_animations.getSpriteAt( _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]);
+		g_engine->_sprites.addSpriteToDrawList(255, 114, &eyesSprite, 255, eyesSprite.width, eyesSprite.height, false);
+		advanceAnimationFrame(1);
+
+		const Sprite &mouthSprite = _player->_animations.getSpriteAt(libList[lipsIdx]);
+		g_engine->_sprites.addSpriteToDrawList(255, 154, &mouthSprite, 255, mouthSprite.width, mouthSprite.height, false);
+
+		_sprites.drawSprites();
+
+		_screen->makeAllDirty();
+		_screen->update();
+
+		lipsIdx++;
+		if (lipsIdx == 100) {
+			lipsIdx = 0;
+		}
+
+		for (int i = 0; i < 6; i++) {
+			wait();
+		}
+	}
+
+	removeFullscreenPic();
+
+	if (pickingUpReservedBook) {
+		_objectVar[49] = 1;
+		_objectVar[62] = 0;
+		playCutscene("G");
+	}
+}
+
+void DarkseedEngine::removeFullscreenPic() {
+	if (_fullscreenPic) {
+		delete _fullscreenPic;
+		_fullscreenPic = nullptr;
+		_room->restorePalette();
+	}
 }
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 67fc11e600c..6308abd07d9 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -212,7 +212,7 @@ public:
 	void throwmikeinjail();
 	void runObjects();
 	void getPackageObj(int packageType);
-	void libanim(bool mode);
+	void libanim(bool pickingUpReservedBook);
 
 private:
 	void updateAnimation();
@@ -242,6 +242,8 @@ private:
 	void rundrekethsequence();
 	void delthrowstick(int16 spriteNum);
 	void leavepackage();
+
+	void removeFullscreenPic();
 };
 
 extern DarkseedEngine *g_engine;


Commit: 6c4649fc13a5bc3ccdcf2dcb462711995247e283
    https://github.com/scummvm/scummvm/commit/6c4649fc13a5bc3ccdcf2dcb462711995247e283
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Add bobbypin, keys, mirrorShard, binoculars and shovel usecode

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/usecode.cpp
    engines/darkseed/usecode.h
    engines/darkseed/usecode_tos_tables.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 9d868fffdb2..ee79075eafb 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1174,23 +1174,22 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 				}
 				if (otherNspAnimationType_maybe == 39 || otherNspAnimationType_maybe == 59 ||
 					 otherNspAnimationType_maybe == 60 || otherNspAnimationType_maybe == 61) {
-					error("anim: 39 || 59..61"); // TODO
-//					uVar1 = (uint)BYTE_ARRAY_2c85_41e7[1];
-//					uVar7 = *(undefined2 *)((int)CPlayerSpriteWidthTbl + uVar1 * 2);
-//					uVar4 = *(undefined2 *)((int)CPlayerSpriteHeightTbl + uVar1 * 2);
-//					calculateScaledPlayerSpriteDimensions(uVar7,uVar4,playerSpriteY_maybe);
-//					addSpriteToDraw(playerSpriteX_maybe - (_curPlayerSpriteWidth & 0xff) / 2,
-//									playerSpriteY_maybe - (_curPlayerSpriteHeight_maybe & 0xff),uVar7,uVar4,
-//									*(undefined2 *)((int)CPlayerSpritePtrTbl + uVar1 * 4),
-//									*(undefined2 *)((int)&CPlayerSpritePtrTbl[0].Offset + uVar1 * 4),240 - playerSpriteY_maybe ,
-//									_curPlayerSpriteWidth,_curPlayerSpriteHeight_maybe,_player_sprite_related_2c85_82f3);
-//					if ((otherNspAnimationType_maybe == 0x3c) || (otherNspAnimationType_maybe == 0x3d)) {
-//						sprite_y_scaling_threshold_maybe = 0xf0;
-//						drawInventory();
-//						updateScreen();
-//						DAT_2c85_985d = cursorYPosition;
-//						return;
-//					}
+					const Sprite &playerSprite = _player->getSprite(26);
+					_room->calculateScaledSpriteDimensions(playerSprite.width, playerSprite.height, _player->_position.y);
+					_sprites.addSpriteToDrawList(
+						_player->_position.x,
+						_player->_position.y - scaledSpriteHeight,
+						&playerSprite,
+						240 - _player->_position.y,
+						scaledSpriteWidth,
+						scaledSpriteHeight, player_sprite_related_2c85_82f3);
+					if (otherNspAnimationType_maybe == 60 || otherNspAnimationType_maybe == 61) {
+						sprite_y_scaling_threshold_maybe = 240;
+//						DrawObjectsMenu(); TODO do we need this logic?
+//						UpdateAllVideo();
+//						*(undefined2 *)&_LastTickCursorY = *(undefined2 *)&_CursorY;
+						return;
+					}
 				}
 //				iVar9 = *(int *)((int)otherNspWidthTbl + _player->_frameIdx * 2);
 //				iVar8 = *(int *)((int)&otherNspHeightTbl + _player->_frameIdx * 2);
@@ -1963,6 +1962,18 @@ void DarkseedEngine::updateAnimation() {
 			_player->_direction = 2;
 		}
 		break;
+	case 59: // use shard on mirror
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+		} else {
+			_player->_direction = 1;
+			_player->updateSprite();
+		}
+		if (animFrameChanged && _player->_frameIdx == 3) {
+			playSound(26, 5, -1);
+		}
+		break;
 	case 65:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -2059,10 +2070,25 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			case 10:
 				_useCode->useCodeLibraryCard(targetObjNum);
 				break;
-				// TODO lots of extra switch cases here for inventory usages.
+			case 11:
+				_useCode->useCodeBobbyPin(targetObjNum);
+				break;
+			case 13:
+			case 26:
+				_useCode->useCodeKeys(_actionMode, targetObjNum);
+				break;
 			case 14:
 				_useCode->useCodeGloves(targetObjNum);
 				break;
+			case 15:
+				_useCode->useCodeMirrorShard(targetObjNum);
+				break;
+			case 16:
+				_useCode->useCodeBinoculars(targetObjNum);
+				break;
+			case 17:
+				_useCode->useCodeShovel(targetObjNum);
+				break;
 			// TODO lots of extra switch cases here for inventory usages.
 			default:
 				break;
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 38faf0ed301..cba087c6b3a 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -71,6 +71,34 @@ int16 Darkseed::UseCode::getUseLibraryCardTosIdx(uint16 objNum) {
 	return libraryCardTextTbl[objNum];
 }
 
+int16 UseCode::getUseBobbyPinTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseBobbyPinTosIdx: Object Index out of range! %d", objNum);
+	}
+	return bobbyPinTextTbl[objNum];
+}
+
+int16 UseCode::getUseKeysTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseKeysTosIdx: Object Index out of range! %d", objNum);
+	}
+	return keysTextTbl[objNum];
+}
+
+int16 UseCode::getUseBinocularsTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseBinocularsTosIdx: Object Index out of range! %d", objNum);
+	}
+	return binocularsTextTbl[objNum];
+}
+
+int16 UseCode::getUseShovelTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseShovelTosIdx: Object Index out of range! %d", objNum);
+	}
+	return shovelTextTbl[objNum];
+}
+
 void Darkseed::UseCode::useCode(int objNum) {
 	debug("useCode: objNum = %d", objNum);
 	
@@ -1034,15 +1062,175 @@ void UseCode::useCodeLibraryCard(int16 targetObjNum) {
 	}
 }
 
+void UseCode::useCodeBobbyPin(int16 targetObjNum) {
+	int16 tosIdx = getUseBobbyPinTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(11, targetObjNum, tosIdx);
+		}
+	}
+
+	if (targetObjNum == 190) {
+		if (_objectVar[190] == 0) {
+			_console->printTosText(882);
+			g_engine->playSound(18,5,-1);
+			_objectVar[190] = 1;
+		} else if (_objectVar[190] == 1) {
+			_console->printTosText(883);
+			g_engine->playSound(18,5,-1);
+			_objectVar[190] = 2;
+		} else {
+			_console->printTosText(963);
+		}
+	} else if (targetObjNum == 48) {
+		if (_objectVar[48] == 0) {
+			_objectVar[48] = 1;
+			_console->printTosText(869);
+			g_engine->_room->removeObjectFromRoom(48);
+			_inventory.addItem(21);
+			_inventory.removeItem(11);
+		}
+	} else if (targetObjNum == 113) {
+		putobjunderpillow(11);
+	}
+}
+
+void UseCode::useCodeKeys(int16 actionObjNum, int16 targetObjNum) {
+	if ((actionObjNum == 13) && (targetObjNum == 151)) {
+		_objectVar[151] = 1;
+		g_engine->showFullscreenPic("cclock02.pic");
+	} else if (targetObjNum == 71) {
+		if (actionObjNum == 26) {
+			if (_objectVar[44] == 0) {
+				g_engine->playSound(16, 5, -1);
+				_console->printTosText(708);
+			} else if (_objectVar[71] == 0) {
+				g_engine->playSound(11, 5, -1);
+				_objectVar[71] = 2;
+				_console->printTosText(709);
+				_inventory.removeItem(26);
+			}
+		} else {
+			_console->printTosText(707);
+		}
+	} else if (targetObjNum == 113) {
+		putobjunderpillow(actionObjNum);
+	} else if ((actionObjNum == 26) &&
+			   ((((targetObjNum == 175 || (targetObjNum == 62)) || (targetObjNum == 176)) || (targetObjNum == 44)))) {
+		_console->printTosText(720);
+	} else if ((actionObjNum == 26) && (targetObjNum == 191)) {
+		_console->printTosText(890);
+	} else {
+		int16 tosIdx = getUseKeysTosIdx(targetObjNum);
+		if (tosIdx != 0) {
+			if (tosIdx < 979) {
+				_console->printTosText(tosIdx);
+			} else {
+				genericresponse(actionObjNum, targetObjNum, tosIdx);
+			}
+		}
+	}
+}
+
+void UseCode::useCodeMirrorShard(int16 targetObjNum) {
+	if (targetObjNum == 137) {
+		_console->printTosText(298);
+		_inventory.removeItem(15);
+		_objectVar[137] = 1;
+		_player->loadAnimations("mglow.nsp");
+		g_engine->setupOtherNspAnimation(0, 59);
+	} else if (targetObjNum == 124) {
+		_console->printTosText(20);
+	} else if (targetObjNum == 129) {
+		genericresponse(15, 129, 998);
+	} else if (targetObjNum == 23 || targetObjNum == 103 || targetObjNum == 170) {
+		genericresponse(15, targetObjNum, 999);
+	} else if (targetObjNum == 52) {
+		_console->printTosText(197);
+	} else if (targetObjNum == 112) {
+		_console->printTosText(235);
+	} else if (targetObjNum == 130) {
+		genericresponse(15, 130, 991);
+	} else if (targetObjNum == 108) {
+		_console->printTosText(386);
+	} else if (targetObjNum == 110) {
+		_console->printTosText(392);
+	} else {
+		genericresponse(15, targetObjNum, 997);
+	}
+}
+
+void UseCode::useCodeBinoculars(int16 targetObjNum) {
+	int16 tosIdx = getUseBinocularsTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(16, targetObjNum, tosIdx);
+		}
+	}
+	if ((targetObjNum == 162) && (g_engine->_room->_roomNumber == 36)) {
+		_objectVar[162] = 1;
+		g_engine->showFullscreenPic("bnoc.pic");
+	}
+	if ((targetObjNum == 118) && (g_engine->_room->_roomNumber == 43)) {
+		g_engine->showFullscreenPic("darkbnoc.pic");
+		_console->printTosText(800);
+	}
+}
+
+void UseCode::useCodeShovel(int16 targetObjNum) {
+	int16 tosIdx = getUseShovelTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(17, targetObjNum, tosIdx);
+		}
+	}
+	if (targetObjNum > 86 && targetObjNum < 99) {
+		startdigging(targetObjNum + -87);
+	}
+}
+
 void UseCode::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx) {
 	// TODO implement me!
 }
+
 void UseCode::putobjunderpillow(int objNum) {
-	// TODO
+	_objectVar[113] = 1;
+	_inventory.removeItem(objNum);
+	_objectVar.setMoveObjectRoom(objNum, 250);
+	g_engine->_cursor.setCursorType(Pointer);
+	_console->printTosText(946);
+	_console->addToCurrentLine(Common::String::format("%s", g_engine->_objectVar.getObjectName(objNum)));
+	_console->printTosText(947);
 }
 
 void UseCode::gancanim() {
 	// TODO
 }
 
+static constexpr bool diggingxflipTbl[12] = {
+	true, true, true, true,
+	true, false, false, true,
+	true, true, true, false
+};
+
+void UseCode::startdigging(int16 targetObjNum) {
+	if (targetObjNum == 0) {
+		_player->loadAnimations("lgravedg.nsp");
+		g_engine->setupOtherNspAnimation(0,21);
+	} else if (diggingxflipTbl[targetObjNum]) {
+		_player->loadAnimations("lgravedg.nsp");
+		g_engine->setupOtherNspAnimation(0,4);
+	} else {
+		_player->loadAnimations("rgravedg.nsp");
+		g_engine->setupOtherNspAnimation(0,22);
+	}
+	g_engine->playSound(14,5,-1);
+}
+
 }
\ No newline at end of file
diff --git a/engines/darkseed/usecode.h b/engines/darkseed/usecode.h
index fa3e980160f..076c57c1503 100644
--- a/engines/darkseed/usecode.h
+++ b/engines/darkseed/usecode.h
@@ -48,6 +48,11 @@ public:
 	void useCrowBar(int16 targetObjNum);
 	void useCodeNewspaper(int16 targetObjNum);
 	void useCodeLibraryCard(int16 targetObjNum);
+	void useCodeBobbyPin(int16 targetObjNum);
+	void useCodeKeys(int16 actionObjNum, int16 targetObjNum);
+	void useCodeMirrorShard(int16 targetObjNum);
+	void useCodeBinoculars(int16 targetObjNum);
+	void useCodeShovel(int16 targetObjNum);
 
 private:
 	int getHandDescriptionTosIdx(uint16 objNum);
@@ -56,10 +61,15 @@ private:
 	int16 getUseCrowbarTosIdx(uint16 objNum);
 	int16 getUseJournalTosIdx(uint16 objNum);
 	int16 getUseLibraryCardTosIdx(uint16 objNum);
+	int16 getUseBobbyPinTosIdx(uint16 objNum);
+	int16 getUseKeysTosIdx(uint16 objNum);
+	int16 getUseBinocularsTosIdx(uint16 objNum);
+	int16 getUseShovelTosIdx(uint16 objNum);
 
 	void gancanim();
 	void putobjunderpillow(int objNum);
 	void genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx);
+	void startdigging(int16 targetObjNum);
 };
 } // namespace Darkseed
 
diff --git a/engines/darkseed/usecode_tos_tables.h b/engines/darkseed/usecode_tos_tables.h
index 2bcb2941953..c37c9a65813 100644
--- a/engines/darkseed/usecode_tos_tables.h
+++ b/engines/darkseed/usecode_tos_tables.h
@@ -341,6 +341,218 @@ static constexpr int16 libraryCardTextTbl[199] = {
 	999, 993, 999
 };
 
+static constexpr int16 bobbyPinTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 50,
+	0, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 457, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	555, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 986, 999, 999,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 0, 999, 981,
+	999, 999, 999, 808,
+	804, 990, 999, 125,
+	999, 66, 999, 99,
+	999, 998, 991, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 223, 999, 999,
+	332, 999, 999, 999,
+	999, 999, 999, 999,
+	550, 999, 999, 577,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 676, 999,
+	988, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	980, 982, 999, 999,
+	999, 999, 0, 999,
+	999, 999, 989, 999,
+	999, 993, 999
+};
+
+static constexpr int16 keysTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	871, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 413,
+	999, 999, 999, 999,
+	999, 999, 472, 472,
+	472, 999, 999, 0,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 435, 716, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 986, 999, 365,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 999, 999, 981,
+	999, 999, 999, 808,
+	804, 990, 999, 999,
+	25, 999, 999, 108,
+	999, 998, 381, 999,
+	416, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	336, 999, 999, 365,
+	999, 999, 999, 999,
+	550, 999, 999, 577,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	988, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 784, 784, 999,
+	980, 982, 999, 999,
+	999, 999, 884, 999,
+	999, 999, 989, 999,
+	999, 993, 999
+};
+
+static constexpr int16 binocularsTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 53,
+	999, 999, 999, 999,
+	200, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 459, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 38, 999,
+	556, 999, 999, 999,
+	999, 999, 999, 584,
+	584, 584, 584, 584,
+	584, 584, 584, 584,
+	584, 584, 584, 999,
+	150, 986, 999, 361,
+	999, 999, 999, 999,
+	386, 192, 392, 999,
+	996, 753, 999, 999,
+	999, 999, 799, 999,
+	804, 990, 999, 127,
+	23, 69, 999, 103,
+	127, 998, 991, 401,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 174, 187,
+	999, 225, 287, 999,
+	334, 343, 343, 999,
+	999, 530, 999, 999,
+	550, 999, 999, 577,
+	999, 999, 623, 630,
+	630, 630, 630, 630,
+	630, 999, 999, 999,
+	988, 999, 999, 999,
+	999, 999, 999, 763,
+	999, 999, 999, 999,
+	980, 982, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 498, 999,
+	999, 993, 998
+};
+
+static constexpr int16 shovelTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 524,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 48,
+	999, 999, 627, 999,
+	999, 485, 999, 999,
+	999, 999, 979, 411,
+	999, 456, 999, 999,
+	999, 999, 470, 470,
+	470, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 34, 832,
+	999, 999, 999, 999,
+	999, 999, 999, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 999,
+	147, 986, 999, 359,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 753, 999, 981,
+	841, 999, 999, 808,
+	804, 990, 999, 123,
+	21, 65, 310, 97,
+	999, 998, 991, 999,
+	999, 999, 999, 999,
+	999, 995, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 286, 999,
+	330, 341, 348, 359,
+	999, 999, 999, 999,
+	550, 999, 572, 578,
+	999, 999, 999, 627,
+	627, 627, 627, 627,
+	627, 999, 999, 999,
+	988, 686, 999, 999,
+	999, 999, 999, 762,
+	999, 999, 999, 983,
+	980, 982, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 498, 999,
+	999, 323, 999
+};
+
 } // namespace Darkseed
 
 #endif // DARKSEED_USECODE_TOS_TABLES_H


Commit: 41198416203af927c97e8a044b32d6d1a10264c0
    https://github.com/scummvm/scummvm/commit/41198416203af927c97e8a044b32d6d1a10264c0
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Add grave dig animation

Changed paths:
    engines/darkseed/darkseed.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index ee79075eafb..cc464810447 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1311,10 +1311,24 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						scaledSpriteWidth,
 						scaledSpriteHeight,
 						player_sprite_related_2c85_82f3);
-				} else if (otherNspAnimationType_maybe == 22) {
-					error("anim: 22"); // TODO
-				} else if (otherNspAnimationType_maybe == 4 || otherNspAnimationType_maybe == 21) {
-					error("anim: 4 || 21"); // TODO
+				} else if (otherNspAnimationType_maybe == 22) { // dig grave
+					_sprites.addSpriteToDrawList(
+						_player->_position.x - ((scaledWalkSpeed_maybe * 30) / 1000),
+						_player->_position.y - scaledSpriteHeight,
+						&_player->_animations.getSpriteAt(_player->_frameIdx),
+						240 - _player->_position.y,
+						scaledSpriteWidth,
+						scaledSpriteHeight,
+						player_sprite_related_2c85_82f3);
+				} else if (otherNspAnimationType_maybe == 4 || otherNspAnimationType_maybe == 21) { // dig grave
+					_sprites.addSpriteToDrawList(
+						_player->_position.x - ((scaledWalkSpeed_maybe * 95) / 1000),
+						_player->_position.y - scaledSpriteHeight,
+						&_player->_animations.getSpriteAt(_player->_frameIdx),
+						240 - _player->_position.y,
+						scaledSpriteWidth,
+						scaledSpriteHeight,
+						player_sprite_related_2c85_82f3);
 				} else if (otherNspAnimationType_maybe == 39) {
 					error("anim: 39"); // TODO
 				} else if (otherNspAnimationType_maybe == 47) {
@@ -1513,6 +1527,34 @@ void DarkseedEngine::updateAnimation() {
 			}
 		}
 		break;
+	case 4:
+	case 21:
+	case 22: // dig up grave
+		advanceAnimationFrame(0);
+		if (_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]] % 5 == 3 &&
+			_player->_animations.getAnimAt(0).frameDuration[animIndexTbl[0]] == spriteAnimCountdownTimer[0]) {
+			playSound(14, 5, -1);
+		}
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+		} else {
+			isPlayingAnimation_maybe = false;
+			_objectVar[52] = 1;
+			if (otherNspAnimationType_maybe == 21 && _objectVar[151] != 0) {
+				if (_objectVar[87] == 0) {
+					_objectVar[88] = 1;
+					_objectVar[87] = 1;
+					_console->printTosText(581);
+					_inventory.addItem(29);
+				} else {
+					_console->printTosText(582);
+				}
+			} else {
+				_objectVar[88] = 1;
+				_console->printTosText(580);
+			}
+		}
+		break;
 	case 5: // goto sleep animation
 		_player->_position.x = 135;
 		_player->_position.y = 91;


Commit: 7211faddafd2c361e5f75449922620c471f48755
    https://github.com/scummvm/scummvm/commit/7211faddafd2c361e5f75449922620c471f48755
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Add delberts card usecode

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/usecode.cpp
    engines/darkseed/usecode.h
    engines/darkseed/usecode_tos_tables.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index cc464810447..97d8165ef60 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -2131,6 +2131,9 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			case 17:
 				_useCode->useCodeShovel(targetObjNum);
 				break;
+			case 18:
+				_useCode->useCodeDelbertsCard(targetObjNum);
+				break;
 			// TODO lots of extra switch cases here for inventory usages.
 			default:
 				break;
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index cba087c6b3a..06a48019a14 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -99,6 +99,13 @@ int16 UseCode::getUseShovelTosIdx(uint16 objNum) {
 	return shovelTextTbl[objNum];
 }
 
+int16 UseCode::getUseDelbertsCardTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseDelbertsCardTosIdx: Object Index out of range! %d", objNum);
+	}
+	return delbertsCardTextTbl[objNum];
+}
+
 void Darkseed::UseCode::useCode(int objNum) {
 	debug("useCode: objNum = %d", objNum);
 	
@@ -1195,6 +1202,25 @@ void UseCode::useCodeShovel(int16 targetObjNum) {
 	}
 }
 
+void UseCode::useCodeDelbertsCard(int16 targetObjNum) {
+	int16 tosIdx = getUseDelbertsCardTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(18, targetObjNum, tosIdx);
+		}
+	}
+	if (targetObjNum == 64) {
+		if (g_engine->_room->_roomNumber == 30) {
+			g_engine->setupOtherNspAnimation(1, 40);
+		}
+		else {
+			_console->printTosText(488);
+		}
+	}
+}
+
 void UseCode::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx) {
 	// TODO implement me!
 }
diff --git a/engines/darkseed/usecode.h b/engines/darkseed/usecode.h
index 076c57c1503..85523aca3c6 100644
--- a/engines/darkseed/usecode.h
+++ b/engines/darkseed/usecode.h
@@ -53,6 +53,7 @@ public:
 	void useCodeMirrorShard(int16 targetObjNum);
 	void useCodeBinoculars(int16 targetObjNum);
 	void useCodeShovel(int16 targetObjNum);
+	void useCodeDelbertsCard(int16 targetObjNum);
 
 private:
 	int getHandDescriptionTosIdx(uint16 objNum);
@@ -65,6 +66,7 @@ private:
 	int16 getUseKeysTosIdx(uint16 objNum);
 	int16 getUseBinocularsTosIdx(uint16 objNum);
 	int16 getUseShovelTosIdx(uint16 objNum);
+	int16 getUseDelbertsCardTosIdx(uint16 objNum);
 
 	void gancanim();
 	void putobjunderpillow(int objNum);
diff --git a/engines/darkseed/usecode_tos_tables.h b/engines/darkseed/usecode_tos_tables.h
index c37c9a65813..5c26a9208e4 100644
--- a/engines/darkseed/usecode_tos_tables.h
+++ b/engines/darkseed/usecode_tos_tables.h
@@ -553,6 +553,59 @@ static constexpr int16 shovelTextTbl[199] = {
 	999, 323, 999
 };
 
+static constexpr int16 delbertsCardTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 168,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 541, 52,
+	999, 999, 999, 999,
+	999, 0, 999, 999,
+	999, 999, 999, 999,
+	999, 455, 999, 999,
+	0, 999, 999, 999,
+	999, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 37, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	149, 986, 999, 999,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 754, 999, 981,
+	999, 999, 999, 999,
+	805, 990, 999, 999,
+	999, 999, 999, 101,
+	999, 998, 991, 999,
+	999, 999, 999, 482,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 222, 999, 309,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	550, 999, 999, 577,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	988, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 783, 999, 999,
+	980, 982, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 989, 999,
+	999, 993, 999
+};
+
 } // namespace Darkseed
 
 #endif // DARKSEED_USECODE_TOS_TABLES_H


Commit: ecadd5963c501161158992346c9d864a17f35e43
    https://github.com/scummvm/scummvm/commit/ecadd5963c501161158992346c9d864a17f35e43
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Add stick usecode. Mike throws stick

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/nsp.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h
    engines/darkseed/usecode.cpp
    engines/darkseed/usecode.h
    engines/darkseed/usecode_tos_tables.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 97d8165ef60..7eaf1b87469 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1205,10 +1205,12 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 					}
 				}
 
-				_room->calculateScaledSpriteDimensions(
-					_player->_animations.getSpriteAt(_player->_frameIdx).width,
-					_player->_animations.getSpriteAt(_player->_frameIdx).height,
-					nsp_sprite_scaling_y_position != 0 ? nsp_sprite_scaling_y_position : _player->_position.y);
+				if (_player->_animations.containsSpriteAt(_player->_frameIdx)) { // we need this check as the original logic calls the function below when it isn't initialised
+					_room->calculateScaledSpriteDimensions(
+						_player->_animations.getSpriteAt(_player->_frameIdx).width,
+						_player->_animations.getSpriteAt(_player->_frameIdx).height,
+						nsp_sprite_scaling_y_position != 0 ? nsp_sprite_scaling_y_position : _player->_position.y);
+				}
 
 				if (otherNspAnimationType_maybe == 3) { // fall unconscious outside.
 					int curScaledWidth = g_engine->scaledSpriteWidth;
@@ -1332,7 +1334,19 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 				} else if (otherNspAnimationType_maybe == 39) {
 					error("anim: 39"); // TODO
 				} else if (otherNspAnimationType_maybe == 47) {
-					error("anim: 47"); // TODO
+					const Sprite &sprite = _room->_locationSprites.getSpriteAt(_player->_frameIdx);
+					_room->calculateScaledSpriteDimensions(
+						sprite.width,
+						sprite.height,
+						_player->_position.y);
+					_sprites.addSpriteToDrawList(
+						_player->_position.x,
+						_player->_position.y - scaledSpriteHeight,
+						&sprite,
+						240 - _player->_position.y,
+						scaledSpriteWidth,
+						scaledSpriteHeight,
+						player_sprite_related_2c85_82f3);
 				} else {
 					_sprites.addSpriteToDrawList(
 						_player->_position.x - scaledSpriteWidth / 2,
@@ -1375,10 +1389,15 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 	_scaleSequence = false;
 
 	animIndexTbl[nspAnimIdx] = 0;
-	spriteAnimCountdownTimer[nspAnimIdx] = _player->_animations.getAnimAt(nspAnimIdx).frameDuration[0];
+	if (_player->_animations.getTotalAnim() > nspAnimIdx) {
+		spriteAnimCountdownTimer[nspAnimIdx] = _player->_animations.getAnimAt(nspAnimIdx).frameDuration[0];
+		_player->_frameIdx = _player->_animations.getAnimAt(nspAnimIdx).frameNo[0];
+	} else {
+		spriteAnimCountdownTimer[nspAnimIdx] = 0;
+		_player->_frameIdx = 0;
+	}
 	isPlayingAnimation_maybe = true;
 	otherNspAnimationType_maybe = animId;
-	_player->_frameIdx = _player->_animations.getAnimAt(nspAnimIdx).frameNo[0];
 
 	player_sprite_related_2c85_82f3 = 0;
 	isAnimFinished_maybe = false;
@@ -1452,6 +1471,10 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 	case 46:
 		playSound(30,5,-1);
 		break;
+	case 47:
+		_scaleSequence = true;
+		_player->_frameIdx = _room->_locationSprites.getAnimAt(nspAnimIdx).frameNo[0];
+		break;
 	case 53 :
 	case 54 :
 		_player->_position.x = 308;
@@ -1932,7 +1955,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	}
 	case 47:
-		_room->runAnim47();
+		_room->mikeStickThrowAnim();
 		break;
 	case 48:
 	case 49:
@@ -2134,6 +2157,9 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			case 18:
 				_useCode->useCodeDelbertsCard(targetObjNum);
 				break;
+			case 19:
+				_useCode->useCodeStick(targetObjNum);
+				break;
 			// TODO lots of extra switch cases here for inventory usages.
 			default:
 				break;
@@ -2765,7 +2791,7 @@ void DarkseedEngine::runObjects() {
 				_console->printTosText(908);
 				_sound->waitForSpeech();
 			}
-			else if (*(char *)&_delbertspeech == 65) {
+			else if (_delbertspeech == 65) {
 				setupOtherNspAnimation(3, 20);
 				spriteAnimCountdownTimer[1] = 3;
 				_delbertspeech = 72;
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
index 5142ed57adb..e78ea0f5f49 100644
--- a/engines/darkseed/nsp.h
+++ b/engines/darkseed/nsp.h
@@ -60,8 +60,10 @@ private:
 
 public:
 	bool load(const Common::Path &filename);
+	bool containsSpriteAt(int index) { return frames.size() > index; }
 	const Sprite &getSpriteAt(int index);
 	const Obt &getAnimAt(int index);
+	int16 getTotalAnim() { return (int16)animations.size(); }
 
 private:
 	bool load(Common::SeekableReadStream &readStream);
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 1d48b7b606f..3e8847a7671 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -903,7 +903,7 @@ void Darkseed::Room::runRoomObjects() {
 				}
 				updateRoomObj(48, xPos, sprite.width, yPos, sprite.height);
 			} else if (_roomNumber == 5 && g_engine->isPlayingAnimation_maybe && g_engine->otherNspAnimationType_maybe == 7) {
-				const Sprite &sprite = _locationSprites.getSpriteAt(roomObj.spriteNum);
+				const Sprite &sprite = _locationSprites.getSpriteAt(spriteNum);
 				g_engine->_sprites.addSpriteToDrawList(
 					xPos,
 					yPos,
@@ -914,7 +914,7 @@ void Darkseed::Room::runRoomObjects() {
 					false);
 			} else if (_roomNumber == 53) {
 				if (g_engine->_objectVar[79] != 3) {
-					const Sprite &sprite = _locationSprites.getSpriteAt(roomObj.spriteNum);
+					const Sprite &sprite = _locationSprites.getSpriteAt(spriteNum);
 					g_engine->_sprites.addSpriteToDrawList(
 						xPos,
 						yPos,
@@ -1284,7 +1284,7 @@ bool Darkseed::Room::advanceFrame(int animIdx) {
 	return g_engine->_FrameAdvanced;
 }
 
-void Darkseed::Room::runAnim47() {
+void Darkseed::Room::mikeStickThrowAnim() {
 	advanceFrame(2);
 	if (!_ObjRestarted) {
 		g_engine->_player->_frameIdx = _locationSprites.getAnimAt(2).frameNo[_locObjFrame[2]];
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index e4597735011..c7e10d0cdce 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -100,7 +100,7 @@ public:
 	void removeObjectFromRoom(int16 objNum);
 	void updateRoomObj(int16 objNum, int16 x, int16 width, int16 y, int16 height);
 	bool advanceFrame(int animIdx);
-	void runAnim47();
+	void mikeStickThrowAnim();
 	void loadRoom61AWalkableLocations();
 	void restorePalette();
 	void darkenSky();
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 06a48019a14..386dc978d98 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -106,6 +106,13 @@ int16 UseCode::getUseDelbertsCardTosIdx(uint16 objNum) {
 	return delbertsCardTextTbl[objNum];
 }
 
+int16 UseCode::getUseStickTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseStickTosIdx: Object Index out of range! %d", objNum);
+	}
+	return stickTextTbl[objNum];
+}
+
 void Darkseed::UseCode::useCode(int objNum) {
 	debug("useCode: objNum = %d", objNum);
 	
@@ -1221,6 +1228,23 @@ void UseCode::useCodeDelbertsCard(int16 targetObjNum) {
 	}
 }
 
+void UseCode::useCodeStick(int16 targetObjNum) {
+	int16 tosIdx = getUseStickTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(19, targetObjNum, tosIdx);
+		}
+	}
+	if (targetObjNum == 116) {
+		g_engine->_room->loadLocationSprites("mthrow.nsp");
+		g_engine->setupOtherNspAnimation(2, 47);
+	} else if (targetObjNum == 53) {
+		g_engine->throwmikeinjail();
+	}
+}
+
 void UseCode::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx) {
 	// TODO implement me!
 }
diff --git a/engines/darkseed/usecode.h b/engines/darkseed/usecode.h
index 85523aca3c6..b4f131085d0 100644
--- a/engines/darkseed/usecode.h
+++ b/engines/darkseed/usecode.h
@@ -54,6 +54,7 @@ public:
 	void useCodeBinoculars(int16 targetObjNum);
 	void useCodeShovel(int16 targetObjNum);
 	void useCodeDelbertsCard(int16 targetObjNum);
+	void useCodeStick(int16 targetObjNum);
 
 private:
 	int getHandDescriptionTosIdx(uint16 objNum);
@@ -67,6 +68,7 @@ private:
 	int16 getUseBinocularsTosIdx(uint16 objNum);
 	int16 getUseShovelTosIdx(uint16 objNum);
 	int16 getUseDelbertsCardTosIdx(uint16 objNum);
+	int16 getUseStickTosIdx(uint16 objNum);
 
 	void gancanim();
 	void putobjunderpillow(int objNum);
diff --git a/engines/darkseed/usecode_tos_tables.h b/engines/darkseed/usecode_tos_tables.h
index 5c26a9208e4..a7183aabd8a 100644
--- a/engines/darkseed/usecode_tos_tables.h
+++ b/engines/darkseed/usecode_tos_tables.h
@@ -606,6 +606,59 @@ static constexpr int16 delbertsCardTextTbl[199] = {
 	999, 993, 999
 };
 
+static constexpr int16 stickTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 524,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 0, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	201, 489, 999, 999,
+	999, 999, 979, 411,
+	999, 456, 999, 999,
+	999, 999, 470, 470,
+	470, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 39, 832,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	147, 986, 999, 999,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 753, 984, 981,
+	843, 999, 999, 808,
+	804, 990, 999, 128,
+	999, 70, 999, 104,
+	999, 998, 991, 999,
+	999, 999, 479, 479,
+	999, 999, 999, 995,
+	999, 999, 175, 188,
+	216, 999, 999, 999,
+	330, 999, 999, 999,
+	999, 999, 999, 999,
+	550, 999, 999, 577,
+	999, 999, 999, 631,
+	631, 631, 631, 631,
+	631, 999, 999, 999,
+	988, 686, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 983,
+	980, 982, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 989, 999,
+	999, 325, 999
+};
+
 } // namespace Darkseed
 
 #endif // DARKSEED_USECODE_TOS_TABLES_H


Commit: e0cd7f0d1dda51bc2dc9018d5e222b82547fe513
    https://github.com/scummvm/scummvm/commit/e0cd7f0d1dda51bc2dc9018d5e222b82547fe513
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Add remaining usecode functions.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/usecode.cpp
    engines/darkseed/usecode.h
    engines/darkseed/usecode_tos_tables.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 7eaf1b87469..fbca5fa3c23 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1332,7 +1332,25 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						scaledSpriteHeight,
 						player_sprite_related_2c85_82f3);
 				} else if (otherNspAnimationType_maybe == 39) {
-					error("anim: 39"); // TODO
+					int16 spriteX = 110;
+					int16 spriteY = _player->_position.y;
+					if (_room->_roomNumber == 10) {
+						spriteX = 330;
+						spriteY = 224;
+					}
+					const Sprite &sprite = _room->_locationSprites.getSpriteAt(_player->_frameIdx);
+					_room->calculateScaledSpriteDimensions(
+						sprite.width,
+						sprite.height,
+						spriteX);
+					_sprites.addSpriteToDrawList(
+						spriteX,
+						spriteY - scaledSpriteHeight,
+						&sprite,
+						240 - _player->_position.y,
+						scaledSpriteWidth,
+						scaledSpriteHeight,
+						player_sprite_related_2c85_82f3);
 				} else if (otherNspAnimationType_maybe == 47) {
 					const Sprite &sprite = _room->_locationSprites.getSpriteAt(_player->_frameIdx);
 					_room->calculateScaledSpriteDimensions(
@@ -2160,7 +2178,37 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			case 19:
 				_useCode->useCodeStick(targetObjNum);
 				break;
-			// TODO lots of extra switch cases here for inventory usages.
+			case 20:
+				_useCode->useCodeAxeHandle(targetObjNum);
+				break;
+			case 23:
+				_useCode->useCodeRope(targetObjNum);
+				break;
+			case 24:
+				_useCode->useCodeMicroFilm(targetObjNum);
+				break;
+			case 25:
+			case 27:
+				_useCode->useCodeSpecialHammer(_actionMode, targetObjNum);
+				break;
+			case 28:
+				_useCode->useCodeGun(targetObjNum);
+				break;
+			case 30:
+				_useCode->useCodeMoversNote(targetObjNum);
+				break;
+			case 34:
+				_useCode->useCodeBluePrints(targetObjNum);
+				break;
+			case 35:
+				_useCode->useCodeWatch(targetObjNum);
+				break;
+			case 41:
+				_useCode->useCodeTinCup(targetObjNum);
+				break;
+			case 85: // this code appears to be wrong and unused.
+				_useCode->useCodeEmptyUrn(targetObjNum);
+				break;
 			default:
 				break;
 			}
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 6308abd07d9..f55e3bd24f4 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -213,6 +213,7 @@ public:
 	void runObjects();
 	void getPackageObj(int packageType);
 	void libanim(bool pickingUpReservedBook);
+	void printTime();
 
 private:
 	void updateAnimation();
@@ -227,7 +228,6 @@ private:
 	void changeToRoom(int newRoomNumber);
 
 	void wongame();
-	void printTime();
 	void keeperanim();
 	void sargoanim();
 
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 386dc978d98..78fe2aa753a 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -113,6 +113,48 @@ int16 UseCode::getUseStickTosIdx(uint16 objNum) {
 	return stickTextTbl[objNum];
 }
 
+int16 UseCode::getUseAxeHandleTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseAxeHandleTosIdx: Object Index out of range! %d", objNum);
+	}
+	return axeHandleTextTbl[objNum];
+}
+
+int16 UseCode::getUseRopeTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseRopeTosIdx: Object Index out of range! %d", objNum);
+	}
+	return ropeTextTbl[objNum];
+}
+
+int16 UseCode::getUseMicroFilmTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseMicroFilmTosIdx: Object Index out of range! %d", objNum);
+	}
+	return microFilmTextTbl[objNum];
+}
+
+int16 UseCode::getUseSpecialHammerTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseSpecialHammerTosIdx: Object Index out of range! %d", objNum);
+	}
+	return specialHammerTextTbl[objNum];
+}
+
+int16 UseCode::getUseGunTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseGunTosIdx: Object Index out of range! %d", objNum);
+	}
+	return gunTextTbl[objNum];
+}
+
+int16 UseCode::getUseWatchTosIdx(uint16 objNum) {
+	if (objNum >= Objects::MAX_OBJECTS) {
+		error("getUseWatchTosIdx: Object Index out of range! %d", objNum);
+	}
+	return watchTextTbl[objNum];
+}
+
 void Darkseed::UseCode::useCode(int objNum) {
 	debug("useCode: objNum = %d", objNum);
 	
@@ -1245,6 +1287,285 @@ void UseCode::useCodeStick(int16 targetObjNum) {
 	}
 }
 
+void UseCode::useCodeAxeHandle(int16 targetObjNum) {
+	int16 tosIdx = getUseAxeHandleTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(20, targetObjNum, tosIdx);
+		}
+	}
+	if (targetObjNum == 53) {
+		g_engine->throwmikeinjail();
+	}
+}
+
+void UseCode::useCodeRope(int16 targetObjNum) {
+	int16 tosIdx = getUseRopeTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(23, targetObjNum, tosIdx);
+		}
+	}
+	if (targetObjNum == 61) {
+		_objectVar[23] = 1;
+		_player->loadAnimations("opendoor.nsp");
+		g_engine->setupOtherNspAnimation(0, 15);
+		_inventory.removeItem(23);
+	}
+	if (targetObjNum == 53) {
+		g_engine->throwmikeinjail();
+	}
+}
+
+void UseCode::useCodeMicroFilm(int16 targetObjNum) {
+	int16 tosIdx = getUseMicroFilmTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(24, targetObjNum, tosIdx);
+		}
+	}
+	if (targetObjNum == 80) {
+		if (_objectVar[80] == 1 || _objectVar[80] == 3) {
+			_objectVar[80] = 3;
+			g_engine->showFullscreenPic("cfilm01.pic");
+			_console->printTosText(557);
+		} else {
+			_console->printTosText(964);
+		}
+	}
+	else if (targetObjNum == 113) {
+		putobjunderpillow(24);
+	}
+}
+
+void UseCode::useCodeSpecialHammer(int16 actionObjNum, int16 targetObjNum) {
+	if ((actionObjNum == 27) && (targetObjNum == 124)) {
+		_console->printTosText(24);
+	} else if ((actionObjNum == 27) && (targetObjNum == 49)) {
+		_console->printTosText(250);
+	} else if ((actionObjNum == 25) && (targetObjNum == 78)) {
+		_console->printTosText(41);
+	} else if ((actionObjNum == 27) && (targetObjNum == 126)) {
+		_console->printTosText(85);
+	} else if ((actionObjNum == 25) && (targetObjNum == 127)) {
+		_console->printTosText(109);
+	} else if ((actionObjNum == 25) && (targetObjNum == 123)) {
+		_console->printTosText(131);
+	} else if ((actionObjNum == 25) && (targetObjNum == 100)) {
+		_console->printTosText(155);
+	} else if ((actionObjNum == 25) && (targetObjNum == 142)) {
+		_console->printTosText(178);
+	} else if ((actionObjNum == 25) && (targetObjNum == 52)) {
+		_console->printTosText(204);
+	} else if ((actionObjNum == 25) && (targetObjNum == 108)) {
+		_console->printTosText(386);
+	} else if ((actionObjNum == 25) && (targetObjNum == 11)) {
+		_console->printTosText(524);
+	} else if ((actionObjNum == 25) && (targetObjNum == 173)) {
+		_console->printTosText(686);
+	} else if ((actionObjNum == 25) && (targetObjNum == 79)) {
+		_console->printTosText(833);
+	} else if (actionObjNum == 25) {
+		genericresponse(25, targetObjNum, 999);
+	} else if (actionObjNum == 27) {
+		int16 tosIdx = getUseSpecialHammerTosIdx(targetObjNum);
+		if (tosIdx != 0) {
+			if (tosIdx < 979) {
+				_console->printTosText(tosIdx);
+			} else {
+				genericresponse(27, targetObjNum, tosIdx);
+			}
+		}
+	}
+	if ((actionObjNum == 27) && (targetObjNum == 137)) {
+		if (_objectVar[57] == 0) {
+			_console->printTosText(301);
+		} else {
+			_player->loadAnimations("smash.nsp");
+			g_engine->setupOtherNspAnimation(0, 36);
+		}
+	} else if (targetObjNum == 53) {
+		g_engine->throwmikeinjail();
+	}
+}
+
+void UseCode::useCodeGun(int16 targetObjNum) {
+	int16 tosIdx = getUseGunTosIdx(targetObjNum);
+	if (tosIdx != 0) {
+		if (tosIdx < 979) {
+			_console->printTosText(tosIdx);
+		} else {
+			genericresponse(28, targetObjNum, tosIdx);
+		}
+	}
+	if (targetObjNum == 53) {
+		g_engine->throwmikeinjail();
+	}
+}
+
+void UseCode::useCodeMoversNote(int16 targetObjNum) {
+	if (targetObjNum == 47) {
+		_console->printTosText(57);
+	} else if (targetObjNum == 172) {
+		_console->printTosText(93);
+	} else if (targetObjNum == 129) {
+		genericresponse(30, 129, 998);
+	} else if (targetObjNum == 52) {
+		_console->printTosText(205);
+	} else if (targetObjNum == 145) {
+		_console->printTosText(222);
+	} else if (targetObjNum == 112) {
+		genericresponse(30, 112, 996);
+	} else if (targetObjNum == 146) {
+		_console->printTosText(289);
+	} else if (targetObjNum == 137) {
+		_console->printTosText(302);
+	} else if (targetObjNum == 147) {
+		_console->printTosText(309);
+	} else if (targetObjNum == 197) {
+		genericresponse(30, 197, 993);
+	} else if (targetObjNum == 109) {
+		genericresponse(30, 109, 992);
+	} else if (targetObjNum == 130) {
+		genericresponse(30, 130, 991);
+	} else if (targetObjNum == 121) {
+		genericresponse(30, 121, 990);
+	} else if (targetObjNum == 194) {
+		genericresponse(30, 194, 989);
+	} else if (targetObjNum == 172) {
+		genericresponse(30, 172, 988);
+	} else if (targetObjNum == 71) {
+		genericresponse(30, 71, 987);
+	} else if (targetObjNum == 101) {
+		genericresponse(30, 101, 986);
+	} else if (targetObjNum == 184) {
+		genericresponse(30, 184, 980);
+	} else if (targetObjNum == 185) {
+		genericresponse(30, 185, 982);
+	} else if (targetObjNum == 108) {
+		_console->printTosText(386);
+	} else if (targetObjNum == 110) {
+		_console->printTosText(392);
+	} else if (targetObjNum == 61) {
+		_console->printTosText(455);
+	} else if (targetObjNum == 156) {
+		_console->printTosText(550);
+	} else if (targetObjNum == 159) {
+		_console->printTosText(577);
+	} else if (targetObjNum == 113) {
+		putobjunderpillow(113);
+	} else if (targetObjNum == 120) {
+		_console->printTosText(804);
+	} else if (targetObjNum == 188) {
+		_console->printTosText(864);
+	} else if (targetObjNum == 48) {
+		_console->printTosText(860);
+	} else {
+		genericresponse(30, targetObjNum, 999);
+	}
+}
+
+void UseCode::useCodeBluePrints(int16 targetObjNum) {
+	if (targetObjNum == 126) {
+		_console->printTosText(82);
+	} else if (targetObjNum == 127) {
+		_console->printTosText(113);
+	} else if (targetObjNum == 123) {
+		_console->printTosText(133);
+	} else if (targetObjNum == 52) {
+		_console->printTosText(208);
+	} else if (targetObjNum == 100) {
+		_console->printTosText(158);
+	} else if (targetObjNum == 109) {
+		_console->printTosText(992);
+	} else if (targetObjNum == 108) {
+		_console->printTosText(386);
+	} else if (targetObjNum == 110) {
+		_console->printTosText(392);
+	} else if (targetObjNum == 61) {
+		_console->printTosText(455);
+	} else if (targetObjNum == 156) {
+		_console->printTosText(550);
+	} else if (targetObjNum == 159) {
+		_console->printTosText(577);
+	} else if (targetObjNum == 41) {
+		_console->printTosText(757);
+	} else if (targetObjNum == 120) {
+		_console->printTosText(804);
+	} else if (targetObjNum == 114) {
+		_console->printTosText(817);
+	} else if (targetObjNum == 188) {
+		_console->printTosText(864);
+	} else if (targetObjNum == 48) {
+		_console->printTosText(868);
+	} else if (targetObjNum == 185) {
+		genericresponse(34, 185, 982);
+	} else if (targetObjNum == 184) {
+		genericresponse(34, 184, 980);
+	} else if (targetObjNum == 130) {
+		genericresponse(34, 130, 991);
+	} else if (targetObjNum == 197) {
+		genericresponse(34, 197, 993);
+	} else if (targetObjNum == 112) {
+		genericresponse(34, 112, 996);
+	} else if (targetObjNum == 129) {
+		genericresponse(34, 129, 998);
+	} else if (targetObjNum == 121) {
+		genericresponse(34, 121, 990);
+	} else if (targetObjNum == 194) {
+		genericresponse(34, 194, 989);
+	} else if (targetObjNum == 172) {
+		genericresponse(34, 172, 988);
+	} else if (targetObjNum == 71) {
+		genericresponse(34, 71, 987);
+	} else if (targetObjNum == 101) {
+		genericresponse(34, 101, 986);
+	} else if (targetObjNum == 113) {
+		putobjunderpillow(34);
+	} else {
+		genericresponse(34, targetObjNum, 999);
+	}
+}
+
+void UseCode::useCodeWatch(int16 targetObjNum) {
+	if (((targetObjNum == 61) || (targetObjNum == 194)) || (targetObjNum == 156)) {
+		g_engine->printTime();
+	} else if (targetObjNum == 113) {
+		putobjunderpillow(35);
+	} else {
+		int16 tosIdx = getUseWatchTosIdx(targetObjNum);
+		if (tosIdx != 0) {
+			if (tosIdx < 979) {
+				_console->printTosText(tosIdx);
+			} else {
+				genericresponse(35, targetObjNum, tosIdx);
+			}
+		}
+	}
+}
+
+void UseCode::useCodeTinCup(int16 targetObjNum) {
+	if (targetObjNum == 189) {
+		_player->loadAnimations("cuphit.nsp");
+		g_engine->setupOtherNspAnimation(0, 62);
+		_player->_frameIdx = 3;
+	} else if (targetObjNum == 113) {
+		_console->printTosText(753);
+	}
+}
+
+void UseCode::useCodeEmptyUrn(int16 targetObjNum) {
+	if ((targetObjNum == 2) || (targetObjNum == 3)) {
+		_console->printTosText(964);
+	}
+}
+
 void UseCode::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx) {
 	// TODO implement me!
 }
diff --git a/engines/darkseed/usecode.h b/engines/darkseed/usecode.h
index b4f131085d0..1e73dbbabd6 100644
--- a/engines/darkseed/usecode.h
+++ b/engines/darkseed/usecode.h
@@ -55,6 +55,16 @@ public:
 	void useCodeShovel(int16 targetObjNum);
 	void useCodeDelbertsCard(int16 targetObjNum);
 	void useCodeStick(int16 targetObjNum);
+	void useCodeAxeHandle(int16 targetObjNum);
+	void useCodeRope(int16 targetObjNum);
+	void useCodeMicroFilm(int16 targetObjNum);
+	void useCodeSpecialHammer(int16 actionObjNum, int16 targetObjNum);
+	void useCodeGun(int16 targetObjNum);
+	void useCodeMoversNote(int16 targetObjNum);
+	void useCodeBluePrints(int16 targetObjNum);
+	void useCodeWatch(int16 targetObjNum);
+	void useCodeTinCup(int16 targetObjNum);
+	void useCodeEmptyUrn(int16 targetObjNum);
 
 private:
 	int getHandDescriptionTosIdx(uint16 objNum);
@@ -69,6 +79,12 @@ private:
 	int16 getUseShovelTosIdx(uint16 objNum);
 	int16 getUseDelbertsCardTosIdx(uint16 objNum);
 	int16 getUseStickTosIdx(uint16 objNum);
+	int16 getUseAxeHandleTosIdx(uint16 objNum);
+	int16 getUseRopeTosIdx(uint16 objNum);
+	int16 getUseMicroFilmTosIdx(uint16 objNum);
+	int16 getUseSpecialHammerTosIdx(uint16 objNum);
+	int16 getUseGunTosIdx(uint16 objNum);
+	int16 getUseWatchTosIdx(uint16 objNum);
 
 	void gancanim();
 	void putobjunderpillow(int objNum);
diff --git a/engines/darkseed/usecode_tos_tables.h b/engines/darkseed/usecode_tos_tables.h
index a7183aabd8a..007005c11fa 100644
--- a/engines/darkseed/usecode_tos_tables.h
+++ b/engines/darkseed/usecode_tos_tables.h
@@ -659,6 +659,324 @@ static constexpr int16 stickTextTbl[199] = {
 	999, 325, 999
 };
 
+static constexpr int16 axeHandleTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 984, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	199, 489, 999, 999,
+	999, 999, 979, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 999, 832,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 986, 999, 999,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 753, 999, 981,
+	832, 999, 999, 808,
+	804, 990, 999, 126,
+	999, 68, 999, 102,
+	999, 998, 380, 999,
+	999, 999, 479, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 186,
+	999, 999, 999, 999,
+	333, 999, 999, 999,
+	999, 529, 999, 999,
+	550, 999, 999, 577,
+	999, 999, 999, 629,
+	629, 629, 629, 629,
+	629, 999, 999, 999,
+	988, 686, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 983,
+	980, 982, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 989, 999,
+	999, 993, 999
+};
+
+static constexpr int16 ropeTextTbl[199] = {
+	0, 0, 0, 0,
+	0, 0, 0, 999,
+	0, 999, 0, 523,
+	0, 0, 999, 0,
+	793, 999, 0, 999,
+	0, 0, 999, 0,
+	0, 999, 699, 0,
+	0, 0, 0, 0,
+	0, 0, 999, 999,
+	999, 999, 999, 999,
+	999, 0, 0, 0,
+	999, 0, 999, 45,
+	0, 0, 0, 0,
+	195, 485, 0, 999,
+	0, 999, 847, 410,
+	0, 454, 999, 0,
+	0, 0, 469, 469,
+	469, 0, 0, 987,
+	0, 0, 0, 0,
+	0, 0, 999, 831,
+	999, 0, 0, 0,
+	0, 0, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 0,
+	144, 986, 0, 358,
+	999, 999, 999, 999,
+	386, 992, 392, 990,
+	996, 753, 999, 981,
+	840, 999, 0, 808,
+	804, 990, 450, 121,
+	261, 63, 81, 92,
+	121, 998, 378, 400,
+	999, 999, 999, 999,
+	0, 297, 0, 999,
+	999, 0, 999, 184,
+	214, 221, 999, 999,
+	999, 339, 339, 358,
+	999, 528, 999, 0,
+	549, 0, 999, 577,
+	999, 617, 999, 626,
+	0, 0, 0, 0,
+	0, 0, 675, 999,
+	988, 999, 999, 999,
+	999, 999, 0, 761,
+	767, 999, 999, 999,
+	980, 982, 0, 0,
+	0, 0, 0, 999,
+	999, 0, 989, 999,
+	999, 999, 0
+};
+
+static constexpr int16 microFilmTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	870, 999, 999, 999,
+	999, 999, 999, 774,
+	999, 999, 999, 999,
+	999, 455, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	0, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	152, 986, 999, 999,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 0, 999, 981,
+	999, 999, 999, 999,
+	804, 990, 999, 999,
+	999, 71, 999, 999,
+	105, 998, 991, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	335, 999, 999, 999,
+	999, 999, 999, 999,
+	550, 999, 999, 577,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	988, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	980, 982, 999, 999,
+	864, 999, 999, 999,
+	999, 999, 989, 999,
+	999, 993, 999
+};
+
+static constexpr int16 specialHammerTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 757, 999, 999,
+	999, 999, 999, 55,
+	999, 999, 999, 999,
+	203, 489, 999, 999,
+	999, 999, 979, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 987,
+	999, 999, 999, 999,
+	999, 999, 999, 832,
+	558, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 986, 999, 363,
+	999, 999, 999, 999,
+	387, 992, 392, 999,
+	996, 753, 984, 904,
+	999, 999, 999, 808,
+	805, 990, 999, 130,
+	999, 72, 999, 107,
+	999, 998, 991, 999,
+	999, 999, 999, 999,
+	999, 0, 999, 999,
+	999, 999, 176, 999,
+	216, 999, 999, 999,
+	330, 344, 351, 999,
+	999, 999, 999, 999,
+	550, 999, 999, 577,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	988, 999, 999, 999,
+	999, 999, 999, 762,
+	999, 999, 999, 983,
+	980, 982, 999, 999,
+	999, 999, 999, 889,
+	999, 999, 989, 999,
+	999, 324, 999
+};
+
+static constexpr int16 gunTextTbl[199] = {
+	19, 19, 19, 19,
+	19, 19, 19, 19,
+	19, 19, 19, 19,
+	19, 19, 19, 19,
+	999, 999, 19, 999,
+	19, 19, 999, 19,
+	19, 999, 19, 19,
+	19, 19, 19, 19,
+	19, 19, 19, 999,
+	19, 19, 19, 19,
+	19, 757, 19, 19,
+	999, 19, 19, 19,
+	19, 19, 19, 19,
+	19, 485, 19, 999,
+	540, 999, 848, 19,
+	19, 19, 999, 19,
+	19, 19, 19, 19,
+	19, 19, 19, 987,
+	19, 19, 19, 19,
+	19, 19, 19, 19,
+	19, 19, 19, 19,
+	19, 19, 999, 19,
+	19, 19, 19, 19,
+	19, 19, 19, 19,
+	19, 19, 19, 19,
+	19, 986, 19, 19,
+	19, 19, 19, 19,
+	350, 992, 392, 999,
+	996, 753, 19, 19,
+	19, 999, 999, 19,
+	19, 990, 19, 19,
+	19, 19, 19, 19,
+	19, 998, 991, 19,
+	19, 999, 999, 19,
+	19, 19, 19, 999,
+	19, 19, 19, 19,
+	19, 999, 19, 19,
+	19, 19, 19, 19,
+	19, 19, 19, 19,
+	19, 19, 19, 577,
+	19, 618, 622, 19,
+	19, 19, 19, 19,
+	19, 19, 19, 999,
+	19, 685, 999, 999,
+	999, 999, 19, 19,
+	19, 19, 999, 19,
+	19, 19, 19, 19,
+	19, 19, 19, 999,
+	999, 19, 497, 999,
+	999, 19, 19
+};
+
+static constexpr int16 watchTextTbl[199] = {
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 59,
+	873, 999, 999, 999,
+	210, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	160, 986, 999, 999,
+	999, 999, 999, 999,
+	386, 992, 392, 999,
+	996, 999, 999, 981,
+	999, 999, 999, 999,
+	804, 990, 999, 134,
+	27, 75, 87, 115,
+	134, 998, 991, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 191,
+	999, 228, 932, 318,
+	999, 999, 999, 368,
+	999, 999, 999, 999,
+	999, 999, 999, 577,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	988, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 999, 999, 999,
+	980, 982, 999, 999,
+	866, 999, 999, 999,
+	999, 999, 999, 999,
+	999, 993, 998
+};
+
 } // namespace Darkseed
 
 #endif // DARKSEED_USECODE_TOS_TABLES_H


Commit: 29ce8a33d0da5efe4315ac9cca9b8bcf5fb1b184
    https://github.com/scummvm/scummvm/commit/29ce8a33d0da5efe4315ac9cca9b8bcf5fb1b184
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Smash mirror

Changed paths:
    engines/darkseed/darkseed.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index fbca5fa3c23..72c222c0d98 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1161,16 +1161,15 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 				}
 			} else {
 				if (otherNspAnimationType_maybe == 37) {
-					error("anim: 37"); // TODO
-//					uVar1 = (uint)BYTE_ARRAY_2c85_41e7[1];
-//					uVar7 = *(undefined2 *)((int)CPlayerSpriteWidthTbl + uVar1 * 2);
-//					uVar4 = *(undefined2 *)((int)CPlayerSpriteHeightTbl + uVar1 * 2);
-//					calculateScaledPlayerSpriteDimensions(uVar7,uVar4,playerSpriteY_maybe);
-//					addSpriteToDraw(playerSpriteX_maybe - (_curPlayerSpriteWidth & 0xff) / 2,
-//									playerSpriteY_maybe - (_curPlayerSpriteHeight_maybe & 0xff),uVar7,uVar4,
-//									*(undefined2 *)((int)CPlayerSpritePtrTbl + uVar1 * 4),
-//									*(undefined2 *)((int)&CPlayerSpritePtrTbl[0].Offset + uVar1 * 4),240 - playerSpriteY_maybe ,
-//									_curPlayerSpriteWidth,_curPlayerSpriteHeight_maybe,_player_sprite_related_2c85_82f3);
+					const Sprite &playerSprite = _player->getSprite(26);
+					_room->calculateScaledSpriteDimensions(playerSprite.width, playerSprite.height, _player->_position.y);
+					_sprites.addSpriteToDrawList(
+						_player->_position.x,
+						_player->_position.y - scaledSpriteHeight,
+						&playerSprite,
+						240 - _player->_position.y,
+						scaledSpriteWidth,
+						scaledSpriteHeight, player_sprite_related_2c85_82f3);
 				}
 				if (otherNspAnimationType_maybe == 39 || otherNspAnimationType_maybe == 59 ||
 					 otherNspAnimationType_maybe == 60 || otherNspAnimationType_maybe == 61) {
@@ -1922,6 +1921,23 @@ void DarkseedEngine::updateAnimation() {
 			_console->printTosText(927);
 		}
 		break;
+	case 36:
+	case 37:
+		advanceAnimationFrame(otherNspAnimationType_maybe - 36);
+		_player->_frameIdx = _player->_animations.getAnimAt(otherNspAnimationType_maybe - 36).frameNo[animIndexTbl[otherNspAnimationType_maybe - 36]];
+		if (animFrameChanged && otherNspAnimationType_maybe == 36 && _player->_frameIdx == 4) {
+			playSound(28, 5, -1);
+		}
+		if (isAnimFinished_maybe) {
+			if (otherNspAnimationType_maybe == 36) {
+				setupOtherNspAnimation(1, 37);
+			} else {
+				_objectVar[137] = 2;
+				_player->_isAutoWalkingToBed = true;
+				_player->setplayertowardsbedroom();
+			}
+		}
+		break;
 	case 41:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -2214,8 +2230,10 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			}
 		}
 	} else {
+		// 171d:51dc or 1018:61e7
+		// power nexus
+		_player->loadAnimations("pownex.nsp");
 		// TODO
-		// 171d:51dc
 	}
 }
 


Commit: 63556af54cd569241cc8a799fe3b98e08c21f38e
    https://github.com/scummvm/scummvm/commit/63556af54cd569241cc8a799fe3b98e08c21f38e
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: power nexus animation, assemble special hammer

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/usecode.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 72c222c0d98..6975a44f86d 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -2133,9 +2133,28 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 		targetObjNum = 22;
 	}
 	if (_actionMode == LookAction || _actionMode == HandAction || targetObjNum != 115) {
-		if (_cursor.getY() < 10 && _actionMode > LookAction) {
-			// TODO handle inventory
-			// 171d:53c3
+		if (_cursor.getY() < 40 && _actionMode > LookAction) {
+			if (_objectVar[80] < 2 ||
+				((_actionMode != 25 || targetObjNum != 19) && (_actionMode != 19 || targetObjNum != 25))) {
+				if ((_actionMode == 25 && targetObjNum == 20) || (_actionMode == 20 && targetObjNum == 25)) {
+					if (_objectVar[25] > 99) {
+						_console->printTosText(969);
+						_inventory.removeItem(20);
+						_inventory.removeItem(25);
+						updateDisplay();
+						playSound(17,5,-1);
+						_inventory.addItem(27);
+//						waitxticks(30); TODO do we need to add delay here?
+						return;
+					}
+					_useCode->genericresponse(_actionMode, targetObjNum, 999);
+				} else {
+					_useCode->genericresponse(_actionMode, targetObjNum, 999);
+				}
+			} else {
+				_console->printTosText(695);
+			}
+			return;
 		} else {
 			switch (_actionMode) {
 			case HandAction:
@@ -2230,10 +2249,75 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			}
 		}
 	} else {
-		// 171d:51dc or 1018:61e7
-		// power nexus
 		_player->loadAnimations("pownex.nsp");
-		// TODO
+		animIndexTbl[0] = 0;
+		spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0).frameDuration[0];
+		isAnimFinished_maybe = false;
+		int16 frameIdx = 0;
+		int16 prevFrameIdx = 0;
+		while(!isAnimFinished_maybe) {
+			prevFrameIdx = frameIdx;
+			for (int i = 0; i < 6; i++) {
+				wait();
+			}
+
+			_sprites.clearSpriteDrawList();
+			_frame.draw();
+			_console->draw();
+
+			advanceAnimationFrame(0);
+			frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+			const Sprite &sprite = _player->_animations.getSpriteAt(frameIdx);
+			_sprites.addSpriteToDrawList(152, 89, &sprite, 255, sprite.width, sprite.height, false);
+			_room->draw();
+			_sprites.drawSprites();
+
+			_screen->makeAllDirty();
+			_screen->update();
+
+		}
+
+		isAnimFinished_maybe = false;
+		while(!isAnimFinished_maybe) {
+			for (int i = 0; i < 6; i++) {
+				wait();
+			}
+			_sprites.clearSpriteDrawList();
+			_frame.draw();
+			_console->draw();
+
+			advanceAnimationFrame(1);
+
+			const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]);
+			_sprites.addSpriteToDrawList(152, 129, &sprite, 255, sprite.width, sprite.height, false);
+
+			const Sprite &mikeSprite = _player->_animations.getSpriteAt(prevFrameIdx);
+			_sprites.addSpriteToDrawList(152, 89, &mikeSprite, 255, mikeSprite.width, mikeSprite.height, false);
+
+			_room->draw();
+			_sprites.drawSprites();
+
+			_screen->makeAllDirty();
+			_screen->update();
+		}
+
+		if (_actionMode == 25) {
+			if (_objectVar[25] < 100) {
+				_objectVar[25] = _objectVar[25] + 100;
+			}
+			_console->printTosText(930);
+		} else if (_actionMode == 27) {
+			_console->printTosText(929);
+		}
+		else {
+			_console->printTosText(967);
+			_console->addToCurrentLine(_objectVar.getObjectName(_actionMode)); // TODO remove newline after object name
+			_console->printTosText(968);
+			_inventory.removeItem(_actionMode);
+		}
+		if (_actionMode > 4) {
+			_cursor.setCursorType(Pointer);
+		}
 	}
 }
 
diff --git a/engines/darkseed/usecode.h b/engines/darkseed/usecode.h
index 1e73dbbabd6..30212386e27 100644
--- a/engines/darkseed/usecode.h
+++ b/engines/darkseed/usecode.h
@@ -65,6 +65,7 @@ public:
 	void useCodeWatch(int16 targetObjNum);
 	void useCodeTinCup(int16 targetObjNum);
 	void useCodeEmptyUrn(int16 targetObjNum);
+	void genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx);
 
 private:
 	int getHandDescriptionTosIdx(uint16 objNum);
@@ -88,7 +89,7 @@ private:
 
 	void gancanim();
 	void putobjunderpillow(int objNum);
-	void genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx);
+
 	void startdigging(int16 targetObjNum);
 };
 } // namespace Darkseed


Commit: 57ff313e96143a7f13ccd4f81160844d22643c41
    https://github.com/scummvm/scummvm/commit/57ff313e96143a7f13ccd4f81160844d22643c41
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix climbing up rope.

Changed paths:
    engines/darkseed/darkseed.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 6975a44f86d..95298c5bb42 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1851,13 +1851,13 @@ void DarkseedEngine::updateAnimation() {
 			}
 		}
 		break;
-	case 26: // climb down rope.
+	case 26: // climb up rope.
 		advanceAnimationFrame(1);
 		if (!isAnimFinished_maybe) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
-			changeToRoom(32);
+			changeToRoom(13);
 		}
 		break;
 	case 27:
@@ -2137,7 +2137,7 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			if (_objectVar[80] < 2 ||
 				((_actionMode != 25 || targetObjNum != 19) && (_actionMode != 19 || targetObjNum != 25))) {
 				if ((_actionMode == 25 && targetObjNum == 20) || (_actionMode == 20 && targetObjNum == 25)) {
-					if (_objectVar[25] > 99) {
+					if (_objectVar[25] > 99) { // Assemble special hammer
 						_console->printTosText(969);
 						_inventory.removeItem(20);
 						_inventory.removeItem(25);


Commit: ad5871a5ee10cdb9a88c2ec2f843bbb163e275b6
    https://github.com/scummvm/scummvm/commit/ad5871a5ee10cdb9a88c2ec2f843bbb163e275b6
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix leaving car and bookshelf rooms

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/player.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 95298c5bb42..d4bb27664b1 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1011,7 +1011,7 @@ void DarkseedEngine::loadRoom(int roomNumber) {
 	}
 }
 
-void DarkseedEngine::changeToRoom(int newRoomNumber) {
+void DarkseedEngine::changeToRoom(int newRoomNumber) { // AKA LoadNewRoom
 	_objectVar[99] = 0;
 	_objectVar[66] = 0;
 	_objectVar[67] = 0;
@@ -1750,7 +1750,7 @@ void DarkseedEngine::updateAnimation() {
 			_player->updateSprite();
 		}
 		break;
-	case 16:
+	case 16: // climb down rope
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
@@ -1854,7 +1854,7 @@ void DarkseedEngine::updateAnimation() {
 	case 26: // climb up rope.
 		advanceAnimationFrame(1);
 		if (!isAnimFinished_maybe) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
 			changeToRoom(13);
@@ -1863,7 +1863,7 @@ void DarkseedEngine::updateAnimation() {
 	case 27:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]]; // TODO check if this is correct.
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
 			changeToRoom(38);
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index f55e3bd24f4..fbc193ecfaa 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -214,6 +214,7 @@ public:
 	void getPackageObj(int packageType);
 	void libanim(bool pickingUpReservedBook);
 	void printTime();
+	void changeToRoom(int newRoomNumber);
 
 private:
 	void updateAnimation();
@@ -225,7 +226,6 @@ private:
 	void wait();
 	void handlePointerAction();
 	void loadRoom(int roomNumber);
-	void changeToRoom(int newRoomNumber);
 
 	void wongame();
 	void keeperanim();
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index b45a526f47c..0d130c62999 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -172,12 +172,12 @@ void Darkseed::Player::calculateWalkTarget() {
 		_walkTarget.y = g_engine->_cursor.getY();
 	} else {
 		int currentRoomNumber = g_engine->_room->_roomNumber;
-		if (currentRoomNumber == 0x22 || (currentRoomNumber > 0x12 && currentRoomNumber < 0x18)) {
+		if (currentRoomNumber == 34 || (currentRoomNumber > 18 && currentRoomNumber < 24)) {
 			g_engine->_previousRoomNumber = currentRoomNumber;
-			if (currentRoomNumber == 0x22) {
-				// TODO FUN_171d_88f4_change_rooms_maybe(0); // also set current room to 0x21
+			if (currentRoomNumber == 34) {
+				g_engine->changeToRoom(33);
 			} else {
-				// TODO FUN_171d_88f4_change_rooms_maybe(0); // also set current room to 0x1c
+				g_engine->changeToRoom(28);
 			}
 			return;
 		}


Commit: c008ca5410799e34193e1e0f4cb8f2b6ba1ba4d5
    https://github.com/scummvm/scummvm/commit/c008ca5410799e34193e1e0f4cb8f2b6ba1ba4d5
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Replace hex values

Changed paths:
    engines/darkseed/player.cpp


diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 0d130c62999..715754ef1d4 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -184,13 +184,13 @@ void Darkseed::Player::calculateWalkTarget() {
 		g_engine->_room->getWalkTargetForObjectType_maybe(selectedObjNum);
 	}
 
-	if (_walkTarget.y > 0xed) {
-		_walkTarget.y = 0xee;
+	if (_walkTarget.y > 237) {
+		_walkTarget.y = 238;
 	}
 
 	if (!g_engine->_room->canWalkAtLocation(_walkTarget.x, _walkTarget.y)) {
 		int ty = _walkTarget.y;
-		for (; !g_engine->_room->canWalkAtLocation(_walkTarget.x, ty) && ty <= 0xe9;) {
+		for (; !g_engine->_room->canWalkAtLocation(_walkTarget.x, ty) && ty <= 233;) {
 			ty += 4;
 		}
 		if (ty < 235) {


Commit: 9f6a545b1e1de06f0ec098515fca95a1cab07dd7
    https://github.com/scummvm/scummvm/commit/9f6a545b1e1de06f0ec098515fca95a1cab07dd7
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Walk to bed logic

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/player.cpp
    engines/darkseed/player.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index d4bb27664b1..00ab46426dd 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -270,7 +270,14 @@ void DarkseedEngine::gameloop() {
 				}
 			}
 			_room->darkenSky();
-			// TODO lots of logic
+			if (_currentDay < 3 && _currentTimeInSeconds > 79199 && !_player->_isAutoWalkingToBed &&
+				(_room->_roomNumber < 10 || _room->_roomNumber == 13 || _room->_roomNumber == 61 || _room->_roomNumber == 62)) {
+				_player->_walkToSequence = false;
+				_player->_actionToPerform = false;
+				_player->_isAutoWalkingToBed = true;
+				_player->setplayertowardsbedroom();
+				_console->printTosText(944);
+			}
 			if (_currentTimeInSeconds > 79199 && !_player->_isAutoWalkingToBed) {
 				if (_room->isOutside() && _room->_roomNumber != 30) {
 					_inventory.endOfDayOutsideLogic();
@@ -465,7 +472,7 @@ void DarkseedEngine::handleInput() {
 					}
 					_player->updateSprite();
 				}
-				if (_isLeftMouseClicked && _cursor.getY() > 0x28 && !_player->isPlayerWalking_maybe) { // prevLeftMouseButtonState == 0 &&
+				if (_isLeftMouseClicked && _cursor.getY() > 0x28 && !_player->_actionToPerform) { // prevLeftMouseButtonState == 0 &&
 					if (_actionMode == PointerAction) {
 						_player->calculateWalkTarget();
 						_player->playerFaceWalkTarget();
@@ -569,14 +576,14 @@ void DarkseedEngine::handleInput() {
 
 							_cursor.updatePosition(currentCursorPos.x, currentCursorPos.y);
 							_player->playerFaceWalkTarget();
-							_player->isPlayerWalking_maybe = true;
+							_player->_actionToPerform = true;
 						}
 					}
 				}
 				int xDistToTarget = ABS(_player->_walkTarget.x - _player->_position.x);
 				int yDistToTarget = ABS(_player->_walkTarget.y - _player->_position.y);
 
-				if (_isRightMouseClicked && !_player->isPlayerWalking_maybe) {
+				if (_isRightMouseClicked && !_player->_actionToPerform) {
 					if (_actionMode == LookAction) {
 						_actionMode = PointerAction;
 					} else if (_actionMode == PointerAction) {
@@ -596,7 +603,7 @@ void DarkseedEngine::handleInput() {
 				}
 				_room->calculateScaledSpriteDimensions(_player->getWidth(), _player->getHeight(), _player->_position.y);
 
-				if (_player->isAtWalkTarget() && _player->_heroMoving && !_player->isPlayerWalking_maybe) {
+				if (_player->isAtWalkTarget() && _player->_heroMoving && !_player->_actionToPerform) {
 					if (useDoorTarget) {
 						_player->changeDirection(_player->_direction, targetPlayerDirection);
 						useDoorTarget = false;
@@ -752,7 +759,7 @@ void DarkseedEngine::handleInput() {
 						}
 					}
 				}
-				if (_player->isAtWalkTarget() && _player->isPlayerWalking_maybe) {
+				if (_player->isAtWalkTarget() && _player->_actionToPerform) {
 					if (_player->_sequenceRotation != -1) {
 						_player->changeDirection(_player->_direction, _player->_sequenceRotation);
 						_player->updateSprite();
@@ -760,7 +767,7 @@ void DarkseedEngine::handleInput() {
 						return;
 					}
 					_player->_heroMoving = false;
-					_player->isPlayerWalking_maybe = false;
+					_player->_actionToPerform = false;
 					// TODO complete at final destination logic. 2022:879d
 					Common::Point currentCursorPos = _cursor.getPosition();
 					if (_player->_walkToSequence) {
@@ -910,7 +917,7 @@ void DarkseedEngine::handleInput() {
 						}
 						_doorEnabled = false;
 						if (_player->_isAutoWalkingToBed && _player->isAtWalkTarget()) {
-							_player->updateBedAutoWalkSequence();
+							_player->setplayertowardsbedroom();
 						}
 					} else {
 						if (_player->_walkTarget.x < _player->_position.x) {
@@ -960,7 +967,7 @@ void DarkseedEngine::handleInput() {
 	} else {
 		updateAnimation();
 		if (!isPlayingAnimation_maybe && _player->_isAutoWalkingToBed) {
-			_player->updateBedAutoWalkSequence();
+			_player->setplayertowardsbedroom();
 		}
 	}
 }
@@ -1631,9 +1638,9 @@ void DarkseedEngine::updateAnimation() {
 				_previousRoomNumber = 6;
 				changeToRoom(5);
 			}
-//			if (isAutoWalkingToBed != False) {
-//				_player->updateBedAutoWalkSequence();
-//			}
+			if (_player->_isAutoWalkingToBed) {
+				_player->setplayertowardsbedroom();
+			}
 		}
 		break;
 	case 7: // stairs down
@@ -1922,7 +1929,7 @@ void DarkseedEngine::updateAnimation() {
 		}
 		break;
 	case 36:
-	case 37:
+	case 37: // smash mirror
 		advanceAnimationFrame(otherNspAnimationType_maybe - 36);
 		_player->_frameIdx = _player->_animations.getAnimAt(otherNspAnimationType_maybe - 36).frameNo[animIndexTbl[otherNspAnimationType_maybe - 36]];
 		if (animFrameChanged && otherNspAnimationType_maybe == 36 && _player->_frameIdx == 4) {
@@ -2717,7 +2724,7 @@ void DarkseedEngine::initDelbertAtSide() {
 	if (!isPlayingAnimation_maybe || otherNspAnimationType_maybe != 26) {
 		_player->_heroMoving = false;
 		_player->_walkTarget = _player->_position;
-		//*(undefined *)&_ActionToPerform = 0; TODO
+		_player->_actionToPerform = false;
 	}
 }
 
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 715754ef1d4..11299f65215 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -303,10 +303,6 @@ void Darkseed::Player::updatePlayerPositionAfterRoomChange() {
 	}
 }
 
-void Darkseed::Player::updateBedAutoWalkSequence() {
-	// TODO updateBedAutoWalkSequence.
-}
-
 void Darkseed::Player::createConnectorPathToDest() {
 	constexpr Common::Point noConnectorFound(-1,-1);
 	Common::Point origWalkTarget = _walkTarget;
@@ -437,6 +433,45 @@ void Darkseed::Player::OptimisePath() {
 	}
 }
 
+static constexpr uint8 _closerroom[10] = {
+	0, 5, 0, 9,
+	0, 0, 5, 6,
+	7, 6
+};
+
 void Darkseed::Player::setplayertowardsbedroom() {
-	// TODO
+	if (g_engine->isPlayingAnimation_maybe) {
+		return;
+	}
+	Common::Point currentCursor = g_engine->_cursor.getPosition();
+	uint8 currentRoomNumber = g_engine->_room->_roomNumber;
+	if (currentRoomNumber == 0) {
+		Common::Point target = {223, 190};
+		g_engine->_cursor.setPosition(target);
+	} else {
+		uint8 local_a = 0;
+		if (currentRoomNumber < 10) {
+			local_a = _closerroom[currentRoomNumber];
+		} else if (currentRoomNumber == 13) {
+			local_a = 61;
+		} else if (currentRoomNumber == 61) {
+			local_a = 5;
+		} else if (currentRoomNumber == 62) {
+			local_a = 8;
+		}
+		if (currentRoomNumber == 6 && g_engine->_objectVar[137] == 2) {
+			local_a = 10;
+		}
+
+		Common::Point exitPosition = g_engine->_room->getExitPointForRoom(local_a);
+		g_engine->_cursor.setPosition(exitPosition);
+		uint16 exitObjNum = g_engine->_room->getRoomExitAtCursor();
+		g_engine->_room->getWalkTargetForObjectType_maybe(exitObjNum);
+
+		g_engine->_cursor.setPosition(_walkTarget);
+	}
+
+	calculateWalkTarget();
+	playerFaceWalkTarget();
+	g_engine->_cursor.setPosition(currentCursor);
 }
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index edbbf4ed19c..74a42257382 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -45,7 +45,7 @@ public:
 	int16 playerWalkFrameDeltaOffset = 0;
 	int16 playerNewFacingDirection_maybe = 0;
 	uint16 playerWalkFrameIdx = 0;
-	bool isPlayerWalking_maybe = false; // player is pathfinding to some destination?
+	bool _actionToPerform = false; // player is pathfinding to some destination?
 	bool _playerIsChangingDirection = false; // AKA _Rotating
 	bool _isAutoWalkingToBed = false;
 	bool _heroMoving = false; // maybe set to true while player is walking around the room.
@@ -73,7 +73,6 @@ public:
 	int getWidth();
 	int getHeight();
 	void updatePlayerPositionAfterRoomChange();
-	void updateBedAutoWalkSequence();
 	void setplayertowardsbedroom();
 	void walkToNextConnector();
 
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 3e8847a7671..2a5ae408145 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -1335,3 +1335,12 @@ void Darkseed::Room::darkenSky() {
 void Darkseed::Room::loadLocationSprites(const Common::Path &path) {
 	_locationSprites.load(path);
 }
+
+Common::Point Darkseed::Room::getExitPointForRoom(uint8 roomNumber) {
+	for (int i = 0; i < room1.size(); i++) {
+		if (room1[i].roomNumber == roomNumber) {
+			return Common::Point(room1[i].x, room1[i].y);
+		}
+	}
+	return Common::Point();
+}
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index c7e10d0cdce..24591b49c5b 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -105,6 +105,7 @@ public:
 	void restorePalette();
 	void darkenSky();
 	void loadLocationSprites(const Common::Path &path);
+	Common::Point getExitPointForRoom(uint8 roomNumber);
 private:
 	bool load();
 	static Common::String stripSpaces(Common::String source);


Commit: c5ff265a18b618bae76e7db793b97976c18b65b0
    https://github.com/scummvm/scummvm/commit/c5ff265a18b618bae76e7db793b97976c18b65b0
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Don't allow input while walking to bed

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 00ab46426dd..7197bbbc16a 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -181,7 +181,6 @@ void DarkseedEngine::gameloop() {
 		}
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
 		if (systemTimerCounter == 5) {
-			handleInput();
 			if (_objectVar[1] != 0) {
 				if (_room->_roomNumber == 30) {
 					if (!_inventory.hasObject(18)) {
@@ -307,9 +306,29 @@ void DarkseedEngine::gameloop() {
 				gotosleepinjail();
 			}
 			updateDisplay(); // Aka serviceRoom()
+//			if (((*(int *)&_CursorX < 70) || (570 < *(int *)&_CursorX)) && (*(int *)&_DrawCursorNum < 90)) { TODO do we need this restriction?
+//				zeromousebuttons();
+//			}
+			if (_player->_isAutoWalkingToBed ||
+				(_room->_roomNumber == 10 && _player->_position.x < 369 &&
+				  ((_currentDay == 3 && _currentTimeInSeconds > 43200) || _objectVar[88] != 0))) {
+				zeromousebuttons();
+			}
+			if ((_objectVar[141] > 0 && _objectVar[141] < 4) ||
+				_objectVar[141] == 9 ||
+				  _player->_herowaiting || _objectVar[141] == 10 || _objectVar[141] == 8)  {
+				zeromousebuttons();
+			}
+			if (_room->_roomNumber == 32 && _currentDay == 2 &&
+				_currentTimeInSeconds > 64799 && _currentTimeInSeconds < 68401 &&
+				  (_objectVar[141] == 5 || _objectVar[141] == 6 || _objectVar[141] == 4
+					 || _objectVar[141] == 12) && !isPlayingAnimation_maybe) {
+				zeromousebuttons();
+			}
+			updateHeadache();
+			handleInput();
 			_isRightMouseClicked = false;
 			_isLeftMouseClicked = false;
-			updateHeadache();
 		}
 		_room->update();
 		_frame.draw();
@@ -3288,4 +3307,9 @@ void DarkseedEngine::removeFullscreenPic() {
 	}
 }
 
+void DarkseedEngine::zeromousebuttons() {
+	_isLeftMouseClicked = false;
+	_isRightMouseClicked = false;
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index fbc193ecfaa..0df386ffc85 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -244,6 +244,7 @@ private:
 	void leavepackage();
 
 	void removeFullscreenPic();
+	void zeromousebuttons();
 };
 
 extern DarkseedEngine *g_engine;


Commit: d785239f9a5222b8587c22b5bcb54f5ef0646f29
    https://github.com/scummvm/scummvm/commit/d785239f9a5222b8587c22b5bcb54f5ef0646f29
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Cleaned up todo comments. Added look generic call.

Changed paths:
    engines/darkseed/darkseed.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 7197bbbc16a..360bda1298f 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1272,8 +1272,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(303, 105, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe == 62) {
-						// TODO
-						error("anim display 62");
+						error("anim display 62"); // TODO
 					} else if (otherNspAnimationType_maybe == 45 || otherNspAnimationType_maybe == 46) { // pull lever
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(446, 124, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
@@ -2022,7 +2021,7 @@ void DarkseedEngine::updateAnimation() {
 	case 50:
 	case 51:
 	case 52:
-		// open/close cupbords, oven
+		// open/close cupboards, oven
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
@@ -2586,10 +2585,9 @@ void DarkseedEngine::lookCode(int objNum) {
 		if (eyeTosIdx < 979 && eyeTosIdx != 0)  {
 			_console->printTosText(eyeTosIdx);
 		}
-		// TODO
-//		else if (978 < *(int *)((int)_eyedescriptions + objNum * 2)) {
-//			genericresponse(3,objNum,*(undefined2 *)((int)_eyedescriptions + objNum * 2));
-//		}
+		if (eyeTosIdx > 978) {
+			_useCode->genericresponse(3, objNum, eyeTosIdx);
+		}
 		return;
 	}
 	_console->addTextLine(Common::String::format("You see the %s.", _objectVar.getObjectName(objNum)));
@@ -3193,8 +3191,7 @@ void DarkseedEngine::moveplayertodelbert() {
 }
 
 void DarkseedEngine::rundrekethsequence() {
-	// TODO
-	error("implement rundrekethsequence()");
+	error("implement rundrekethsequence()"); // TODO
 }
 
 void DarkseedEngine::delthrowstick(int16 spriteNum) {


Commit: febbea2f384cc8e27366fcc8e4c81edf94b72d8a
    https://github.com/scummvm/scummvm/commit/febbea2f384cc8e27366fcc8e4c81edf94b72d8a
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Generic response logic

Changed paths:
    engines/darkseed/usecode.cpp
    engines/darkseed/usecode.h


diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 78fe2aa753a..3aea3bf0d1c 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -1567,7 +1567,179 @@ void UseCode::useCodeEmptyUrn(int16 targetObjNum) {
 }
 
 void UseCode::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx) {
-	// TODO implement me!
+	_genericResponseCounter++;
+	if (_genericResponseCounter > 4) {
+		_genericResponseCounter = 0;
+	}
+	switch (tosIdx) {
+	case 979:
+		_console->addTextLine(
+			Common::String::format(
+				"This sentry cannot be stopped with a %s.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 980:
+		_console->addTextLine(
+			Common::String::format(
+				"The %s has no effect on the alien tubes.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 981:
+		_console->addTextLine(
+			Common::String::format(
+				"You incinerate the %s inside the power nexus!.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 982:
+		_console->addTextLine(
+			Common::String::format(
+				"The %s has no effect on this alien monstrosity.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 983:
+		_console->addTextLine(
+			Common::String::format(
+				"The %s is not strong enough to cut the cables.\nPerhaps if you had some wire cutters?",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 984:
+		_console->addTextLine(
+			Common::String::format(
+				"The %s has no effect on the protected ancient.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 985:
+		_console->addTextLine(
+			Common::String::format(
+				"You hide the %s under the pillow.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 986:
+		_console->addTextLine(
+			Common::String::format(
+				"Don't put the %s in the trunk, you'll forget it.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 987:
+		_console->addTextLine(
+			Common::String::format(
+				"The car won't start with the %s.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 988:
+		_console->addTextLine(
+			Common::String::format(
+				"If you put the %s in the trunk, you'll forget it.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 989:
+		_console->addTextLine(
+			Common::String::format(
+				"The %s is yours, you haven't lost it.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 990:
+		_console->addTextLine(
+			Common::String::format(
+				"Not a good place to hide the %s.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 991:
+		_console->addTextLine(
+			Common::String::format(
+				"You try to put the %s inside, but the door won't open",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 992:
+		_console->addTextLine(
+			Common::String::format(
+				"The kitchen is no place to keep the %s.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 993:
+		_console->addTextLine(
+			Common::String::format(
+				"You'll forget the %s here.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 994:
+		_console->addTextLine(
+			Common::String::format(
+				"You'd rather have the %s with you.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 995:
+		_console->addTextLine(
+			Common::String::format(
+				"The %s has no effect.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 996:
+		_console->addTextLine(
+			Common::String::format(
+				"This is not a good place for the %s.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 997:
+		_console->addTextLine(
+			Common::String::format(
+				"You see a reflection of the %s.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 998:
+		_console->addTextLine(
+			Common::String::format(
+				"You don't want to leave the %s under the bed.",
+				_objectVar.getObjectName(useObjNum)));
+		break;
+	case 999:
+		switch (_genericResponseCounter) {
+		case 0:
+			_console->addTextLine(
+				Common::String::format(
+					"Using the %s on the %s doesn't make any sense, it must be your headaches!",
+					_objectVar.getObjectName(useObjNum),
+					_objectVar.getObjectName(targetObjNum)
+					)
+				);
+			break;
+		case 1:
+			_console->addTextLine(
+				Common::String::format(
+					"The %s will do nothing to the %s.",
+					_objectVar.getObjectName(useObjNum),
+					_objectVar.getObjectName(targetObjNum)
+						)
+			);
+			break;
+		case 2:
+			_console->addTextLine(
+				Common::String::format(
+					"The %s doesn't have any effect on the %s.",
+					_objectVar.getObjectName(useObjNum),
+					_objectVar.getObjectName(targetObjNum)
+						)
+			);
+			break;
+		case 3:
+			_console->addTextLine(
+				Common::String::format(
+					"The %s has nothing to do with %s.",
+					_objectVar.getObjectName(useObjNum),
+					_objectVar.getObjectName(targetObjNum)
+						)
+			);
+			break;
+		case 4:
+			_console->addTextLine("Are you feeling alright?");
+			break;
+		default:
+			error("Unhandled _genericResponseCounter value");
+		}
+		break;
+	default:
+		break;
+	}
 }
 
 void UseCode::putobjunderpillow(int objNum) {
diff --git a/engines/darkseed/usecode.h b/engines/darkseed/usecode.h
index 30212386e27..159a3648517 100644
--- a/engines/darkseed/usecode.h
+++ b/engines/darkseed/usecode.h
@@ -35,6 +35,7 @@ private:
 	Player *_player = nullptr;
 	Objects &_objectVar;
 	Inventory &_inventory;
+	uint8 _genericResponseCounter = 0;
 
 public:
 	UseCode(Console *console, Player *player, Objects &objectVar, Inventory &inventory);


Commit: 204cfef58037460d3c7e70ef93e5eef3864936f2
    https://github.com/scummvm/scummvm/commit/204cfef58037460d3c7e70ef93e5eef3864936f2
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Work on human world jail logic

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/player.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 360bda1298f..8be8916ab53 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1029,6 +1029,8 @@ void DarkseedEngine::loadRoom(int roomNumber) {
 	delete _room;
 	_room = new Room(roomNumber); // getroomstuff
 
+	updateBaseSprites();
+
 	if (roomNumber == 46 && _previousRoomNumber == 60 && _objectVar[57] == 1) {
 		return;
 	}
@@ -1139,6 +1141,8 @@ void DarkseedEngine::debugTeleportToRoom(int newRoomNumber, int entranceNumber)
 	delete _room;
 	_room = new Room(newRoomNumber);
 
+	updateBaseSprites();
+
 	if (entranceNumber < _room->room1.size()) {
 		const RoomExit &roomExit = _room->room1[entranceNumber];
 		_player->_position.x = roomExit.x + roomExit.width / 2;
@@ -1271,8 +1275,9 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 					} else if (otherNspAnimationType_maybe == 43 || otherNspAnimationType_maybe == 44) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(303, 105, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-					} else if (otherNspAnimationType_maybe == 62) {
-						error("anim display 62"); // TODO
+					} else if (otherNspAnimationType_maybe == 62) { // sargent approaches jail cell.
+						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+						_sprites.addSpriteToDrawList(_player->_position.x - animSprite.width / 2, _player->_position.y - animSprite.height, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe == 45 || otherNspAnimationType_maybe == 46) { // pull lever
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(446, 124, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
@@ -1489,6 +1494,11 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		_player->_position.x = 324;
 		_player->_position.y = 50;
 		break;
+	case 19:
+	case 23:
+		_scaleSequence = true;
+		_player->_frameIdx = 24;
+		break;
 	case 20:
 		spriteAnimCountdownTimer[3] = 3;
 		break;
@@ -1504,6 +1514,10 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		_player->_position.x = 397;
 		_player->_position.y = 77;
 		break;
+	case 39:
+		_scaleSequence = true;
+		_player->_frameIdx = _room->_locationSprites.getAnimAt(nspAnimIdx).frameNo[0];
+		break;
 	case 41 :
 	case 42 :
 		_player->_position.x = 432;
@@ -1816,6 +1830,14 @@ void DarkseedEngine::updateAnimation() {
 			}
 		}
 		break;
+	case 19: // pickup book from library
+		_player->_frameIdx = 24;
+		if (_room->_ObjRestarted) {
+			isPlayingAnimation_maybe = true;
+			_objectVar[46] = 2;
+			libanim(true);
+		}
+		break;
 	case 20: // receive card from delbert
 		advanceAnimationFrame(3);
 		if (!isAnimFinished_maybe) {
@@ -1824,6 +1846,14 @@ void DarkseedEngine::updateAnimation() {
 			_inventory.addItem(18);
 		}
 		break;
+	case 23:
+		_player->_frameIdx = 24;
+		if (_room->_ObjRestarted != 0) {
+			isPlayingAnimation_maybe = false;
+			_objectVar[99] = 1;
+			_console->printTosText(468);
+		}
+		break;
 	case 10:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -1963,6 +1993,26 @@ void DarkseedEngine::updateAnimation() {
 			}
 		}
 		break;
+	case 38:
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+		} else {
+			stuffPlayer();
+		}
+		break;
+	case 39: // Arrest Mike.
+		_room->advanceFrame(1);
+		if (!_room->_ObjRestarted) {
+			_player->_frameIdx = _room->_locationSprites.getAnimAt(1).frameNo[_room->_locObjFrame[1]];
+		}
+		else {
+			throwmikeinjail();
+		}
+		break;
+	case 40:
+		error("updateAnimation 40"); //TODO
+		break;
 	case 41:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -2098,6 +2148,48 @@ void DarkseedEngine::updateAnimation() {
 			playSound(26, 5, -1);
 		}
 		break;
+	case 60:
+		_room->advanceFrame(0);
+		if (!_room->_ObjRestarted) {
+			_player->_frameIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
+		} else {
+			isPlayingAnimation_maybe = false;
+			_objectVar[187] = 1;
+		}
+		break;
+	case 61:
+		_room->advanceFrame(1);
+		if (!_room->_ObjRestarted) {
+			_player->_frameIdx = _room->_locationSprites.getAnimAt(1).frameNo[_room->_locObjFrame[1]];
+		} else {
+			isPlayingAnimation_maybe = false;
+		}
+		_objectVar[187] = 0;
+		break;
+	case 62: // bang cup against bars
+		advanceAnimationFrame(0);
+		if (!isAnimFinished_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+		} else {
+			bool bVar5 = _objectVar.getMoveObjectRoom(18) == 250;
+			if (!bVar5) {
+				if (_inventory.hasObject(18)) {
+					bVar5 = true;
+				}
+			}
+			if (bVar5) {
+				isPlayingAnimation_maybe = false;
+				_objectVar.setObjectRunningCode(53, 1);
+				_player->loadAnimations("copcard.nsp");
+				animIndexTbl[0] = 0;
+				spriteAnimCountdownTimer[0] = 3;
+				_objectVar[1] = 2000;
+			}
+			else {
+				_console->addTextLine("The cops ignore your demands for attention.");
+			}
+		}
+		break;
 	case 65:
 		advanceAnimationFrame(0);
 		if (!isAnimFinished_maybe) {
@@ -3063,7 +3155,7 @@ void DarkseedEngine::runObjects() {
 		((_currentDay == 3 && _currentTimeInSeconds > 39600 && _objectVar[57] == 0) ||
 		  _objectVar[88] != 0)) {
 		if (_player->_position.x == 322 && _player->_position.y == 226) {
-			setupOtherNspAnimation(1, 39);
+			setupOtherNspAnimation(1, 39); // arrest mike.
 		} else {
 			const Sprite &sprite = _room->_locationSprites.getSpriteAt(4);
 			_room->calculateScaledSpriteDimensions(sprite.width, sprite.height, 224);
@@ -3309,4 +3401,21 @@ void DarkseedEngine::zeromousebuttons() {
 	_isRightMouseClicked = false;
 }
 
+void DarkseedEngine::updateBaseSprites() {
+	if (!_room->isGiger() == _normalWorldSpritesLoaded) {
+		// no need to change graphics
+		return;
+	}
+
+	if (_room->isGiger()) {
+		_baseSprites.load("gbase.nsp");
+		_frame.load("gframe.pic");
+		_normalWorldSpritesLoaded = false;
+	} else {
+		_baseSprites.load("cbase.nsp");
+		_frame.load("cframe.pic");
+		_normalWorldSpritesLoaded = true;
+	}
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 0df386ffc85..d707bde4b27 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -68,6 +68,7 @@ private:
 	bool _timeAdvanceEventSelected = false;
 	uint8 _delbertspeech = 0;
 	int16 _yvec = 0; //delbert throw stick related.
+	bool _normalWorldSpritesLoaded = true;
 
 protected:
 	// Engine APIs
@@ -113,7 +114,7 @@ public:
 
 	bool player_sprite_related_2c85_82f3 = false;
 	int _frameBottom = 0;
-	bool isAnimFinished_maybe = false;
+	bool isAnimFinished_maybe = false; // TODO replace this with _ObjRestarted we should only have one.
 	bool animFrameChanged = false;
 	char prefsCutsceneId = 'I';
 	int animIndexTbl[30];
@@ -217,6 +218,7 @@ public:
 	void changeToRoom(int newRoomNumber);
 
 private:
+	void updateBaseSprites();
 	void updateAnimation();
 	void advanceAnimationFrame(int nspAminIdx);
 	void fadeInner(int startValue, int endValue, int increment);
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 11299f65215..b16c84cc031 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -30,8 +30,11 @@ Darkseed::Player::Player() {
 }
 
 const Darkseed::Sprite &Darkseed::Player::getSprite(int frameNo) {
-	// TODO switch sprite based on over or underworld.
-	return _cPlayerSprites.getSpriteAt(frameNo);
+	if (g_engine->_room->isGiger()) {
+		return _gPlayerSprites.getSpriteAt(frameNo);
+	} else {
+		return _cPlayerSprites.getSpriteAt(frameNo);
+	}
 }
 
 bool Darkseed::Player::loadAnimations(const Common::Path &filename) {


Commit: 6b80d4fedb6d1a4283039cddcea873cd8b2f2b20
    https://github.com/scummvm/scummvm/commit/6b80d4fedb6d1a4283039cddcea873cd8b2f2b20
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Replaced isAnimFinished_maybe with _ObjRestarted now shared with location sprites.

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 8be8916ab53..dbbb5719b4c 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1447,7 +1447,7 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 	otherNspAnimationType_maybe = animId;
 
 	player_sprite_related_2c85_82f3 = 0;
-	isAnimFinished_maybe = false;
+	_ObjRestarted = false;
 
 	if (otherNspAnimationType_maybe < 2) {
 		return;
@@ -1564,7 +1564,7 @@ void DarkseedEngine::updateAnimation() {
 	case 0: break;
 	case 1 : // sleep wake anim
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		}
 		else {
@@ -1577,7 +1577,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 2:
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		} else {
 			_player->_position.x = 218;
@@ -1592,7 +1592,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 3:
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
 		} else {
 			if (_room->isGiger()) {
@@ -1614,7 +1614,7 @@ void DarkseedEngine::updateAnimation() {
 			_player->_animations.getAnimAt(0).frameDuration[animIndexTbl[0]] == spriteAnimCountdownTimer[0]) {
 			playSound(14, 5, -1);
 		}
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
 		} else {
 			isPlayingAnimation_maybe = false;
@@ -1638,7 +1638,7 @@ void DarkseedEngine::updateAnimation() {
 		_player->_position.x = 135;
 		_player->_position.y = 91;
 		advanceAnimationFrame(1);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
 		}
 		else {
@@ -1659,7 +1659,7 @@ void DarkseedEngine::updateAnimation() {
 		if (animFrameChanged && ((currentRoomNumber == 6 && animIndexTbl[1] == 1) || (currentRoomNumber == 5 && animIndexTbl[2] == 1))) {
 //			FUN_1208_0dac_sound_related(0xd,CONCAT11(uVar4,5));
 		}
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			if (currentRoomNumber == 6) {
 				_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
 			} else {
@@ -1681,7 +1681,7 @@ void DarkseedEngine::updateAnimation() {
 			if (animFrameChanged && animIndexTbl[3] == 1) {
 				// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
 			}
-			if (!isAnimFinished_maybe) {
+			if (!_ObjRestarted) {
 				_player->_frameIdx = _player->_animations.getAnimAt(3).frameNo[_player->_animations.getAnimAt(3).frameNo[animIndexTbl[3]]];
 			} else {
 				_previousRoomNumber = 5;
@@ -1692,7 +1692,7 @@ void DarkseedEngine::updateAnimation() {
 			if (animFrameChanged && animIndexTbl[0] == 1) {
 				// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
 			}
-			if (!isAnimFinished_maybe) {
+			if (!_ObjRestarted) {
 				_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 			}
 		}
@@ -1707,7 +1707,7 @@ void DarkseedEngine::updateAnimation() {
 				_phoneStatus = 2;
 			}
 		}
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			if (otherNspAnimationType_maybe == 8) {
 				_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 			} else {
@@ -1737,7 +1737,7 @@ void DarkseedEngine::updateAnimation() {
 	case 9: // hang up phone
 	case 64:
 		advanceAnimationFrame(1);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
 		} else {
 			_player->_position.x = 300;
@@ -1750,7 +1750,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 11:
 		advanceAnimationFrame(1);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
 		} else {
 			_player->_position.x = 175;
@@ -1765,7 +1765,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 12:
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		} else {
 			_player->_position.x = 360;
@@ -1778,7 +1778,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 13:
 		advanceAnimationFrame(1);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
 		} else {
 			_player->_position.x = 450;
@@ -1791,7 +1791,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 16: // climb down rope
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		} else {
 			_player->_position.x = 336;
@@ -1804,7 +1804,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 17: // open trunk with crowbar
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
 		}
 		if (animIndexTbl[0] == 5 && animFrameChanged) {
@@ -1819,7 +1819,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 18: // push trunk
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		}
 		if (_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]] == 3 && animFrameChanged) {
@@ -1832,7 +1832,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 19: // pickup book from library
 		_player->_frameIdx = 24;
-		if (_room->_ObjRestarted) {
+		if (_ObjRestarted) {
 			isPlayingAnimation_maybe = true;
 			_objectVar[46] = 2;
 			libanim(true);
@@ -1840,7 +1840,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 20: // receive card from delbert
 		advanceAnimationFrame(3);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(3).frameNo[animIndexTbl[3]];
 		} else {
 			_inventory.addItem(18);
@@ -1848,7 +1848,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 23:
 		_player->_frameIdx = 24;
-		if (_room->_ObjRestarted != 0) {
+		if (_ObjRestarted != 0) {
 			isPlayingAnimation_maybe = false;
 			_objectVar[99] = 1;
 			_console->printTosText(468);
@@ -1856,7 +1856,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 10:
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
@@ -1869,7 +1869,7 @@ void DarkseedEngine::updateAnimation() {
 	case 25:
 		// Open doors
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		} else {
 			_player->updateSprite();
@@ -1908,7 +1908,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 26: // climb up rope.
 		advanceAnimationFrame(1);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
@@ -1917,7 +1917,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 27:
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]]; // TODO check if this is correct.
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
@@ -1926,7 +1926,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 28: // step out of mirror normal world
 		advanceAnimationFrame(1);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
 		} else {
 			_player->_position.x = 418;
@@ -1943,7 +1943,7 @@ void DarkseedEngine::updateAnimation() {
 		if (isPlayingAnimation_maybe) {
 			_player->_frameIdx = _player->_animations.getAnimAt(animIdx).frameNo[animIndexTbl[animIdx]];
 		}
-		if (isAnimFinished_maybe && otherNspAnimationType_maybe == 30) {
+		if (_ObjRestarted && otherNspAnimationType_maybe == 30) {
 			setupOtherNspAnimation(1, 31);
 		}
 		break;
@@ -1958,14 +1958,14 @@ void DarkseedEngine::updateAnimation() {
 		if (isPlayingAnimation_maybe) {
 			_player->_frameIdx = _player->_animations.getAnimAt(animIdx).frameNo[animIndexTbl[animIdx]];
 		}
-		if (isAnimFinished_maybe && (otherNspAnimationType_maybe == 32 || otherNspAnimationType_maybe == 33)) {
+		if (_ObjRestarted && (otherNspAnimationType_maybe == 32 || otherNspAnimationType_maybe == 33)) {
 			setupOtherNspAnimation(otherNspAnimationType_maybe - 29, otherNspAnimationType_maybe + 1);
 		}
 		break;
 	}
 	case 35: // pay shopkeeper
 		advanceAnimationFrame(6);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(6).frameNo[animIndexTbl[6]];
 		} else {
 			_objectVar[8]++;
@@ -1983,7 +1983,7 @@ void DarkseedEngine::updateAnimation() {
 		if (animFrameChanged && otherNspAnimationType_maybe == 36 && _player->_frameIdx == 4) {
 			playSound(28, 5, -1);
 		}
-		if (isAnimFinished_maybe) {
+		if (_ObjRestarted) {
 			if (otherNspAnimationType_maybe == 36) {
 				setupOtherNspAnimation(1, 37);
 			} else {
@@ -1995,7 +1995,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 38:
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
 		} else {
 			stuffPlayer();
@@ -2003,7 +2003,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 39: // Arrest Mike.
 		_room->advanceFrame(1);
-		if (!_room->_ObjRestarted) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _room->_locationSprites.getAnimAt(1).frameNo[_room->_locObjFrame[1]];
 		}
 		else {
@@ -2015,7 +2015,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 41:
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
@@ -2024,7 +2024,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 42: // step out of mirror giger world
 		advanceAnimationFrame(1);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
 		} else {
 			_player->_position.x = 456;
@@ -2045,10 +2045,10 @@ void DarkseedEngine::updateAnimation() {
 		advanceAnimationFrame(iVar4);
 		_player->_frameIdx = _player->_animations.getAnimAt(iVar4).frameNo[_player->_animations.getAnimAt(iVar4).frameNo[animIndexTbl[iVar4]]];
 //		_HeroSpr = (uint) * (byte *)((int)&DAT_1060_7eb8 + *(int *)((int)&_ObjFrame + iVar4 * 2) + iVar4 * 202);
-		if (!isAnimFinished_maybe || (otherNspAnimationType_maybe != 46 && otherNspAnimationType_maybe != 44)) {
+		if (!_ObjRestarted || (otherNspAnimationType_maybe != 46 && otherNspAnimationType_maybe != 44)) {
 			if (otherNspAnimationType_maybe == 45) {
 				_objectVar[117] = 1;
-			} else if (isAnimFinished_maybe) {
+			} else if (_ObjRestarted) {
 				if ((_objectVar[71] == 2) && (_objectVar[44] != 0)) {
 					_console->printTosText(896);
 					_objectVar[57] = 1;
@@ -2073,7 +2073,7 @@ void DarkseedEngine::updateAnimation() {
 	case 52:
 		// open/close cupboards, oven
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
 		}
 		else {
@@ -2091,7 +2091,7 @@ void DarkseedEngine::updateAnimation() {
 	case 55 :
 	case 56 :
 		advanceAnimationFrame((otherNspAnimationType_maybe - 53) & 1);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		} else {
 			switch (otherNspAnimationType_maybe) {
@@ -2127,7 +2127,7 @@ void DarkseedEngine::updateAnimation() {
 	case 57:
 	case 58:
 		advanceAnimationFrame((otherNspAnimationType_maybe - 57) & 1);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]; //_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		} else if (otherNspAnimationType_maybe == 57) {
 			_previousRoomNumber = _room->_roomNumber;
@@ -2138,7 +2138,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 59: // use shard on mirror
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
 		} else {
 			_player->_direction = 1;
@@ -2150,7 +2150,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 60:
 		_room->advanceFrame(0);
-		if (!_room->_ObjRestarted) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
 		} else {
 			isPlayingAnimation_maybe = false;
@@ -2159,7 +2159,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 61:
 		_room->advanceFrame(1);
-		if (!_room->_ObjRestarted) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _room->_locationSprites.getAnimAt(1).frameNo[_room->_locObjFrame[1]];
 		} else {
 			isPlayingAnimation_maybe = false;
@@ -2168,7 +2168,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 62: // bang cup against bars
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
 		} else {
 			bool bVar5 = _objectVar.getMoveObjectRoom(18) == 250;
@@ -2192,7 +2192,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 65:
 		advanceAnimationFrame(0);
-		if (!isAnimFinished_maybe) {
+		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
 		} else {
 			_player->updateSprite();
@@ -2210,7 +2210,7 @@ void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
 	else {
 		_room->calculateScaledSpriteDimensions(10, 10, _player->_position.y);
 	}
-	isAnimFinished_maybe = false;
+	_ObjRestarted = false;
 	animFrameChanged = false;
 	const Obt &anim = _player->_animations.getAnimAt(nspAminIdx);
 	spriteAnimCountdownTimer[nspAminIdx] = spriteAnimCountdownTimer[nspAminIdx] - 1;
@@ -2221,7 +2221,7 @@ void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
 		_player->_position.y += ((int16)anim.deltaY[animIndexTbl[nspAminIdx]] * scaledWalkSpeed_maybe) / 1000;
 		if (animIndexTbl[nspAminIdx] == anim.numFrames) {
 			animIndexTbl[nspAminIdx] = 0;
-			isAnimFinished_maybe = true;
+			_ObjRestarted = true;
 			isPlayingAnimation_maybe = false;
 			_player->_walkTarget.x = _player->_position.x;
 			_player->_walkTarget.y = _player->_position.y;
@@ -2369,10 +2369,10 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 		_player->loadAnimations("pownex.nsp");
 		animIndexTbl[0] = 0;
 		spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0).frameDuration[0];
-		isAnimFinished_maybe = false;
+		_ObjRestarted = false;
 		int16 frameIdx = 0;
 		int16 prevFrameIdx = 0;
-		while(!isAnimFinished_maybe) {
+		while(!_ObjRestarted) {
 			prevFrameIdx = frameIdx;
 			for (int i = 0; i < 6; i++) {
 				wait();
@@ -2394,8 +2394,8 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 
 		}
 
-		isAnimFinished_maybe = false;
-		while(!isAnimFinished_maybe) {
+		_ObjRestarted = false;
+		while(!_ObjRestarted) {
 			for (int i = 0; i < 6; i++) {
 				wait();
 			}
@@ -2744,7 +2744,7 @@ void DarkseedEngine::playSound(int16 unk, uint8 unk1, int16 unk2) {
 }
 
 void DarkseedEngine::nextFrame(int nspAminIdx) {
-	isAnimFinished_maybe = false;
+	_ObjRestarted = false;
 	spriteAnimCountdownTimer[nspAminIdx]--;
 	_FrameAdvanced = false;
 	if (spriteAnimCountdownTimer[nspAminIdx] < 1) {
@@ -2753,7 +2753,7 @@ void DarkseedEngine::nextFrame(int nspAminIdx) {
 		_FrameAdvanced = true;
 		if (animIndexTbl[nspAminIdx] == anim.numFrames) {
 			animIndexTbl[nspAminIdx] = 0;
-			isAnimFinished_maybe = true;
+			_ObjRestarted = true;
 		}
 		spriteAnimCountdownTimer[nspAminIdx] = anim.frameDuration[animIndexTbl[nspAminIdx]];
 	}
@@ -2912,7 +2912,7 @@ void DarkseedEngine::runObjects() {
 		if (_FrameAdvanced && delbertSpriteIdx == 5) {
 			playSound(32, 5, -1);
 		}
-		if (_room->_ObjRestarted) {
+		if (_ObjRestarted) {
 			_objectVar[141] = 10;
 			_console->printTosText(910);
 			_inventory.removeItem(7);
@@ -2970,7 +2970,7 @@ void DarkseedEngine::runObjects() {
 			_objectVar.setMoveObjectRoom(19, 100);
 			_room->advanceFrame(_objectVar[45] + 1);
 			Common::Point stickPosition = _objectVar.getMoveObjectPosition(19);
-			if (_room->_ObjRestarted && _objectVar[45] < 2) {
+			if (_ObjRestarted && _objectVar[45] < 2) {
 				_objectVar[45] = (_objectVar[45] == 0) ? 1 : 0;
 				if (_objectVar[45] == 0) {
 					stickPosition = {230, 205};
@@ -3032,11 +3032,11 @@ void DarkseedEngine::runObjects() {
 		if (_player->_position.x == 290 && _player->_position.y == 209 && !_player->_playerIsChangingDirection && _player->_direction != 3) {
 			_player->changeDirection(_player->_direction, 3);
 		}
-		isAnimFinished_maybe = false;
+		_ObjRestarted = false;
 		if (!_sound->isPlayingSpeech() && (_objectVar[141] != 2 || _delbertspeech > 64)) {
 			nextFrame(_objectVar[141] - 1);
 		}
-		if (isAnimFinished_maybe) {
+		if (_ObjRestarted) {
 			_objectVar[141]++;
 			if (_objectVar[141] == 2) {
 				_delbertspeech = 63;
@@ -3047,7 +3047,7 @@ void DarkseedEngine::runObjects() {
 			} else if (_objectVar[141] == 4) {
 				_player->_herowaiting = false;
 			}
-			isAnimFinished_maybe = false;
+			_ObjRestarted = false;
 		}
 		if (!_sound->isPlayingSpeech() && _objectVar[141] == 2) {
 			if (_delbertspeech < 65) {
@@ -3087,7 +3087,7 @@ void DarkseedEngine::runObjects() {
 	if (_room->_roomNumber == 32 && _currentDay == 2 && _currentTimeInSeconds > 64799 && (_objectVar[141] == 5 || _objectVar[141] == 6)) {
 		// walk delbert off into garden.
 		_room->advanceFrame(_objectVar[141] - 4);
-		if (_room->_ObjRestarted) {
+		if (_ObjRestarted) {
 			_objectVar[141]++;
 			if (_objectVar[141] == 7) {
 				_player->_herowaiting = false;
@@ -3140,7 +3140,7 @@ void DarkseedEngine::runObjects() {
 		if (_objectVar.getObjectRunningCode(53) == 1) {
 			int oldFrame = animIndexTbl[0];
 			nextFrame(0);
-			if (isAnimFinished_maybe) {
+			if (_ObjRestarted) {
 				_objectVar.setObjectRunningCode(53, 2);
 				animIndexTbl[0] = oldFrame;
 			}
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index d707bde4b27..a882227c059 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -114,7 +114,7 @@ public:
 
 	bool player_sprite_related_2c85_82f3 = false;
 	int _frameBottom = 0;
-	bool isAnimFinished_maybe = false; // TODO replace this with _ObjRestarted we should only have one.
+	bool _ObjRestarted = false;
 	bool animFrameChanged = false;
 	char prefsCutsceneId = 'I';
 	int animIndexTbl[30];
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 2a5ae408145..76919333e80 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -166,13 +166,13 @@ bool Darkseed::Room::load() {
 
 	_pal.load(g_engine->getPictureFilePath(Common::Path(Common::String::format("%s.pal", filenameBase.c_str()))));
 
-	_locationSprites.load(Common::Path(Common::String::format("%s.nsp", filenameBase.c_str())));
+	loadLocationSprites(Common::Path(Common::String::format("%s.nsp", filenameBase.c_str())));
 
 	if (_roomNumber == 61 && g_engine->_objectVar[22] > 2) {
 		loadRoom61AWalkableLocations();
 	}
 	if (_roomNumber == 10 && ((g_engine->_currentDay == 3 && g_engine->_currentTimeInSeconds > 39600) || g_engine->_objectVar[88] != 0)) {
-		_locationSprites.load(Common::Path("room15.nsp"));
+		loadLocationSprites(Common::Path("room15.nsp"));
 		g_engine->_objectVar.setObjectRunningCode(72, 1);
 	}
 	g_engine->_objectVar.setMoveObjectX(45, 230);
@@ -840,7 +840,7 @@ void Darkseed::Room::runRoomObjects() {
 					roomObj.yOffset += anim.deltaY[_locObjFrame[g_engine->_objectVar[79]]];
 				}
 				spriteNum = _locationSprites.getAnimAt(g_engine->_objectVar[79]).frameNo[_locObjFrame[g_engine->_objectVar[79]]];
-				if (_ObjRestarted) {
+				if (g_engine->_ObjRestarted) {
 					if (g_engine->_objectVar[79] == 1) {
 						g_engine->_objectVar[79] = 3;
 					}
@@ -979,7 +979,7 @@ void Darkseed::Room::runRoomObjects() {
 			}
 			if (_roomNumber == 57 && g_engine->_previousRoomNumber == 54 && spriteNum < 6) {
 				g_engine->_objectVar[56] = spriteNum;
-				if (_ObjRestarted) {
+				if (g_engine->_ObjRestarted) {
 					g_engine->_objectVar[56] = 6;
 				}
 			}
@@ -1069,7 +1069,7 @@ void Darkseed::Room::runRoomObjects() {
 				g_engine->_sprites.addSpriteToDrawList(334, 153, &sprite2, 255, sprite2.width, sprite2.height, false);
 			} else {
 				advanceLocAnimFrame(0);
-				if (!_ObjRestarted) {
+				if (!g_engine->_ObjRestarted) {
 					const Sprite &sprite = _locationSprites.getSpriteAt(_locationSprites.getAnimAt(0).frameNo[_locObjFrame[0]]);
 					g_engine->_sprites.addSpriteToDrawList(245, 93, &sprite, 255, sprite.width, sprite.height, false);
 				} else {
@@ -1255,13 +1255,13 @@ void Darkseed::Room::drawTrunk() {
 
 void Darkseed::Room::advanceLocAnimFrame(int roomObjIdx) {
 	const Obt &anim = _locationSprites.getAnimAt(_roomObj[roomObjIdx].spriteNum);
-	_ObjRestarted = false;
+	g_engine->_ObjRestarted = false;
 	_locObjFrameTimer[roomObjIdx]--;
 	if (_locObjFrameTimer[roomObjIdx] < 1) {
 		_locObjFrame[roomObjIdx]++;
 		if (_locObjFrame[roomObjIdx] == anim.numFrames) {
 			_locObjFrame[roomObjIdx] = 0;
-			_ObjRestarted = true;
+			g_engine->_ObjRestarted = true;
 		}
 		_locObjFrameTimer[roomObjIdx] = anim.frameDuration[_locObjFrame[roomObjIdx]];
 	}
@@ -1270,14 +1270,14 @@ void Darkseed::Room::advanceLocAnimFrame(int roomObjIdx) {
 bool Darkseed::Room::advanceFrame(int animIdx) {
 	g_engine->_FrameAdvanced = false;
 	const Obt &anim = _locationSprites.getAnimAt(animIdx);
-	_ObjRestarted = false;
+	g_engine->_ObjRestarted = false;
 	_locObjFrameTimer[animIdx]--;
 	if (_locObjFrameTimer[animIdx] < 1) {
 		g_engine->_FrameAdvanced = true;
 		_locObjFrame[animIdx]++;
 		if (_locObjFrame[animIdx] == anim.numFrames) {
 			_locObjFrame[animIdx] = 0;
-			_ObjRestarted = true;
+			g_engine->_ObjRestarted = true;
 		}
 		_locObjFrameTimer[animIdx] = anim.frameDuration[_locObjFrame[animIdx]];
 	}
@@ -1286,7 +1286,7 @@ bool Darkseed::Room::advanceFrame(int animIdx) {
 
 void Darkseed::Room::mikeStickThrowAnim() {
 	advanceFrame(2);
-	if (!_ObjRestarted) {
+	if (!g_engine->_ObjRestarted) {
 		g_engine->_player->_frameIdx = _locationSprites.getAnimAt(2).frameNo[_locObjFrame[2]];
 	} else {
 		g_engine->_objectVar[79] = 1;
@@ -1334,6 +1334,9 @@ void Darkseed::Room::darkenSky() {
 
 void Darkseed::Room::loadLocationSprites(const Common::Path &path) {
 	_locationSprites.load(path);
+	for (int i = 0; i < 20; i++) {
+		_locObjFrameTimer[i] = _locationSprites.getAnimAt(i).frameDuration[0];
+	}
 }
 
 Common::Point Darkseed::Room::getExitPointForRoom(uint8 roomNumber) {
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index 24591b49c5b..ec0915dae06 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -62,7 +62,6 @@ public:
 	Nsp _locationSprites;
 	Common::Array<int16> _locObjFrame;
 	Common::Array<int16> _locObjFrameTimer;
-	bool _ObjRestarted = false;
 
 	Common::Array<RoomExit> room1;
 	Common::Array<RoomStruct2> walkableLocationsMap;


Commit: 81882bddae09611f847da100378156213e90adda
    https://github.com/scummvm/scummvm/commit/81882bddae09611f847da100378156213e90adda
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Replaced animFrameChanged with _FrameAdvanced. Clipped stair walking animation.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/nsp.cpp
    engines/darkseed/nsp.h
    engines/darkseed/sprites.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index dbbb5719b4c..161ec135a40 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1656,7 +1656,7 @@ void DarkseedEngine::updateAnimation() {
 		} else {
 			advanceAnimationFrame(2);
 		}
-		if (animFrameChanged && ((currentRoomNumber == 6 && animIndexTbl[1] == 1) || (currentRoomNumber == 5 && animIndexTbl[2] == 1))) {
+		if (_FrameAdvanced && ((currentRoomNumber == 6 && animIndexTbl[1] == 1) || (currentRoomNumber == 5 && animIndexTbl[2] == 1))) {
 //			FUN_1208_0dac_sound_related(0xd,CONCAT11(uVar4,5));
 		}
 		if (!_ObjRestarted) {
@@ -1678,7 +1678,7 @@ void DarkseedEngine::updateAnimation() {
 	case 7: // stairs down
 		if (currentRoomNumber == 5) {
 			advanceAnimationFrame(3);
-			if (animFrameChanged && animIndexTbl[3] == 1) {
+			if (_FrameAdvanced && animIndexTbl[3] == 1) {
 				// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
 			}
 			if (!_ObjRestarted) {
@@ -1689,7 +1689,7 @@ void DarkseedEngine::updateAnimation() {
 			}
 		} else {
 			advanceAnimationFrame(0);
-			if (animFrameChanged && animIndexTbl[0] == 1) {
+			if (_FrameAdvanced && animIndexTbl[0] == 1) {
 				// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
 			}
 			if (!_ObjRestarted) {
@@ -1807,7 +1807,7 @@ void DarkseedEngine::updateAnimation() {
 		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
 		}
-		if (animIndexTbl[0] == 5 && animFrameChanged) {
+		if (animIndexTbl[0] == 5 && _FrameAdvanced) {
 			playSound(31,5,-1);
 			_console->printTosText(666);
 			if (_objectVar[42] == 0) {
@@ -1822,7 +1822,7 @@ void DarkseedEngine::updateAnimation() {
 		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		}
-		if (_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]] == 3 && animFrameChanged) {
+		if (_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]] == 3 && _FrameAdvanced) {
 			_console->printTosText(_objectVar[22] + 662);
 			_objectVar[22] = _objectVar[22] + 1;
 			if (_objectVar[22] == 3) {
@@ -1980,7 +1980,7 @@ void DarkseedEngine::updateAnimation() {
 	case 37: // smash mirror
 		advanceAnimationFrame(otherNspAnimationType_maybe - 36);
 		_player->_frameIdx = _player->_animations.getAnimAt(otherNspAnimationType_maybe - 36).frameNo[animIndexTbl[otherNspAnimationType_maybe - 36]];
-		if (animFrameChanged && otherNspAnimationType_maybe == 36 && _player->_frameIdx == 4) {
+		if (_FrameAdvanced && otherNspAnimationType_maybe == 36 && _player->_frameIdx == 4) {
 			playSound(28, 5, -1);
 		}
 		if (_ObjRestarted) {
@@ -2119,7 +2119,7 @@ void DarkseedEngine::updateAnimation() {
 				break;
 			}
 		}
-		if (animFrameChanged && animIndexTbl[0] == 1) {
+		if (_FrameAdvanced && animIndexTbl[0] == 1) {
 			// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
 			// PlaySound(1,5,-1);
 		}
@@ -2144,7 +2144,7 @@ void DarkseedEngine::updateAnimation() {
 			_player->_direction = 1;
 			_player->updateSprite();
 		}
-		if (animFrameChanged && _player->_frameIdx == 3) {
+		if (_FrameAdvanced && _player->_frameIdx == 3) {
 			playSound(26, 5, -1);
 		}
 		break;
@@ -2211,11 +2211,11 @@ void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
 		_room->calculateScaledSpriteDimensions(10, 10, _player->_position.y);
 	}
 	_ObjRestarted = false;
-	animFrameChanged = false;
+	_FrameAdvanced = false;
 	const Obt &anim = _player->_animations.getAnimAt(nspAminIdx);
 	spriteAnimCountdownTimer[nspAminIdx] = spriteAnimCountdownTimer[nspAminIdx] - 1;
 	if (spriteAnimCountdownTimer[nspAminIdx] < 1) {
-		animFrameChanged = true;
+		_FrameAdvanced = true;
 		animIndexTbl[nspAminIdx] = animIndexTbl[nspAminIdx] + 1;
 		_player->_position.x += ((int16)anim.deltaX[animIndexTbl[nspAminIdx]] * scaledWalkSpeed_maybe) / 1000;
 		_player->_position.y += ((int16)anim.deltaY[animIndexTbl[nspAminIdx]] * scaledWalkSpeed_maybe) / 1000;
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index a882227c059..da139e978e8 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -115,7 +115,6 @@ public:
 	bool player_sprite_related_2c85_82f3 = false;
 	int _frameBottom = 0;
 	bool _ObjRestarted = false;
-	bool animFrameChanged = false;
 	char prefsCutsceneId = 'I';
 	int animIndexTbl[30];
 	int spriteAnimCountdownTimer[30];
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index e33108e3da6..38656a41444 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -52,12 +52,19 @@ bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
 	return true;
 }
 
-void Darkseed::Sprite::draw(int x, int y) const {
+void Darkseed::Sprite::draw(int x, int y, uint16 frameBottom) const {
 	uint16 clippedWidth = width;
+	uint16 clippedHeight = height;
 	if (x + width > g_engine->_screen->w) {
 		clippedWidth = g_engine->_screen->w - x;
 	}
-	g_engine->_screen->copyRectToSurfaceWithKey(pixels.data(), pitch, x, y, clippedWidth, height, 0xf);
+	if (frameBottom != 0 && y + height > g_engine->_frameBottom) {
+		if ( y >= frameBottom) {
+			return;
+		}
+		clippedHeight = frameBottom - y;
+	}
+	g_engine->_screen->copyRectToSurfaceWithKey(pixels.data(), pitch, x, y, clippedWidth, clippedHeight, 0xf);
 }
 
 void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destHeight, bool flipX) const {
@@ -92,7 +99,8 @@ void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destH
 	byte *dst = (byte *)destSurface->getBasePtr(destX, destY);
 	int yi = ys * clipY;
 	const byte *hsrc = source + pitch * ((yi + 0x8000) >> 16);
-	for (int yc = 0; yc < destHeight; ++yc) {
+	int16 currY = destY;
+	for (int yc = 0; yc < destHeight && currY < g_engine->_frameBottom; ++yc) {
 		byte *wdst = flipX ? dst + (destWidth - 1) : dst;
 		int16 currX = flipX ? destX + (destWidth - 1) : destX;
 		int xi = flipX ? xs : xs * clipX;
@@ -120,6 +128,7 @@ void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destH
 		dst += destPitch;
 		yi += ys;
 		hsrc = source + pitch * ((yi + 0x8000) >> 16);
+		currY++;
 	}
 }
 
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
index e78ea0f5f49..76b3945e016 100644
--- a/engines/darkseed/nsp.h
+++ b/engines/darkseed/nsp.h
@@ -38,7 +38,7 @@ public:
 public:
 	Sprite(uint16 width, uint16 height, uint16 pitch);
 	bool loadData(Common::SeekableReadStream &readStream);
-	void draw(int x, int y) const;
+	void draw(int x, int y, uint16 frameBottom = 0) const;
 	void drawScaled(int x, int y, int destWidth, int destHeight, bool flipX) const;
 };
 
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
index d45ca1c5d9b..12f9cab5965 100644
--- a/engines/darkseed/sprites.cpp
+++ b/engines/darkseed/sprites.cpp
@@ -65,7 +65,7 @@ void Darkseed::Sprites::drawSprites() {
 	for (int i = spriteDrawList.size() - 1; i >= 0; i--) {
 		SpriteDrawInstruction &drawInstruction = spriteDrawList[i];
 		if (drawInstruction.sprite->width == drawInstruction.destW && drawInstruction.sprite->height == drawInstruction.destH && !drawInstruction.flip) {
-			drawInstruction.sprite->draw(drawInstruction.destX, drawInstruction.destY); // TODO add support for flipping sprite.
+			drawInstruction.sprite->draw(drawInstruction.destX, drawInstruction.destY, g_engine->_frameBottom); // TODO add support for flipping sprite.
 		} else {
 			drawInstruction.sprite->drawScaled(drawInstruction.destX, drawInstruction.destY, drawInstruction.destW, drawInstruction.destH, drawInstruction.flip);
 		}


Commit: 85e165b43b13a774096654e4b479dd935d46b618
    https://github.com/scummvm/scummvm/commit/85e165b43b13a774096654e4b479dd935d46b618
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Added dirty draw support for inventory.

Changed paths:
    engines/darkseed/console.cpp
    engines/darkseed/console.h
    engines/darkseed/cursor.cpp
    engines/darkseed/cursor.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/inventory.cpp
    engines/darkseed/inventory.h
    engines/darkseed/pic.cpp
    engines/darkseed/pic.h


diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index d296a75d902..530ef2dec72 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -19,11 +19,14 @@
  *
  */
 
-#include "darkseed/console.h"
 #include "common/debug.h"
+#include "darkseed/console.h"
+#include "darkseed/darkseed.h"
 
 namespace Darkseed {
 
+static constexpr Common::Rect consoleArea = {{0x70, 280}, 416, 44};
+
 Console::Console(TosText *tosText, Sound *sound) : _tosText(tosText), _sound(sound) {
 	if(!_font.load()) {
 		error("Error loading tosfont.nsp");
@@ -53,6 +56,11 @@ void Console::addToCurrentLine(const Common::String &text) {
 }
 
 void Console::draw() {
+	if (!redrawRequired) {
+		return;
+	}
+
+	g_engine->_screen->fillRect(consoleArea, 0);
 	int curIdx = _startIdx == 0 ? _text.size() - 1 : _startIdx - 1;
 	int y = 0x139;
 	for (int i = 0; i < 4 && curIdx != _startIdx && !_text[curIdx].empty(); i++) {
@@ -60,6 +68,8 @@ void Console::draw() {
 		y -= 11;
 		curIdx = curIdx == 0 ? _text.size() - 1 : curIdx - 1;
 	}
+	redrawRequired = false;
+	g_engine->_screen->addDirtyRect(consoleArea);
 }
 
 Common::Array<Common::String> Console::wrapText(const Common::String &text) {
@@ -74,7 +84,7 @@ Common::Array<Common::String> Console::wrapText(const Common::String &text) {
 		}
 		if (text[i] == ' ' || text[i] == '\r') {
 			int wordLength = _font.stringLength(word);
-			if (lineLength + wordLength > 0x1a0) {
+			if (lineLength + wordLength > consoleArea.width()) {
 				lines.push_back(line);
 				line = word;
 				lineLength = wordLength;
@@ -100,6 +110,7 @@ Common::Array<Common::String> Console::wrapText(const Common::String &text) {
 void Console::addLine(const Common::String &line) {
 	_text[_startIdx] = line;
 	_startIdx = (_startIdx + 1) % _text.size();
+	redrawRequired = true;
 }
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
index 48f1afc1c0b..aee1a681068 100644
--- a/engines/darkseed/console.h
+++ b/engines/darkseed/console.h
@@ -38,6 +38,7 @@ private:
 
 	Common::Array<Common::String> _text;
 	int _startIdx = 0;
+	bool redrawRequired = false;
 
 public:
 	Console(TosText *tostext, Sound *sound);
diff --git a/engines/darkseed/cursor.cpp b/engines/darkseed/cursor.cpp
index 882edfdb710..0595adbac13 100644
--- a/engines/darkseed/cursor.cpp
+++ b/engines/darkseed/cursor.cpp
@@ -21,9 +21,19 @@
 
 #include "cursor.h"
 #include "darkseed.h"
+#include "graphics/cursorman.h"
 
 void Darkseed::Cursor::setCursorType(enum CursorType newType) {
+	bool loadCursor = !hasLoadedCursor || _currentCursorType != newType;
 	_currentCursorType = newType;
+
+	if (loadCursor) {
+		const Sprite cursorSprite = g_engine->_baseSprites.getSpriteAt(_currentCursorType);
+		Graphics::Surface surf;
+		surf.create(cursorSprite.width, cursorSprite.height, Graphics::PixelFormat::createFormatCLUT8());
+		surf.copyRectToSurface(cursorSprite.pixels.data(), cursorSprite.pitch, 0, 0, cursorSprite.width, cursorSprite.height);
+		CursorMan.replaceCursor(surf, 0, 0, 0xf);
+	}
 }
 
 void Darkseed::Cursor::updatePosition(int16 x, int16 y) {
@@ -32,31 +42,6 @@ void Darkseed::Cursor::updatePosition(int16 x, int16 y) {
 //	debug("mouse at (%d,%d)", _x, _y);
 }
 
-void Darkseed::Cursor::draw() {
-	const Sprite cursorSprite = g_engine->_baseSprites.getSpriteAt(_currentCursorType);
-	int drawX = _position.x;
-	if (drawX + cursorSprite.width > 640) {
-		drawX = 640 - cursorSprite.width;
-	}
-	if (drawX < 0) {
-		drawX = 0;
-	}
-
-	int drawY = _position.y;
-	if (drawY + cursorSprite.height > 350) {
-		drawY = 350 - cursorSprite.height;
-	}
-	if (drawY < 0) {
-		drawY = 0;
-	}
-
-	if (_currentCursorType == HourGlass) {
-		g_engine->_baseSprites.getSpriteAt(_currentCursorType).draw(310, 20);
-	} else {
-		g_engine->_baseSprites.getSpriteAt(_currentCursorType).draw(drawX, drawY);
-	}
-}
-
 int Darkseed::Cursor::getWidth() {
 	return g_engine->_baseSprites.getSpriteAt(_currentCursorType).width;
 }
@@ -72,3 +57,7 @@ const Darkseed::Sprite &Darkseed::Cursor::getSprite() {
 const Darkseed::Sprite &Darkseed::Cursor::getSpriteForType(Darkseed::CursorType cursorType) {
 	return g_engine->_baseSprites.getSpriteAt(cursorType);
 }
+
+void Darkseed::Cursor::showCursor(bool showCursor) {
+	CursorMan.showMouse(showCursor);
+}
diff --git a/engines/darkseed/cursor.h b/engines/darkseed/cursor.h
index b29c7de6f82..986ac983d6d 100644
--- a/engines/darkseed/cursor.h
+++ b/engines/darkseed/cursor.h
@@ -41,9 +41,11 @@ class Cursor {
 private:
 	Common::Point _position;
 	enum CursorType _currentCursorType = Pointer;
+	bool hasLoadedCursor = false;
 
 public:
 
+	void showCursor(bool showCursor);
 	void setCursorType(enum CursorType newType);
 	CursorType getCursorType() { return _currentCursorType; }
 
@@ -58,7 +60,6 @@ public:
 	const Sprite &getSprite();
 	const Sprite &getSpriteForType(CursorType cursorType);
 	void updatePosition(int16 x, int16 y);
-	void draw();
 };
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 161ec135a40..fa7de03395e 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -96,6 +96,7 @@ Common::Error DarkseedEngine::run() {
 
 	_cursor.updatePosition(0x140,0xaf);
 	_cursor.setCursorType(Pointer);
+	_cursor.showCursor(true);
 
 	_player->_position.x = 0x87;
 	_player->_position.y = 0x5b;
@@ -172,6 +173,11 @@ void DarkseedEngine::fadeInner(int startValue, int endValue, int increment) {
 void DarkseedEngine::gameloop() {
 	while (!shouldQuit()) {
 		updateEvents();
+		if (_redrawFrame) {
+			_redrawFrame = false;
+			_screen->makeAllDirty();
+			_frame.draw();
+		}
 		if (_fullscreenPic) {
 			if (_isLeftMouseClicked || _isRightMouseClicked) {
 				_isRightMouseClicked = false;
@@ -306,6 +312,19 @@ void DarkseedEngine::gameloop() {
 				gotosleepinjail();
 			}
 			updateDisplay(); // Aka serviceRoom()
+
+			_screen->addDirtyRect({{0x45, 0x28}, 501, 200});
+
+			if (_fullscreenPic) {
+				_fullscreenPic->draw(0x45, 0x28);
+			} else {
+				_room->draw();
+				_inventory.draw();
+				_sprites.drawSprites();
+				_player->draw();
+				_console->draw();
+			}
+
 //			if (((*(int *)&_CursorX < 70) || (570 < *(int *)&_CursorX)) && (*(int *)&_DrawCursorNum < 90)) { TODO do we need this restriction?
 //				zeromousebuttons();
 //			}
@@ -331,18 +350,7 @@ void DarkseedEngine::gameloop() {
 			_isLeftMouseClicked = false;
 		}
 		_room->update();
-		_frame.draw();
-		if (_fullscreenPic) {
-			_fullscreenPic->draw(0x45, 0x28);
-		} else {
-			_room->draw();
-			_inventory.draw();
-			_sprites.drawSprites();
-			_player->draw();
-			_console->draw();
-			_cursor.draw();
-		}
-		_screen->makeAllDirty();
+
 		_screen->update();
 		wait();
 	}
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index da139e978e8..5175dda874f 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -63,17 +63,18 @@ class DarkseedEngine : public Engine {
 private:
 	const ADGameDescription *_gameDescription;
 	Common::RandomSource _randomSource;
-	Pic _frame;
 	Pic *_fullscreenPic = nullptr;
 	bool _timeAdvanceEventSelected = false;
 	uint8 _delbertspeech = 0;
 	int16 _yvec = 0; //delbert throw stick related.
 	bool _normalWorldSpritesLoaded = true;
+	bool _redrawFrame = true;
 
 protected:
 	// Engine APIs
 	Common::Error run() override;
 public:
+	Pic _frame;
 	bool _FrameAdvanced = false;
 	bool _ct_voice_status = false;
 	bool _isRightMouseClicked = false;
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 16d05b406fa..0d4c3a4e30a 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -24,6 +24,7 @@
 
 constexpr uint16 MAX_INVENTORY = 42;
 constexpr uint16 MAX_ICONS = 9;
+static constexpr Common::Rect drawArea = {{139,0}, 333, 40};
 
 Darkseed::Inventory::Inventory() {
 	_iconList.resize(MAX_ICONS);
@@ -89,9 +90,15 @@ void Darkseed::Inventory::update() {
 
 void Darkseed::Inventory::draw() {
 	if ((g_engine->_actionMode <= 4 && g_engine->_cursor.getY() > 40) || g_engine->isPlayingAnimation_maybe || (g_engine->_objectVar[141] >= 1 && g_engine->_objectVar[141] <= 3)) {
+		if (isVisible) {
+			g_engine->_frame.drawRect(drawArea);
+			g_engine->_screen->addDirtyRect(drawArea);
+			isVisible = false;
+		}
 		return;
 	}
 
+	isVisible = true;
 	for(int i = 0; i < _numIcons; i++) {
 		int icon = _iconList[i];
 		if (icon != 42 && icon != 43) {
@@ -105,6 +112,7 @@ void Darkseed::Inventory::draw() {
 		const Sprite &iconSprite = g_engine->_baseSprites.getSpriteAt(icon);
 		g_engine->_sprites.addSpriteToDrawList(140 + i * 37, 20 - iconSprite.height / 2, &iconSprite, 255, iconSprite.width, iconSprite.height, false);
 	}
+	g_engine->_screen->addDirtyRect(drawArea);
 }
 
 void Darkseed::Inventory::handleClick() {
diff --git a/engines/darkseed/inventory.h b/engines/darkseed/inventory.h
index b0f0bb0604d..53575a395d2 100644
--- a/engines/darkseed/inventory.h
+++ b/engines/darkseed/inventory.h
@@ -32,6 +32,7 @@ private:
 	Common::Array<uint8> _iconList;
 	int _viewOffset = 0;
 	int _numIcons = 0;
+	bool isVisible = false;
 
 public:
 	Inventory();
diff --git a/engines/darkseed/pic.cpp b/engines/darkseed/pic.cpp
index 1f6b44024bc..5ecd08ace24 100644
--- a/engines/darkseed/pic.cpp
+++ b/engines/darkseed/pic.cpp
@@ -96,3 +96,8 @@ void Darkseed::Pic::draw() {
 void Darkseed::Pic::draw(int xOffset, int yOffset) {
 	g_engine->_screen->copyRectToSurface(getPixels().data(), getWidth(), xOffset, yOffset, getWidth(), getHeight());
 }
+
+void Darkseed::Pic::drawRect(const Common::Rect &rect) {
+	void *ptr = getPixels().data() + rect.left + (rect.top * getWidth());
+	g_engine->_screen->copyRectToSurface(ptr, getWidth(), rect.left, rect.top, rect.width(), rect.height());
+}
diff --git a/engines/darkseed/pic.h b/engines/darkseed/pic.h
index c0e3d259539..c284d8f6dc7 100644
--- a/engines/darkseed/pic.h
+++ b/engines/darkseed/pic.h
@@ -23,8 +23,9 @@
 #define DARKSEED_PIC_H
 
 #include "common/array.h"
-#include "common/scummsys.h"
 #include "common/file.h"
+#include "common/rect.h"
+#include "common/scummsys.h"
 
 namespace Darkseed {
 
@@ -52,6 +53,7 @@ public:
 
 	void draw();
 	void draw(int xOffset, int yOffset);
+	void drawRect(const Common::Rect &rect);
 private:
 	bool load(Common::SeekableReadStream &readStream);
 


Commit: 6078023b07e394990a86b217187ffcfd01e8792e
    https://github.com/scummvm/scummvm/commit/6078023b07e394990a86b217187ffcfd01e8792e
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Get out of jail. Room palette updates.

Changed paths:
    engines/darkseed/console.cpp
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/pal.cpp
    engines/darkseed/pal.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h


diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index 530ef2dec72..d5e95405001 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -100,8 +100,14 @@ Common::Array<Common::String> Console::wrapText(const Common::String &text) {
 	}
 
 	if (!line.empty() || !word.empty()) {
-		line += word;
-		lines.push_back(line);
+		int wordLength = _font.stringLength(word);
+		if (lineLength + wordLength > consoleArea.width()) {
+			lines.push_back(line);
+			lines.push_back(word);
+		} else {
+			line += word;
+			lines.push_back(line);
+		}
 	}
 
 	return lines;
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index fa7de03395e..2a07eedb925 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1047,7 +1047,7 @@ void DarkseedEngine::loadRoom(int roomNumber) {
 	}
 }
 
-void DarkseedEngine::changeToRoom(int newRoomNumber) { // AKA LoadNewRoom
+void DarkseedEngine::changeToRoom(int newRoomNumber, bool placeDirectly) { // AKA LoadNewRoom
 	_objectVar[99] = 0;
 	_objectVar[66] = 0;
 	_objectVar[67] = 0;
@@ -1120,7 +1120,7 @@ void DarkseedEngine::changeToRoom(int newRoomNumber) { // AKA LoadNewRoom
 				_player->_walkTarget = _player->_position;
 			}
 		}
-	} else if (newRoomNumber != 0x22 && (newRoomNumber < 0x13 || newRoomNumber > 0x17)) {
+	} else if (!placeDirectly && newRoomNumber != 0x22 && (newRoomNumber < 0x13 || newRoomNumber > 0x17)) {
 		for (int i = 0; i < _room->room1.size(); i++) {
 			const RoomExit &roomExit = _room->room1[i];
 			if (roomExit.roomNumber == _previousRoomNumber) {
@@ -1309,7 +1309,10 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						_sprites.addSpriteToDrawList((_player->_position.x - animSprite.width / 2) - 4, _player->_position.y - animSprite.height, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 					} else if (otherNspAnimationType_maybe < 30 || otherNspAnimationType_maybe > 34) {
 						if (otherNspAnimationType_maybe == 40) {
-							error("anim 40 display"); // TODO
+							const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
+							_sprites.addSpriteToDrawList(373, 99, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+							const Sprite &legsSprite = _player->_animations.getSpriteAt(12);
+							_sprites.addSpriteToDrawList(373, 99 + animSprite.height, &legsSprite, 240 - _player->_position.y, legsSprite.width, legsSprite.height, player_sprite_related_2c85_82f3);
 						} else if (otherNspAnimationType_maybe < 48 || otherNspAnimationType_maybe > 52) {
 							if (otherNspAnimationType_maybe == 35) {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
@@ -2018,8 +2021,25 @@ void DarkseedEngine::updateAnimation() {
 			throwmikeinjail();
 		}
 		break;
-	case 40:
-		error("updateAnimation 40"); //TODO
+	case 40: // give Delbert's card to cop.
+		advanceAnimationFrame(1);
+		if (!_ObjRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
+		} else {
+			_console->printTosText(61);
+			_console->draw();
+			_screen->updateScreen();
+			waitxticks(60);
+			_previousRoomNumber = _room->_roomNumber;
+			_player->_position.x = 240;
+			_player->_position.y = 200;
+			_player->updateSprite();
+			isPlayingAnimation_maybe = false;
+			changeToRoom(15, true);
+			_inventory.removeItem(41);
+			_inventory.removeItem(18);
+			_objectVar.setMoveObjectRoom(41, 255);
+		}
 		break;
 	case 41:
 		advanceAnimationFrame(0);
@@ -3424,6 +3444,16 @@ void DarkseedEngine::updateBaseSprites() {
 		_frame.load("cframe.pic");
 		_normalWorldSpritesLoaded = true;
 	}
+	_redrawFrame = true;
+}
+
+void DarkseedEngine::waitxticks(int ticks) {
+	for (int i = 0; i < ticks * 6; i++) {
+		updateEvents();
+		_room->update();
+		_screen->updateScreen();
+		wait();
+	}
 }
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 5175dda874f..d789ae55129 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -215,7 +215,8 @@ public:
 	void getPackageObj(int packageType);
 	void libanim(bool pickingUpReservedBook);
 	void printTime();
-	void changeToRoom(int newRoomNumber);
+	void changeToRoom(int newRoomNumber, bool placeDirectly = false);
+	void waitxticks(int ticks);
 
 private:
 	void updateBaseSprites();
diff --git a/engines/darkseed/pal.cpp b/engines/darkseed/pal.cpp
index 4f97f266f98..d1374e23228 100644
--- a/engines/darkseed/pal.cpp
+++ b/engines/darkseed/pal.cpp
@@ -32,7 +32,7 @@ Pal::Pal(const Pal &pal) {
 	memcpy(palData, pal.palData, DARKSEED_PAL_SIZE);
 }
 
-bool Pal::load(const Common::Path &filename) {
+bool Pal::load(const Common::Path &filename, bool shouldInstallPalette) {
 	Common::File file;
 	if(!file.open(filename)) {
 		return false;
@@ -43,7 +43,9 @@ bool Pal::load(const Common::Path &filename) {
 	for (int i=0; i < DARKSEED_PAL_SIZE; i++) {
 		palData[i] = palData[i] << 2;
 	}
-	installPalette();
+	if (shouldInstallPalette) {
+		installPalette();
+	}
 	return true;
 }
 
diff --git a/engines/darkseed/pal.h b/engines/darkseed/pal.h
index f131f2e527a..41b9b0a4b03 100644
--- a/engines/darkseed/pal.h
+++ b/engines/darkseed/pal.h
@@ -36,7 +36,7 @@ public:
 public:
 	Pal() {};
 	Pal(const Pal &pal);
-	bool load(const Common::Path &filename);
+	bool load(const Common::Path &filename, bool shouldInstallPalette = true);
 	void installPalette();
 };
 
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 76919333e80..ad3d4d3b226 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -164,7 +164,7 @@ bool Darkseed::Room::load() {
 		}
 	}
 
-	_pal.load(g_engine->getPictureFilePath(Common::Path(Common::String::format("%s.pal", filenameBase.c_str()))));
+	_pal.load(g_engine->getPictureFilePath(Common::Path(Common::String::format("%s.pal", filenameBase.c_str()))), false);
 
 	loadLocationSprites(Common::Path(Common::String::format("%s.nsp", filenameBase.c_str())));
 
@@ -205,6 +205,10 @@ Common::String Darkseed::Room::stripSpaces(Common::String source) {
 }
 
 void Darkseed::Room::draw() {
+	if (!palLoaded) {
+		_pal.installPalette();
+		palLoaded = true;
+	}
 	pic.draw(0x45, 0x28);
 
 	// print walkable area map.
@@ -1334,7 +1338,7 @@ void Darkseed::Room::darkenSky() {
 
 void Darkseed::Room::loadLocationSprites(const Common::Path &path) {
 	_locationSprites.load(path);
-	for (int i = 0; i < 20; i++) {
+	for (int i = 0; i < _locationSprites.getTotalAnim(); i++) {
 		_locObjFrameTimer[i] = _locationSprites.getAnimAt(i).frameDuration[0];
 	}
 }
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index ec0915dae06..b176ccf3326 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -54,6 +54,8 @@ struct RoomObjElement {
 };
 
 class Room {
+private:
+	bool palLoaded = false;
 public:
 	static constexpr int MAX_CONNECTORS = 12;
 	uint8 _roomNumber;


Commit: 28adeda3efa30fefa5c261658797dfc6334889f3
    https://github.com/scummvm/scummvm/commit/28adeda3efa30fefa5c261658797dfc6334889f3
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Hack to show tin cup in jail cell.

Changed paths:
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index ad3d4d3b226..4a88e1f2c74 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -162,6 +162,9 @@ bool Darkseed::Room::load() {
 		if (roomObj.objNum < 42 && g_engine->_objectVar.getMoveObjectRoom(roomObj.objNum) != 255) {
 			removeObjectFromRoom(roomObj.objNum);
 		}
+		if (roomObj.objNum == 41 && roomObj.type == 0) { // TODO hack. figure out why the tincup doesn't show in the jail cell normally.
+			roomObj.type = 1;
+		}
 	}
 
 	_pal.load(g_engine->getPictureFilePath(Common::Path(Common::String::format("%s.pal", filenameBase.c_str()))), false);


Commit: 9fe3f9c398f5d5213e83a10a26d9f04c601fbd4e
    https://github.com/scummvm/scummvm/commit/9fe3f9c398f5d5213e83a10a26d9f04c601fbd4e
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Palette swap fixes.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 2a07eedb925..c8864578e2f 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -2738,6 +2738,8 @@ void DarkseedEngine::showFullscreenPic(const Common::Path &filename) {
 	Common::Path palFilename = Common::Path(filePathStr.substr(0, filePathStr.size() - 4) + ".pal");
 	Pal pal;
 	pal.load(g_engine->getPictureFilePath(palFilename));
+	_fullscreenPic->draw(0x45, 0x28);
+	_screen->addDirtyRect({{0x45, 0x28}, 501, 200});
 }
 
 void DarkseedEngine::keeperanim() {
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 4a88e1f2c74..1606ac5ea6a 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -1318,7 +1318,7 @@ void Darkseed::Room::loadRoom61AWalkableLocations() {
 }
 
 void Darkseed::Room::restorePalette() {
-	_pal.installPalette();
+	palLoaded = false;
 }
 
 void Darkseed::Room::darkenSky() {


Commit: e5eeffe8e018364adf8a92d2e9280c9c03d7691d
    https://github.com/scummvm/scummvm/commit/e5eeffe8e018364adf8a92d2e9280c9c03d7691d
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Add keeper, sargo and dcop anim sequences.

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/room.cpp
    engines/darkseed/usecode.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index c8864578e2f..4deca2dc3f6 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -197,7 +197,7 @@ void DarkseedEngine::gameloop() {
 				}
 			}
 			closeShops();
-			if (_room->_roomNumber == 57 && _objectVar.getMoveObjectRoom(28) == 255 && _previousRoomNumber == 54) {
+			if (_room->_roomNumber == 57 && _previousRoomNumber == 54) {
 				if (_objectVar.getMoveObjectRoom(28) == 255) {
 					if (_objectVar[56] == 4) {
 						playSound(21,5,-1);
@@ -208,8 +208,8 @@ void DarkseedEngine::gameloop() {
 						stuffPlayer();
 					}
 				} else {
-//					dcopanim(); TODO annoyingly this animation runs inside this function.
-					changeToRoom(59); // TODO implement don't place hero flag.
+					dcopanim();
+					changeToRoom(59, true);
 					_player->_position = {320, 200};
 					_player->updateSprite();
 					_inventory.gotoJailLogic();
@@ -2176,7 +2176,7 @@ void DarkseedEngine::updateAnimation() {
 			playSound(26, 5, -1);
 		}
 		break;
-	case 60:
+	case 60: // turn on alien computer
 		_room->advanceFrame(0);
 		if (!_ObjRestarted) {
 			_player->_frameIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
@@ -2185,7 +2185,7 @@ void DarkseedEngine::updateAnimation() {
 			_objectVar[187] = 1;
 		}
 		break;
-	case 61:
+	case 61: // turn off alien computer
 		_room->advanceFrame(1);
 		if (!_ObjRestarted) {
 			_player->_frameIdx = _room->_locationSprites.getAnimAt(1).frameNo[_room->_locObjFrame[1]];
@@ -2742,14 +2742,6 @@ void DarkseedEngine::showFullscreenPic(const Common::Path &filename) {
 	_screen->addDirtyRect({{0x45, 0x28}, 501, 200});
 }
 
-void DarkseedEngine::keeperanim() {
-	// TODO
-}
-
-void DarkseedEngine::sargoanim() {
-	// TODO
-}
-
 void DarkseedEngine::playCutscene(const Common::String cutsceneId) {
 	debug("Play Cutscene %s", cutsceneId.c_str()); // TODO play cutscenes.
 }
@@ -2790,7 +2782,7 @@ void DarkseedEngine::nextFrame(int nspAminIdx) {
 }
 
 void DarkseedEngine::stuffPlayer() {
-	// TODO
+	error("Implement stuffPlayer()"); // TODO
 }
 
 void DarkseedEngine::updateHeadache() {
@@ -3418,6 +3410,250 @@ void DarkseedEngine::libanim(bool pickingUpReservedBook) {
 	}
 }
 
+static constexpr uint8 dcopList[100] = {
+	0, 1, 2, 3,
+	2, 1, 2, 3,
+	2, 1, 0, 1,
+	2, 3, 2, 3,
+	2, 3, 2, 1,
+	0, 1, 2, 1,
+	2, 1, 2, 3,
+	2, 1, 0, 1,
+	2, 3, 2, 1,
+	2, 3, 2, 1,
+	0, 1, 2, 3,
+	2, 3, 2, 3,
+	2, 1, 0, 1,
+	2, 1, 2, 1,
+	2, 3, 2, 1,
+	0, 1, 2, 1,
+	2, 1, 2, 3,
+	2, 1, 0, 1,
+	2, 3, 2, 3,
+	2, 3, 2, 1,
+	0, 1, 2, 1,
+	2, 1, 2, 3,
+	2, 1, 0, 1,
+	2, 1, 2, 1,
+	2, 3, 2, 1};
+
+void DarkseedEngine::dcopanim() {
+	_player->loadAnimations("dcopb.nsp");
+	showFullscreenPic("dcopb.pic");
+	animIndexTbl[0] = 0;
+	spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0).frameDuration[0];
+
+	_sprites.clearSpriteDrawList();
+	_console->printTosText(923);
+
+	uint8 lipsIdx = 0;
+	while (_sound->isPlayingSpeech()) {
+		_sprites.clearSpriteDrawList();
+
+		if (_fullscreenPic) {
+			_fullscreenPic->draw(0x45, 0x28);
+		}
+		advanceAnimationFrame(0);
+		const Sprite &dcopSprite = _player->_animations.getSpriteAt(dcopList[lipsIdx]);
+		g_engine->_sprites.addSpriteToDrawList(310, 180, &dcopSprite, 255, dcopSprite.width, dcopSprite.height, false);
+		_sprites.drawSprites();
+
+		_console->draw();
+		_screen->makeAllDirty();
+		_screen->update();
+
+		lipsIdx++;
+		if (lipsIdx == 100) {
+			lipsIdx = 0;
+		}
+
+		for (int i = 0; i < 6; i++) {
+			wait();
+		}
+	}
+	removeFullscreenPic();
+}
+
+static constexpr uint8 keeperList[250] = {
+	10, 11, 12, 13,
+	12, 12, 13, 10,
+	11, 10, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	10, 10, 11, 11,
+	12, 12, 11, 12,
+	12, 13, 12, 12,
+	12, 13, 13, 12,
+	13, 12, 11, 12,
+	13, 12, 11, 10,
+	11, 12, 13, 10,
+	11, 10, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	0, 0, 1, 1,
+	2, 2, 3, 3,
+	4, 4, 5, 5,
+	6, 6, 7, 7,
+	8, 8, 9, 9,
+	10, 10, 11, 11,
+	12, 12, 11, 12,
+	12, 13, 12, 12,
+	12, 13, 13, 12,
+	13, 12, 11, 10,
+	10, 11, 12, 13,
+	12, 12, 13, 10,
+	11, 10, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	10, 11, 12, 13,
+	12, 12, 13, 10,
+	11, 10, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	10, 11, 12, 13,
+	12, 12, 13, 10,
+	11, 10, 10, 10,
+	11, 11, 12, 12,
+	11, 12, 12, 13,
+	12, 12, 12, 13,
+	13, 12, 13, 12,
+	11, 10, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	10, 11, 12, 13,
+	12, 12, 13, 10,
+	11, 10, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	10, 10, 11, 11,
+	12, 12, 11, 12,
+	12, 13, 12, 12,
+	12, 13, 13, 12,
+	13, 12, 11, 10,
+	0, 1, 2, 3,
+	4, 5, 6, 7,
+	8, 9, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0};
+
+void DarkseedEngine::keeperanim() {
+	_cursor.showCursor(false);
+	_player->loadAnimations("keeper.nsp");
+	showFullscreenPic("keeper.pic");
+	animIndexTbl[0] = 0;
+	spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0).frameDuration[0];
+
+	_console->printTosText(913);
+
+	uint8 dialogIdx = 73;
+	uint8 lipsIdx = 0;
+	while (_sound->isPlayingSpeech() || dialogIdx < 76) {
+		_sprites.clearSpriteDrawList();
+
+		if (_fullscreenPic) {
+			_fullscreenPic->draw(0x45, 0x28);
+		}
+		advanceAnimationFrame(0);
+		const Sprite &keeperSprite = _player->_animations.getSpriteAt(keeperList[lipsIdx]);
+		g_engine->_sprites.addSpriteToDrawList(254, 117, &keeperSprite, 255, keeperSprite.width, keeperSprite.height, false);
+		_sprites.drawSprites();
+
+		_console->draw();
+		_screen->makeAllDirty();
+		_screen->update();
+
+		lipsIdx++;
+		if (lipsIdx == 250) {
+			lipsIdx = 0;
+		}
+
+		if (!_sound->isPlayingSpeech()) {
+			dialogIdx++;
+			if (dialogIdx == 74) {
+				_console->printTosText(914);
+			} else if (dialogIdx == 75) {
+				_console->printTosText(915);
+			}
+		}
+		waitxticks(1);
+	}
+	removeFullscreenPic();
+	_cursor.showCursor(true);
+}
+
+static constexpr uint8 sargoList[100] = {
+	0, 1, 2, 3,
+	4, 3, 2, 1,
+	0, 1, 0, 1,
+	2, 3, 2, 3,
+	2, 3, 2, 1,
+	0, 1, 2, 3,
+	4, 3, 4, 3,
+	2, 1, 0, 1,
+	2, 3, 4, 3,
+	2, 1, 0, 1,
+	0, 1, 2, 3,
+	2, 3, 2, 3,
+	2, 1, 0, 1,
+	2, 3, 2, 1,
+	0, 4, 3, 2,
+	1, 1, 2, 3,
+	4, 3, 2, 1,
+	0, 1, 0, 1,
+	2, 3, 2, 3,
+	2, 3, 2, 1,
+	2, 1, 0, 0,
+	1, 2, 3, 2,
+	1, 0, 1, 2,
+	3, 4, 3, 2,
+	3, 2, 1, 1};
+
+void DarkseedEngine::sargoanim() {
+	_cursor.showCursor(false);
+	_player->loadAnimations("sargo.nsp");
+	showFullscreenPic("sargo.pic");
+	animIndexTbl[0] = 0;
+	spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0).frameDuration[0];
+
+	_console->printTosText(916);
+
+	uint8 dialogIdx = 79;
+	uint8 lipsIdx = 0;
+	while (_sound->isPlayingSpeech() || dialogIdx < 81) {
+		_sprites.clearSpriteDrawList();
+
+		if (_fullscreenPic) {
+			_fullscreenPic->draw(0x45, 0x28);
+		}
+		advanceAnimationFrame(0);
+		const Sprite &sargoSprite = _player->_animations.getSpriteAt(sargoList[lipsIdx]);
+		g_engine->_sprites.addSpriteToDrawList(334, 160, &sargoSprite, 255, sargoSprite.width, sargoSprite.height, false);
+		_sprites.drawSprites();
+
+		_console->draw();
+		_screen->makeAllDirty();
+		_screen->update();
+
+		lipsIdx++;
+		if (lipsIdx == 100) {
+			lipsIdx = 0;
+		}
+
+		if (!_sound->isPlayingSpeech()) {
+			dialogIdx++;
+			if (dialogIdx == 80) {
+				_console->printTosText(917);
+			}
+		}
+		waitxticks(1);
+	}
+	removeFullscreenPic();
+	_cursor.showCursor(true);
+}
+
 void DarkseedEngine::removeFullscreenPic() {
 	if (_fullscreenPic) {
 		delete _fullscreenPic;
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index d789ae55129..ffbd544cd32 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -209,6 +209,7 @@ public:
 	void playSound(int16 unk, uint8 unk1, int16 unk2);
 	void nextFrame(int nspAminIdx);
 	void stuffPlayer();
+	void dcopanim();
 
 	void throwmikeinjail();
 	void runObjects();
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 1606ac5ea6a..092fefa4319 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -1015,7 +1015,7 @@ void Darkseed::Room::runRoomObjects() {
 	}
 	if (_roomNumber == 56 && g_engine->_objectVar[187] == 1) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(3);
-		g_engine->_sprites.addSpriteToDrawList(490, 70, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(431, 66, &sprite, 255, sprite.width, sprite.height, false);
 	}
 	if (_roomNumber == 30 && g_engine->_objectVar[29] == 2) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 3aea3bf0d1c..04ea36c572e 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -157,7 +157,7 @@ int16 UseCode::getUseWatchTosIdx(uint16 objNum) {
 
 void Darkseed::UseCode::useCode(int objNum) {
 	debug("useCode: objNum = %d", objNum);
-	
+
 	if (objNum == 141) {
 		_console->addTextLine("You touch Delbert...");
 		return;
@@ -266,7 +266,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 		_console->printTosText(719);
 		return;
 	}
-	if (objNum == 187) {
+	if (objNum == 187) { //keeper computer screen
 		if (_objectVar[187] == 0) {
 			_console->printTosText(856);
 			g_engine->setupOtherNspAnimation(0, 60);


Commit: 031c0773310a8e240aebe6b8f2064ee4b2708f51
    https://github.com/scummvm/scummvm/commit/031c0773310a8e240aebe6b8f2064ee4b2708f51
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Add room change to exit dark world after ship has left.

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 4deca2dc3f6..695570834a0 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -186,6 +186,9 @@ void DarkseedEngine::gameloop() {
 			}
 		}
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
+		if (_isPlayingCutscene) {
+			updateCutscene();
+		}
 		if (systemTimerCounter == 5) {
 			if (_objectVar[1] != 0) {
 				if (_room->_roomNumber == 30) {
@@ -2714,7 +2717,7 @@ void DarkseedEngine::lookCode(int objNum) {
 }
 
 void DarkseedEngine::wongame() {
-	// TODO
+	error("implement wongame()"); // TODO
 }
 
 void DarkseedEngine::printTime() {
@@ -2744,6 +2747,21 @@ void DarkseedEngine::showFullscreenPic(const Common::Path &filename) {
 
 void DarkseedEngine::playCutscene(const Common::String cutsceneId) {
 	debug("Play Cutscene %s", cutsceneId.c_str()); // TODO play cutscenes.
+	_cutsceneId = cutsceneId;
+	_isPlayingCutscene = true;
+}
+
+void DarkseedEngine::updateCutscene() {
+	// TODO play cutscene here.
+
+	// HACK to get cut scene E to work.
+	if (_isPlayingCutscene) {
+		_isPlayingCutscene = false;
+		if (_cutsceneId == "E") {
+			_previousRoomNumber = 38;
+			changeToRoom(7);
+		}
+	}
 }
 
 void DarkseedEngine::getPackageObj(int packageType) {
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index ffbd544cd32..02f3c6eab8d 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -69,6 +69,8 @@ private:
 	int16 _yvec = 0; //delbert throw stick related.
 	bool _normalWorldSpritesLoaded = true;
 	bool _redrawFrame = true;
+	bool _isPlayingCutscene = false;
+	Common::String _cutsceneId;
 
 protected:
 	// Engine APIs
@@ -206,6 +208,7 @@ public:
 	void lookCode(int objNum);
 	void handleObjCollision(int targetObjNum);
 	void playCutscene(const Common::String cutsceneId);
+	void updateCutscene();
 	void playSound(int16 unk, uint8 unk1, int16 unk2);
 	void nextFrame(int nspAminIdx);
 	void stuffPlayer();


Commit: 514c9d4fe940773c257d20d8f6bcd4ac1f38f0da
    https://github.com/scummvm/scummvm/commit/514c9d4fe940773c257d20d8f6bcd4ac1f38f0da
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: redraw inventory when item removed.

Changed paths:
    engines/darkseed/inventory.cpp
    engines/darkseed/inventory.h


diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 0d4c3a4e30a..d13d603b174 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -24,7 +24,7 @@
 
 constexpr uint16 MAX_INVENTORY = 42;
 constexpr uint16 MAX_ICONS = 9;
-static constexpr Common::Rect drawArea = {{139,0}, 333, 40};
+static constexpr Common::Rect drawArea = {{139,0}, 334, 40};
 
 Darkseed::Inventory::Inventory() {
 	_iconList.resize(MAX_ICONS);
@@ -86,18 +86,28 @@ void Darkseed::Inventory::update() {
 		}
 	}
 	_numIcons = MIN(_inventoryLength + 1, 9);
+	redraw = true;
+}
+
+void Darkseed::Inventory::restoreFrame() {
+	g_engine->_frame.drawRect(drawArea);
+	g_engine->_screen->addDirtyRect(drawArea);
 }
 
 void Darkseed::Inventory::draw() {
 	if ((g_engine->_actionMode <= 4 && g_engine->_cursor.getY() > 40) || g_engine->isPlayingAnimation_maybe || (g_engine->_objectVar[141] >= 1 && g_engine->_objectVar[141] <= 3)) {
 		if (isVisible) {
-			g_engine->_frame.drawRect(drawArea);
-			g_engine->_screen->addDirtyRect(drawArea);
+			restoreFrame();
 			isVisible = false;
 		}
 		return;
 	}
 
+	if (redraw) {
+		restoreFrame();
+		redraw = false;
+	}
+
 	isVisible = true;
 	for(int i = 0; i < _numIcons; i++) {
 		int icon = _iconList[i];
diff --git a/engines/darkseed/inventory.h b/engines/darkseed/inventory.h
index 53575a395d2..f6a9ae4171d 100644
--- a/engines/darkseed/inventory.h
+++ b/engines/darkseed/inventory.h
@@ -33,6 +33,7 @@ private:
 	int _viewOffset = 0;
 	int _numIcons = 0;
 	bool isVisible = false;
+	bool redraw = false;
 
 public:
 	Inventory();
@@ -51,6 +52,7 @@ private:
 	void update();
 	void leftArrowClicked();
 	void rightArrowClicked();
+	void restoreFrame();
 
 };
 


Commit: 2f77fedad08e18a41218acd22bfd47c84b896af2
    https://github.com/scummvm/scummvm/commit/2f77fedad08e18a41218acd22bfd47c84b896af2
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Move cutscene logic into own class.

Changed paths:
  A engines/darkseed/cutscene.cpp
  A engines/darkseed/cutscene.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/module.mk
    engines/darkseed/usecode.cpp


diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
new file mode 100644
index 00000000000..e097d809e96
--- /dev/null
+++ b/engines/darkseed/cutscene.cpp
@@ -0,0 +1,64 @@
+/* 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 "cutscene.h"
+#include "darkseed.h"
+
+void Darkseed::Cutscene::play(char cutsceneId) {
+	_cutsceneId = cutsceneId;
+	_movieStep = 1;
+	g_engine->_sound->waitForSpeech();
+	g_engine->fadeOut();
+}
+
+
+void Darkseed::Cutscene::update() {
+	switch(_cutsceneId) {
+	case 'B' : _movieStep = 9999; break;
+	case 'C' : _movieStep = 9999; break;
+	case 'D' : _movieStep = 9999; break;
+	case 'E' : _movieStep = 9999; break;
+	case 'G' : _movieStep = 9999; break;
+	case 'H' : _movieStep = 9999; break;
+	case 'I' : introScene(); break;
+	case 'J' : _movieStep = 9999; break;
+	case 'Y' : _movieStep = 9999; break;
+	case 'Z' : _movieStep = 9999; break;
+	}
+
+	if (_movieStep == 9999) {
+		if (_cutsceneId == 'E') {
+			g_engine->_previousRoomNumber = 38;
+			g_engine->changeToRoom(7);
+		} else if (_cutsceneId == 'Z') {
+			g_engine->restartGame();
+		}
+	}
+}
+
+bool Darkseed::Cutscene::introScene() {
+	switch (_movieStep) {
+	case 1: g_engine->fadeOut(); break;
+	default: _movieStep = 9999; return false;
+	}
+	_movieStep++;
+	return true;
+}
diff --git a/engines/darkseed/cutscene.h b/engines/darkseed/cutscene.h
new file mode 100644
index 00000000000..3aa99eab619
--- /dev/null
+++ b/engines/darkseed/cutscene.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 DARKSEED_CUTSCENE_H
+#define DARKSEED_CUTSCENE_H
+
+#include "common/str.h"
+
+namespace Darkseed {
+
+class Cutscene {
+private:
+	char _cutsceneId;
+	uint16 _movieStep = 9999;
+public:
+	void play(char cutsceneId);
+	bool isPlaying() { return _movieStep != 9999; }
+	void update();
+
+private:
+	bool introScene();
+};
+
+}; // End of namespace Darkseed
+
+#endif // DARKSEED_CUTSCENE_H
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 695570834a0..7ba7e214c97 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -171,7 +171,7 @@ void DarkseedEngine::fadeInner(int startValue, int endValue, int increment) {
 }
 
 void DarkseedEngine::gameloop() {
-	while (!shouldQuit()) {
+	while (!shouldQuit() && !_restartGame) {
 		updateEvents();
 		if (_redrawFrame) {
 			_redrawFrame = false;
@@ -186,10 +186,9 @@ void DarkseedEngine::gameloop() {
 			}
 		}
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
-		if (_isPlayingCutscene) {
-			updateCutscene();
-		}
-		if (systemTimerCounter == 5) {
+		if (_cutscene.isPlaying()) {
+			_cutscene.update();
+		} else if (systemTimerCounter == 5) {
 			if (_objectVar[1] != 0) {
 				if (_room->_roomNumber == 30) {
 					if (!_inventory.hasObject(18)) {
@@ -1094,7 +1093,7 @@ void DarkseedEngine::changeToRoom(int newRoomNumber, bool placeDirectly) { // AK
 	} else if (newRoomNumber == 46 && _previousRoomNumber == 60 && _objectVar[57] == 1) {
 		_console->printTosText(62);
 		// TODO wait logic here.
-		g_engine->playCutscene("E");
+		_cutscene.play('E');
 		return;
 	} else if (newRoomNumber == 7 && _previousRoomNumber == 38) {
 		_player->loadAnimations("mirror.nsp");
@@ -2718,6 +2717,7 @@ void DarkseedEngine::lookCode(int objNum) {
 
 void DarkseedEngine::wongame() {
 	error("implement wongame()"); // TODO
+	//	_cutscene.play('Z');
 }
 
 void DarkseedEngine::printTime() {
@@ -2745,29 +2745,10 @@ void DarkseedEngine::showFullscreenPic(const Common::Path &filename) {
 	_screen->addDirtyRect({{0x45, 0x28}, 501, 200});
 }
 
-void DarkseedEngine::playCutscene(const Common::String cutsceneId) {
-	debug("Play Cutscene %s", cutsceneId.c_str()); // TODO play cutscenes.
-	_cutsceneId = cutsceneId;
-	_isPlayingCutscene = true;
-}
-
-void DarkseedEngine::updateCutscene() {
-	// TODO play cutscene here.
-
-	// HACK to get cut scene E to work.
-	if (_isPlayingCutscene) {
-		_isPlayingCutscene = false;
-		if (_cutsceneId == "E") {
-			_previousRoomNumber = 38;
-			changeToRoom(7);
-		}
-	}
-}
-
 void DarkseedEngine::getPackageObj(int packageType) {
 	_console->printTosText(424);
 	if (packageType == 1) {
-		playCutscene("D");
+		_cutscene.play('D');
 	}
 	if (packageType == 2) {
 		_inventory.addItem(15);
@@ -2799,10 +2780,6 @@ void DarkseedEngine::nextFrame(int nspAminIdx) {
 	}
 }
 
-void DarkseedEngine::stuffPlayer() {
-	error("Implement stuffPlayer()"); // TODO
-}
-
 void DarkseedEngine::updateHeadache() {
 	headAcheMessageCounter++;
 	headAcheMessageCounter &= 63;
@@ -2839,11 +2816,11 @@ void DarkseedEngine::gotonextmorning() {
 
 void DarkseedEngine::playDayChangeCutscene() {
 	if (_currentDay == 4) {
-		playCutscene("Y");
+		_cutscene.play('Y');
 	} else if (_currentDay == 2) {
-		playCutscene("B");
+		_cutscene.play('B');
 	} else if (_currentDay == 3) {
-		playCutscene("C");
+		_cutscene.play('C');
 	}
 }
 
@@ -3424,7 +3401,7 @@ void DarkseedEngine::libanim(bool pickingUpReservedBook) {
 	if (pickingUpReservedBook) {
 		_objectVar[49] = 1;
 		_objectVar[62] = 0;
-		playCutscene("G");
+		_cutscene.play('G');
 	}
 }
 
@@ -3602,6 +3579,42 @@ void DarkseedEngine::keeperanim() {
 	_cursor.showCursor(true);
 }
 
+void DarkseedEngine::stuffPlayer() {
+	_cursor.showCursor(false);
+	_player->loadAnimations("labparts.nsp");
+	showFullscreenPic("lab.pic");
+	const Sprite &alienSprite = _player->_animations.getSpriteAt(8);
+
+	bool updateCounter = false;
+	int counter = 0;
+	while (counter < 8) {
+		_sprites.clearSpriteDrawList();
+
+		if (_fullscreenPic) {
+			_fullscreenPic->draw(0x45, 0x28);
+		}
+		const Sprite &mikeSprite = _player->_animations.getSpriteAt(counter);
+		g_engine->_sprites.addSpriteToDrawList(103, 93, &mikeSprite, 255, mikeSprite.width, mikeSprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(226, 100, &alienSprite, 255, alienSprite.width, alienSprite.height, false);
+
+		_sprites.drawSprites();
+
+		_console->draw();
+		_screen->makeAllDirty();
+		_screen->update();
+
+		updateCounter = !updateCounter;
+		if (updateCounter) {
+			counter++;
+		}
+		waitxticks(1);
+	}
+	waitxticks(3);
+	removeFullscreenPic();
+	_cursor.showCursor(true);
+	_cutscene.play('Z');
+}
+
 static constexpr uint8 sargoList[100] = {
 	0, 1, 2, 3,
 	4, 3, 2, 1,
@@ -3711,5 +3724,8 @@ void DarkseedEngine::waitxticks(int ticks) {
 		wait();
 	}
 }
+void DarkseedEngine::restartGame() {
+	_restartGame = true;
+}
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 02f3c6eab8d..5f9f164e7a8 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -36,6 +36,7 @@
 
 #include "console.h"
 #include "cursor.h"
+#include "cutscene.h"
 #include "darkseed/detection.h"
 #include "inventory.h"
 #include "nsp.h"
@@ -69,8 +70,7 @@ private:
 	int16 _yvec = 0; //delbert throw stick related.
 	bool _normalWorldSpritesLoaded = true;
 	bool _redrawFrame = true;
-	bool _isPlayingCutscene = false;
-	Common::String _cutsceneId;
+	bool _restartGame = false;
 
 protected:
 	// Engine APIs
@@ -95,6 +95,7 @@ public:
 	Objects _objectVar;
 	Inventory _inventory;
 	UseCode *_useCode = nullptr;
+	Cutscene _cutscene;
 
 	uint8 _currentDay = 1;
 	int _currentTimeInSeconds = 0x7e8e;
@@ -201,14 +202,14 @@ public:
 	void fadeIn();
 	void fadeOut();
 
+	void restartGame();
+
 	void updateDisplay();
 	void setupOtherNspAnimation(int nspAnimIdx, int animId);
 	void debugTeleportToRoom(int newRoomNumber, int entranceNumber);
 	void showFullscreenPic(const Common::Path &filename);
 	void lookCode(int objNum);
 	void handleObjCollision(int targetObjNum);
-	void playCutscene(const Common::String cutsceneId);
-	void updateCutscene();
 	void playSound(int16 unk, uint8 unk1, int16 unk2);
 	void nextFrame(int nspAminIdx);
 	void stuffPlayer();
diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
index fbb5af23b08..c8981f07d84 100644
--- a/engines/darkseed/module.mk
+++ b/engines/darkseed/module.mk
@@ -20,7 +20,8 @@ MODULE_OBJS = \
 	objects.o \
 	inventory.o \
 	sound.o \
-	usecode.o
+	usecode.o \
+	cutscene.o
 
 # This module can be built as a plugin
 ifeq ($(ENABLE_DARKSEED), DYNAMIC_PLUGIN)
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 04ea36c572e..9470bcf5859 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -1753,7 +1753,7 @@ void UseCode::putobjunderpillow(int objNum) {
 }
 
 void UseCode::gancanim() {
-	// TODO
+	error("implement gancanim()"); // TODO
 }
 
 static constexpr bool diggingxflipTbl[12] = {


Commit: ed39fa92bb48815aec6973f60ae5edfc248f22b4
    https://github.com/scummvm/scummvm/commit/ed39fa92bb48815aec6973f60ae5edfc248f22b4
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Title sequence cutscene.

Changed paths:
    engines/darkseed/cutscene.cpp
    engines/darkseed/cutscene.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/pal.cpp
    engines/darkseed/pal.h


diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index e097d809e96..eba5a9c10a6 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -22,6 +22,10 @@
 #include "cutscene.h"
 #include "darkseed.h"
 
+Darkseed::Cutscene::~Cutscene() {
+	delete titleFont;
+}
+
 void Darkseed::Cutscene::play(char cutsceneId) {
 	_cutsceneId = cutsceneId;
 	_movieStep = 1;
@@ -50,6 +54,10 @@ void Darkseed::Cutscene::update() {
 			g_engine->changeToRoom(7);
 		} else if (_cutsceneId == 'Z') {
 			g_engine->restartGame();
+		} else if (_cutsceneId == 'I') {
+			delete titleFont;
+			titleFont = nullptr;
+			g_engine->newGame();
 		}
 	}
 }
@@ -57,6 +65,37 @@ void Darkseed::Cutscene::update() {
 bool Darkseed::Cutscene::introScene() {
 	switch (_movieStep) {
 	case 1: g_engine->fadeOut(); break;
+	case 2: if (g_engine->fadeStep()) { return true; } break;
+	case 3: {
+		g_engine->_screen->clear();
+		_palette.load("art/house.pal");
+		if (titleFont == nullptr) {
+			titleFont = new TitleFont();
+		}
+		titleFont->displayString(68,160, "DEVELOPING NEW WAYS TO AMAZE");
+		g_engine->fadeIn();
+	}
+		break;
+	case 4: if (g_engine->fadeStep()) { return true; } break;
+	case 5: g_engine->fadeOut(); break;
+	case 6: if (g_engine->fadeStep()) { return true; } break;
+	case 7:
+		g_engine->_screen->clear();
+		_palette.installPalette();
+		titleFont->displayString(222,160, "CYBERDREAMS");
+		g_engine->fadeIn();
+		break;
+	case 8: if (g_engine->fadeStep()) { return true; } break;
+	case 9: g_engine->fadeOut(); break;
+	case 10: if (g_engine->fadeStep()) { return true; } break;
+	case 11:
+		g_engine->_screen->clear();
+		_palette.installPalette();
+		titleFont->displayString(250,160, "PRESENTS");
+		g_engine->fadeIn();
+		break;
+	case 12: if (g_engine->fadeStep()) { return true; } break;
+	case 13: g_engine->fadeOut(); break;
 	default: _movieStep = 9999; return false;
 	}
 	_movieStep++;
diff --git a/engines/darkseed/cutscene.h b/engines/darkseed/cutscene.h
index 3aa99eab619..523796d0d84 100644
--- a/engines/darkseed/cutscene.h
+++ b/engines/darkseed/cutscene.h
@@ -23,6 +23,8 @@
 #define DARKSEED_CUTSCENE_H
 
 #include "common/str.h"
+#include "pal.h"
+#include "titlefont.h"
 
 namespace Darkseed {
 
@@ -30,7 +32,11 @@ class Cutscene {
 private:
 	char _cutsceneId;
 	uint16 _movieStep = 9999;
+	TitleFont *titleFont = nullptr;
+	Pal _palette;
+
 public:
+	virtual ~Cutscene();
 	void play(char cutsceneId);
 	bool isPlaying() { return _movieStep != 9999; }
 	void update();
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 7ba7e214c97..a048021657b 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -82,11 +82,6 @@ Common::Error DarkseedEngine::run() {
 	Img letterD1;
 	lettersAnm.getImg(7, letterD1);
 
-	Pal housePalette;
-	housePalette.load("art/house.pal");
-	TitleFont titleFont;
-	titleFont.displayString(0x44, 0xa0, "DEVELOPING NEW WAYS TO AMAZE");
-
 	// Set the engine's debugger console
 	setDebugger(new DebugConsole(_tosText));
 
@@ -129,7 +124,13 @@ Common::Error DarkseedEngine::run() {
 		}
 	}
 
-	gameloop();
+	while (!shouldQuit()) {
+		gameloop();
+		_restartGame = false;
+		if (!shouldQuit()) {
+			_cutscene.play('I');
+		}
+	}
 
 	delete _room;
 	delete _player;
@@ -159,15 +160,27 @@ Common::Error DarkseedEngine::syncGame(Common::Serializer &s) {
 	}
 	return Common::kNoError;
 }
+
 void DarkseedEngine::fadeOut() {
+	_fadeDirection = FadeDirection::OUT;
+	_fadeStepCounter = 0;
+	_fadeTempPalette.loadFromScreen();
 }
 
 void DarkseedEngine::fadeIn() {
-
+	_fadeDirection = FadeDirection::IN;
+	_fadeStepCounter = 0;
+	_fadeTargetPalette.loadFromScreen();
+	_fadeTempPalette.clear();
+	_fadeTempPalette.installPalette();
 }
 
-void DarkseedEngine::fadeInner(int startValue, int endValue, int increment) {
-
+bool DarkseedEngine::fadeStep() {
+	if (_fadeStepCounter < 16) {
+		_fadeTempPalette.updatePalette(_fadeDirection == FadeDirection::OUT ? -16 : 16, _fadeTargetPalette);
+		_fadeStepCounter++;
+	}
+	return _fadeStepCounter < 16;
 }
 
 void DarkseedEngine::gameloop() {
@@ -317,14 +330,16 @@ void DarkseedEngine::gameloop() {
 
 			_screen->addDirtyRect({{0x45, 0x28}, 501, 200});
 
-			if (_fullscreenPic) {
-				_fullscreenPic->draw(0x45, 0x28);
-			} else {
-				_room->draw();
-				_inventory.draw();
-				_sprites.drawSprites();
-				_player->draw();
-				_console->draw();
+			if (!_cutscene.isPlaying()) {
+				if (_fullscreenPic) {
+					_fullscreenPic->draw(0x45, 0x28);
+				} else {
+					_room->draw();
+					_inventory.draw();
+					_sprites.drawSprites();
+					_player->draw();
+					_console->draw();
+				}
 			}
 
 //			if (((*(int *)&_CursorX < 70) || (570 < *(int *)&_CursorX)) && (*(int *)&_DrawCursorNum < 90)) { TODO do we need this restriction?
@@ -3611,6 +3626,7 @@ void DarkseedEngine::stuffPlayer() {
 	}
 	waitxticks(3);
 	removeFullscreenPic();
+	_sprites.clearSpriteDrawList();
 	_cursor.showCursor(true);
 	_cutscene.play('Z');
 }
@@ -3728,4 +3744,29 @@ void DarkseedEngine::restartGame() {
 	_restartGame = true;
 }
 
+void DarkseedEngine::newGame() {
+	_sprites.clearSpriteDrawList();
+	removeFullscreenPic();
+	_inventory.reset();
+	_sound->resetSpeech();
+	_objectVar.reset();
+	_room->_roomNumber = 0;
+	changeToRoom(0);
+	_player->loadAnimations("bedsleep.nsp");
+	_player->_position.x = 0x87;
+	_player->_position.y = 0x5b;
+	_player->_frameIdx = 0;
+	_player->_direction = 1;
+	setupOtherNspAnimation(0, 1);
+	//		bVar1 = true;
+	if (_currentDay == 1) {
+		_console->printTosText(8);
+	} else if (_currentDay == 2) {
+		_console->printTosText(0xc);
+	} else if (_currentDay == 3) {
+		_console->printTosText(0xe);
+	}
+
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 5f9f164e7a8..58d46bd5ee0 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -52,7 +52,7 @@ namespace Darkseed {
 
 struct DarkseedGameDescription;
 
-enum ActionMode {
+enum ActionMode : uint8 {
 	PointerAction = 0,
 	HandAction = 2,
 	LookAction = 3,
@@ -60,6 +60,12 @@ enum ActionMode {
 	Unk27Action = 27,
 };
 
+enum class FadeDirection : uint8 {
+	NONE,
+	IN,
+	OUT
+};
+
 class DarkseedEngine : public Engine {
 private:
 	const ADGameDescription *_gameDescription;
@@ -72,6 +78,11 @@ private:
 	bool _redrawFrame = true;
 	bool _restartGame = false;
 
+	FadeDirection _fadeDirection = FadeDirection::NONE;
+	uint8 _fadeStepCounter = 0;
+	Pal _fadeTempPalette;
+	Pal _fadeTargetPalette;
+
 protected:
 	// Engine APIs
 	Common::Error run() override;
@@ -201,8 +212,10 @@ public:
 
 	void fadeIn();
 	void fadeOut();
+	bool fadeStep();
 
 	void restartGame();
+	void newGame();
 
 	void updateDisplay();
 	void setupOtherNspAnimation(int nspAnimIdx, int animId);
@@ -227,7 +240,6 @@ private:
 	void updateBaseSprites();
 	void updateAnimation();
 	void advanceAnimationFrame(int nspAminIdx);
-	void fadeInner(int startValue, int endValue, int increment);
 	void gameloop();
 	void updateEvents();
 	void handleInput();
diff --git a/engines/darkseed/pal.cpp b/engines/darkseed/pal.cpp
index d1374e23228..5815e5075bc 100644
--- a/engines/darkseed/pal.cpp
+++ b/engines/darkseed/pal.cpp
@@ -29,6 +29,10 @@ namespace Darkseed {
 #define DARKSEED_PAL_SIZE DARKSEED_NUM_PAL_ENTRIES * 3
 
 Pal::Pal(const Pal &pal) {
+	load(pal);
+}
+
+void Pal::load(const Pal &pal) {
 	memcpy(palData, pal.palData, DARKSEED_PAL_SIZE);
 }
 
@@ -49,6 +53,29 @@ bool Pal::load(const Common::Path &filename, bool shouldInstallPalette) {
 	return true;
 }
 
+void Pal::loadFromScreen() {
+	g_system->getPaletteManager()->grabPalette(palData, 0, DARKSEED_NUM_PAL_ENTRIES);
+}
+
+void Pal::clear() {
+	memset(palData, 0, DARKSEED_PAL_SIZE);
+}
+
+void Pal::updatePalette(int delta, const Pal &targetPal, bool shouldInstallPalette) {
+	for (int i = 0; i < DARKSEED_PAL_SIZE; i++) {
+		int c = palData[i] + delta;
+		if (c < 0) {
+			c = 0;
+		} else if (delta > 0 && c > targetPal.palData[i]) {
+			c = targetPal.palData[i];
+		}
+		palData[i] = (uint8)c;
+	}
+	if (shouldInstallPalette) {
+		installPalette();
+	}
+}
+
 void Pal::installPalette() {
 	g_system->getPaletteManager()->setPalette(palData, 0, DARKSEED_NUM_PAL_ENTRIES);
 }
diff --git a/engines/darkseed/pal.h b/engines/darkseed/pal.h
index 41b9b0a4b03..ec7752e64f4 100644
--- a/engines/darkseed/pal.h
+++ b/engines/darkseed/pal.h
@@ -36,7 +36,11 @@ public:
 public:
 	Pal() {};
 	Pal(const Pal &pal);
+	void loadFromScreen();
+	void load(const Pal &pal);
 	bool load(const Common::Path &filename, bool shouldInstallPalette = true);
+	void clear();
+	void updatePalette(int delta, const Pal &targetPal, bool shouldInstallPalette = true);
 	void installPalette();
 };
 


Commit: f65e04332cc83b474bffcc69dea25942cbea5f8f
    https://github.com/scummvm/scummvm/commit/f65e04332cc83b474bffcc69dea25942cbea5f8f
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Title sequence animation + credits

Changed paths:
    engines/darkseed/cutscene.cpp
    engines/darkseed/cutscene.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/img.cpp
    engines/darkseed/img.h
    engines/darkseed/titlefont.cpp


diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index eba5a9c10a6..a8a4f9f3a00 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -30,6 +30,7 @@ void Darkseed::Cutscene::play(char cutsceneId) {
 	_cutsceneId = cutsceneId;
 	_movieStep = 1;
 	g_engine->_sound->waitForSpeech();
+	g_engine->_cursor.showCursor(false);
 	g_engine->fadeOut();
 }
 
@@ -62,6 +63,8 @@ void Darkseed::Cutscene::update() {
 	}
 }
 
+static constexpr int _CREDITS_DELAY = 25;
+
 bool Darkseed::Cutscene::introScene() {
 	switch (_movieStep) {
 	case 1: g_engine->fadeOut(); break;
@@ -73,7 +76,7 @@ bool Darkseed::Cutscene::introScene() {
 			titleFont = new TitleFont();
 		}
 		titleFont->displayString(68,160, "DEVELOPING NEW WAYS TO AMAZE");
-		g_engine->fadeIn();
+		g_engine->fadeIn(_palette);
 	}
 		break;
 	case 4: if (g_engine->fadeStep()) { return true; } break;
@@ -81,23 +84,264 @@ bool Darkseed::Cutscene::introScene() {
 	case 6: if (g_engine->fadeStep()) { return true; } break;
 	case 7:
 		g_engine->_screen->clear();
-		_palette.installPalette();
 		titleFont->displayString(222,160, "CYBERDREAMS");
-		g_engine->fadeIn();
+		g_engine->fadeIn(_palette);
 		break;
 	case 8: if (g_engine->fadeStep()) { return true; } break;
 	case 9: g_engine->fadeOut(); break;
 	case 10: if (g_engine->fadeStep()) { return true; } break;
 	case 11:
 		g_engine->_screen->clear();
-		_palette.installPalette();
 		titleFont->displayString(250,160, "PRESENTS");
-		g_engine->fadeIn();
+		g_engine->fadeIn(_palette);
 		break;
 	case 12: if (g_engine->fadeStep()) { return true; } break;
 	case 13: g_engine->fadeOut(); break;
+	case 14: if (g_engine->fadeStep()) { return true; } break;
+	case 15: {
+		g_engine->_screen->clear();
+		g_engine->_screen->clearPalette();
+		g_engine->_screen->makeAllDirty();
+		_palette.load("art/ship.pal", false);
+		Img left00Img;
+		left00Img.load("art/left00.img");
+		left00Img.draw();
+		Img left01Img;
+		left01Img.load("art/left01.img");
+		left01Img.draw();
+		Img i001Img;
+		i001Img.load("art/i001.img");
+		i001Img.draw(1);
+		break;
+	}
+	case 16: g_engine->fadeIn(_palette); break;
+	case 17: if (g_engine->fadeStep()) { return true; } break;
+	case 18: _animation.load("art/shipin.anm");
+		_animIdx = 0;
+		_animCount = 47;
+		break;
+	case 19:
+		if (stepAnim()) {
+			return true;
+		}
+		break;
+	case 20:
+		_animIdx = 47;
+		_animCount = _animIdx + 29;
+		break;
+	case 21:
+		if (stepAnim()) {
+			return true;
+		}
+		break;
+	case 22: _animation.load("art/t2.anm");
+		_animIdx = 0;
+		_animCount = 50;
+		break;
+	case 23:
+		if (stepAnim()) {
+			return true;
+		}
+		break;
+	case 24: {
+		g_engine->_screen->clear();
+		g_engine->_screen->makeAllDirty();
+		_palette.load("art/house.pal");
+		Img tmImg;
+		tmImg.load("art/tm.img");
+		tmImg.draw();
+		Img versionImg;
+		versionImg.load("art/version.img");
+		versionImg.draw();
+		putHouse();
+		Img titleImg;
+		titleImg.load("art/title.img");
+		titleImg.draw(1);
+		versionImg.load("art/version.img");
+		versionImg.draw();
+		registTime();
+		break;
+	}
+	case 25: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 26:
+		putHouse();
+		registTime();
+		g_engine->_screen->makeAllDirty();
+		break;
+	case 27: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 28:
+		putHouse();
+		registTime();
+		titleFont->displayString(155, 90, "EXECUTIVE PRODUCERS");
+		titleFont->displayString(200, 130, "PATRICK KETCHUM");
+		titleFont->displayString(236, 160, "ROLF KLUG");
+		titleFont->displayString(236, 190, "JEAN KLUG");
+		g_engine->_screen->makeAllDirty();
+		break;
+	case 29: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 30:
+		putHouse();
+		registTime();
+		titleFont->displayString(236, 95, "PRODUCERS");
+		titleFont->displayString(200, 135, "HARALD SEELEY");
+		titleFont->displayString(218, 165, "MIKE DAWSON");
+		g_engine->_screen->makeAllDirty();
+		break;
+	case 31: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 32:
+		putHouse();
+		registTime();
+		titleFont->displayString(245, 95, "DESIGNERS");
+		titleFont->displayString(209, 135, "MIKE CRANFORD");
+		titleFont->displayString(227, 165, "MIKE DAWSON");
+		g_engine->_screen->makeAllDirty();
+		break;
+	case 33: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 34:
+		putHouse();
+		registTime();
+		titleFont->displayString(227, 95, "PROGRAMMERS");
+		titleFont->displayString(164, 135, "LENNARD FEDDERSEN");
+		titleFont->displayString(227, 165, "JOHN KRAUSE");
+		titleFont->displayString(245, 195, "GARY VICK");
+		g_engine->_screen->makeAllDirty();
+		break;
+	case 35: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 36:
+		putHouse();
+		registTime();
+		titleFont->displayString(200, 100, "MUSICAL SCORE");
+		titleFont->displayString(200, 140, "GREGORY ALPER");
+		g_engine->_screen->makeAllDirty();
+		break;
+	case 37: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 38:
+		putHouse();
+		registTime();
+		titleFont->displayString(119, 100, "MUSIC AND SOUND EFFECTS");
+		titleFont->displayString(200, 140, "DAVID A. BEAN");
+		g_engine->_screen->makeAllDirty();
+		break;
+	case 39: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 40:
+		putHouse();
+		registTime();
+		titleFont->displayString(218, 100, "ART DIRECTOR");
+		titleFont->displayString(236, 140, "BRUMMBAER");
+		g_engine->_screen->makeAllDirty();
+		break;
+	case 41: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 42:
+		putHouse();
+		registTime();
+		titleFont->displayString(164, 100, "ASST. ART DIRECTOR");
+		titleFont->displayString(191, 140, "PAUL DRZEWIECKI");
+		g_engine->_screen->makeAllDirty();
+		break;
+	case 43: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 44:
+		putHouse();
+		registTime();
+		titleFont->displayString(200, 100, "DARK WORLD ART");
+		titleFont->displayString(245, 140, "H.R. GIGER");
+		g_engine->_screen->makeAllDirty();
+		break;
+	case 45: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 46:
+		putHouse();
+		registTime();
+		titleFont->displayString(182, 90, "COMPUTER ARTISTS");
+		titleFont->displayString(227, 130, "JULIA ULANO");
+		titleFont->displayString(191, 160, "JOBY ROME-OTERO");
+		titleFont->displayString(236, 190, "PAUL RYAN");
+		g_engine->_screen->makeAllDirty();
+		break;
+	case 47: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 48:
+		putHouse();
+		registTime();
+		titleFont->displayString(236, 100, "GAME TEXT");
+		titleFont->displayString(209, 140, "MICHEL HORVAT");
+		g_engine->_screen->makeAllDirty();
+		break;
+	case 49: if (waitTime(_CREDITS_DELAY)) {
+			return true;
+		}
+		break;
+	case 50: // TODO wait for music.
+		break;
+	case 51: g_engine->fadeOut(); break;
+	case 52: if (g_engine->fadeStep()) { return true; } break;
 	default: _movieStep = 9999; return false;
 	}
 	_movieStep++;
 	return true;
 }
+
+bool Darkseed::Cutscene::stepAnim() {
+	Img animFrame;
+	_animation.getImg(_animIdx, animFrame);
+	animFrame.draw(1);
+	_animIdx++;
+	if (_animIdx < _animCount) {
+		return true;
+	}
+	return false;
+}
+
+void Darkseed::Cutscene::putHouse() {
+	Img dollImg;
+	dollImg.load("art/bdoll0.img");
+	dollImg.draw();
+	Img doll1Img;
+	doll1Img.load("art/bdoll1.img");
+	doll1Img.draw();
+	Img houseFrameImg;
+	houseFrameImg.load("art/house.img");
+	houseFrameImg.draw(1);
+}
+
+void Darkseed::Cutscene::registTime() {
+	_startTime = g_system->getMillis();
+}
+
+bool Darkseed::Cutscene::waitTime(int16 duration) {
+	return g_system->getMillis() < _startTime + (duration * 100);
+}
+
diff --git a/engines/darkseed/cutscene.h b/engines/darkseed/cutscene.h
index 523796d0d84..935176b3b60 100644
--- a/engines/darkseed/cutscene.h
+++ b/engines/darkseed/cutscene.h
@@ -34,6 +34,10 @@ private:
 	uint16 _movieStep = 9999;
 	TitleFont *titleFont = nullptr;
 	Pal _palette;
+	Anm _animation;
+	int _animIdx;
+	int _animCount;
+	uint32 _startTime = 0;
 
 public:
 	virtual ~Cutscene();
@@ -43,6 +47,12 @@ public:
 
 private:
 	bool introScene();
+	bool stepAnim();
+
+	void putHouse();
+
+	void registTime();
+	bool waitTime(int16 duration);
 };
 
 }; // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index a048021657b..8cfc1709244 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -70,18 +70,6 @@ Common::Error DarkseedEngine::run() {
 	_player = new Player();
 	_useCode = new UseCode(_console, _player, _objectVar, _inventory);
 
-	Img left00Img;
-	left00Img.load("art/left00.img");
-	Img left01Img;
-	left01Img.load("art/left01.img");
-
-	Anm lettersAnm;
-	lettersAnm.load("art/letters.anm");
-	Img letterD;
-	lettersAnm.getImg(6, letterD);
-	Img letterD1;
-	lettersAnm.getImg(7, letterD1);
-
 	// Set the engine's debugger console
 	setDebugger(new DebugConsole(_tosText));
 
@@ -105,23 +93,7 @@ Common::Error DarkseedEngine::run() {
 	if (saveSlot != -1) {
 		(void)loadGameState(saveSlot);
 	} else {
-		if (prefsCutsceneId == 'I' || ((prefsCutsceneId == 'S' || prefsCutsceneId == 'B' || prefsCutsceneId == 'C') &&
-			  _room->_roomNumber == 0)) {
-			_player->loadAnimations("bedsleep.nsp");
-			_player->_position.x = 0x87;
-			_player->_position.y = 0x5b;
-			_player->_frameIdx = 0;
-			_player->_direction = 1;
-			setupOtherNspAnimation(0, 1);
-	//		bVar1 = true;
-			if (_currentDay == 1) {
-				_console->printTosText(8);
-			} else if (_currentDay == 2) {
-				_console->printTosText(0xc);
-			} else if (_currentDay == 3) {
-				_console->printTosText(0xe);
-			}
-		}
+		_cutscene.play('I');
 	}
 
 	while (!shouldQuit()) {
@@ -167,20 +139,20 @@ void DarkseedEngine::fadeOut() {
 	_fadeTempPalette.loadFromScreen();
 }
 
-void DarkseedEngine::fadeIn() {
+void DarkseedEngine::fadeIn(const Pal &palette) {
 	_fadeDirection = FadeDirection::IN;
 	_fadeStepCounter = 0;
-	_fadeTargetPalette.loadFromScreen();
+	_fadeTargetPalette.load(palette);
 	_fadeTempPalette.clear();
 	_fadeTempPalette.installPalette();
 }
 
 bool DarkseedEngine::fadeStep() {
-	if (_fadeStepCounter < 16) {
-		_fadeTempPalette.updatePalette(_fadeDirection == FadeDirection::OUT ? -16 : 16, _fadeTargetPalette);
+	if (_fadeStepCounter < 32) {
+		_fadeTempPalette.updatePalette(_fadeDirection == FadeDirection::OUT ? -8 : 8, _fadeTargetPalette);
 		_fadeStepCounter++;
 	}
-	return _fadeStepCounter < 16;
+	return _fadeStepCounter < 32;
 }
 
 void DarkseedEngine::gameloop() {
@@ -200,7 +172,9 @@ void DarkseedEngine::gameloop() {
 		}
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
 		if (_cutscene.isPlaying()) {
-			_cutscene.update();
+//			if (systemTimerCounter == 5) {
+				_cutscene.update();
+//			}
 		} else if (systemTimerCounter == 5) {
 			if (_objectVar[1] != 0) {
 				if (_room->_roomNumber == 30) {
@@ -3736,7 +3710,7 @@ void DarkseedEngine::waitxticks(int ticks) {
 	for (int i = 0; i < ticks * 6; i++) {
 		updateEvents();
 		_room->update();
-		_screen->updateScreen();
+		_screen->update();
 		wait();
 	}
 }
@@ -3745,6 +3719,8 @@ void DarkseedEngine::restartGame() {
 }
 
 void DarkseedEngine::newGame() {
+	_redrawFrame = true;
+	_cursor.showCursor(true);
 	_sprites.clearSpriteDrawList();
 	removeFullscreenPic();
 	_inventory.reset();
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 58d46bd5ee0..18a16ded4f7 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -210,7 +210,7 @@ public:
 	Common::Path getRoomFilePath(const Common::Path &filename);
 	Common::Path getPictureFilePath(const Common::Path &filename);
 
-	void fadeIn();
+	void fadeIn(const Pal &palette);
 	void fadeOut();
 	bool fadeStep();
 
diff --git a/engines/darkseed/img.cpp b/engines/darkseed/img.cpp
index dc588366ac5..2a30f772559 100644
--- a/engines/darkseed/img.cpp
+++ b/engines/darkseed/img.cpp
@@ -22,6 +22,7 @@
 #include "img.h"
 #include "common/debug.h"
 #include "common/file.h"
+#include "darkseed.h"
 
 namespace Darkseed {
 
@@ -68,13 +69,13 @@ bool Img::unpackRLE(Common::SeekableReadStream &readStream, Common::Array<byte>
 			uint8 count = byte & 0x7f;
 			count++;
 			byte = readStream.readByte();
-			for (int i = 0; i < count; i++) {
+			for (int i = 0; i < count && idx + i < size; i++) {
 				buf[idx + i] = byte;
 			}
 			idx += count;
 		} else {
 			uint8 count = byte + 1;
-			for (int i = 0; i < count; i++) {
+			for (int i = 0; i < count && idx + i < size; i++) {
 				buf[idx + i] = readStream.readByte();
 			}
 			idx += count;
@@ -105,5 +106,32 @@ Common::Array<uint8> &Img::getPixels() {
 	return pixels;
 }
 
+void Img::draw(int drawMode) {
+	drawAt(x, y, drawMode);
+}
+
+void Img::drawAt(uint16 xPos, uint16 yPos, int drawMode, int drawWidth) {
+	if (drawMode != 0) {
+		uint8 *screen = (uint8 *)g_engine->_screen->getBasePtr(xPos, yPos);
+		uint8 *imgPixels = pixels.data();
+		for (int sy = 0; sy < height; sy++) {
+			int w = drawWidth != 0 ? drawWidth : width;
+			for (int sx = 0; sx < w; sx++) {
+				if (drawMode == 1 && imgPixels[sx] != 0) {
+					screen[sx] ^= imgPixels[sx];
+				} else if (drawMode == 2 && imgPixels[sx] != 15) {
+					screen[sx] &= imgPixels[sx];
+				} else if (drawMode == 3 && imgPixels[sx] != 0) {
+					screen[sx] |= imgPixels[sx];
+				}
+			}
+			imgPixels += width;
+			screen += g_engine->_screen->pitch;
+		}
+	} else {
+		g_engine->_screen->copyRectToSurface(pixels.data(), width, xPos, yPos, width, height);
+	}
+	g_engine->_screen->addDirtyRect({{(int16)xPos, (int16)yPos}, (int16)width, (int16)height});
+}
 
 } // namespace Darkseed
\ No newline at end of file
diff --git a/engines/darkseed/img.h b/engines/darkseed/img.h
index 0da31cc6c7a..e000c5718ec 100644
--- a/engines/darkseed/img.h
+++ b/engines/darkseed/img.h
@@ -39,6 +39,8 @@ public:
 	bool load(const Common::Path &filename);
 	bool load(Common::SeekableReadStream &readStream);
 	bool loadWithoutPosition(Common::SeekableReadStream &readStream);
+	void draw(int drawMode = 0);
+	void drawAt(uint16 xPos, uint16 yPos, int drawMode = 0, int drawWidth = 0);
 
 	Common::Array<uint8> &getPixels();
 	uint16 getX() const {
diff --git a/engines/darkseed/titlefont.cpp b/engines/darkseed/titlefont.cpp
index 5f90ab63d92..c6a43c75d0c 100644
--- a/engines/darkseed/titlefont.cpp
+++ b/engines/darkseed/titlefont.cpp
@@ -30,29 +30,29 @@ TitleFont::TitleFont() {
 	letters.load("art/letters.anm");
 }
 
-int letterIndexLookupTbl[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-							  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-							  0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04,
-							  0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12,
-							  0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x00,
-							  0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c,
-							  0x2e, 0x30 };
+uint8 letterIndexLookupTbl[] = {
+	50, 52, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 2, 4, 6,
+	8, 10, 12, 14,
+	16, 18, 20, 22,
+	24, 26, 28, 30,
+	0, 32, 34, 36,
+	38, 40, 42, 44,
+	46, 48
+};
 
 int16 letterWidthLookupTbl[] = {
- 0x12,  0x12,    0x12,    0x12,
- 0x12,  0x12,    0x12,    0x12,
- 0xA,  0xC,    0x10,    0x12,
- 0x14,  0x14,    0x12,    0x12,
- 0x12,  0x12,    0x12,    0x12,
- 0x12,  0x14,    0x14,    0x12,
- 0x14,  0x12,    0xA,    0x0,
- 0x0,  -1,    0x0,    0x0,
- 0x0,  0x0,    0x0,    0x0,
- 0x0,  0x0,    0x0,    0x0,
- 0x0,  0x0,    0x0,    0x0,
- 0x0,  0x0,    0x0,    0x0,
- 0x0,  0x0,    0x0,    0x0,
- 0x0,  0x0
+	18, 18, 18, 18,
+	18, 18, 18, 18,
+	10, 12, 16, 18,
+	20, 20, 18, 18,
+	18, 18, 18, 18,
+	18, 20, 20, 18,
+	20, 18, 10
 };
 
 void TitleFont::displayString(uint16 x, uint16 y, const Common::String &text) {
@@ -63,14 +63,15 @@ void TitleFont::displayString(uint16 x, uint16 y, const Common::String &text) {
 		}
 		Img letterShadow;
 		Img letter;
-		int letterId = letterIndexLookupTbl[text[i] - 0x2f];
-		letters.getImg(letterId, letterShadow);
-		letters.getImg(letterId+1, letter);
+		int letterId = letterIndexLookupTbl[text[i] - 45];
+		letters.getImg(letterId, letterShadow, false);
+		letters.getImg(letterId+1, letter, false);
 
-		g_engine->_screen->copyRectToSurfaceWithKey(letterShadow.getPixels().data(), letterShadow.getWidth(), x, y, letterShadow.getWidth(), letterShadow.getHeight(), 0xf);
-		g_engine->_screen->copyRectToSurfaceWithKey(letter.getPixels().data(), letter.getWidth(), x + 1, y, letter.getWidth(), letter.getHeight(), 0);
-		debug("%c %d %d", text[i], letterWidthLookupTbl[text[i] - 0x41], letter.getWidth());
-		x += letterWidthLookupTbl[text[i] - 0x41]; //letter.getWidth();
+		int w = letterWidthLookupTbl[letterId / 2];
+		letterShadow.drawAt(x, y, 2, w - 1); // TODO the original doesn't seem to need to override the width here.
+		letter.drawAt(x, y + 1, 3);
+		debug("%c %d %d %d", text[i], w, letter.getWidth(), letterShadow.getWidth());
+		x += w;
 	}
 }
 


Commit: e12f67ab1aae33ec63e88032afd37b54d2def630
    https://github.com/scummvm/scummvm/commit/e12f67ab1aae33ec63e88032afd37b54d2def630
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Title sequence animation + credits

Changed paths:
    engines/darkseed/anm.cpp
    engines/darkseed/anm.h


diff --git a/engines/darkseed/anm.cpp b/engines/darkseed/anm.cpp
index 164650f31d6..075f1f1279a 100644
--- a/engines/darkseed/anm.cpp
+++ b/engines/darkseed/anm.cpp
@@ -24,6 +24,9 @@
 
 namespace Darkseed {
 bool Anm::load(const Common::Path &filename) {
+	if (file.isOpen()) {
+		file.close();
+	}
 	if(!file.open(filename)) {
 		return false;
 	}
@@ -33,13 +36,22 @@ bool Anm::load(const Common::Path &filename) {
 	return true;
 }
 
-bool Anm::getImg(uint16 index, Img &img) {
+bool Anm::getImg(uint16 index, Img &img, bool includesPosition) {
 	file.seek(4 + index * 2);
 	int offset = file.readUint16LE();
 	file.seek((offset*16) + (4 + numRecords * 2));
-	img.loadWithoutPosition(file);
+	if (includesPosition) {
+		img.load(file);
+	} else {
+		img.loadWithoutPosition(file);
+	}
 	debug("Loaded %d (%d,%d) (%d,%d) %x", index, img.getX(), img.getY(), img.getWidth(), img.getHeight(), 0);
 
 	return false;
 }
+
+int Anm::numImages() {
+	return numRecords;
+}
+
 } // namespace Darkseed
\ No newline at end of file
diff --git a/engines/darkseed/anm.h b/engines/darkseed/anm.h
index ae00dbb1813..04e657ec27e 100644
--- a/engines/darkseed/anm.h
+++ b/engines/darkseed/anm.h
@@ -35,7 +35,8 @@ private:
 
 public:
 	bool load(const Common::Path &filename);
-	bool getImg(uint16 index, Img &img);
+	bool getImg(uint16 index, Img &img, bool includesPosition = true);
+	int numImages();
 };
 
 } // namespace Darkseed


Commit: 7a161b08c9865b2e15fe00560b02bc4d32dc87bd
    https://github.com/scummvm/scummvm/commit/7a161b08c9865b2e15fe00560b02bc4d32dc87bd
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Title sequence animation embryo insertion

Changed paths:
    engines/darkseed/cutscene.cpp
    engines/darkseed/cutscene.h
    engines/darkseed/darkseed.cpp


diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index a8a4f9f3a00..438b928fcac 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -44,7 +44,7 @@ void Darkseed::Cutscene::update() {
 	case 'G' : _movieStep = 9999; break;
 	case 'H' : _movieStep = 9999; break;
 	case 'I' : introScene(); break;
-	case 'J' : _movieStep = 9999; break;
+	case 'J' : embryoInsertedScene(); break;
 	case 'Y' : _movieStep = 9999; break;
 	case 'Z' : _movieStep = 9999; break;
 	}
@@ -56,6 +56,8 @@ void Darkseed::Cutscene::update() {
 		} else if (_cutsceneId == 'Z') {
 			g_engine->restartGame();
 		} else if (_cutsceneId == 'I') {
+			play('J');
+		} else if (_cutsceneId == 'J') {
 			delete titleFont;
 			titleFont = nullptr;
 			g_engine->newGame();
@@ -119,6 +121,7 @@ bool Darkseed::Cutscene::introScene() {
 	case 18: _animation.load("art/shipin.anm");
 		_animIdx = 0;
 		_animCount = 47;
+		runAnim();
 		break;
 	case 19:
 		if (stepAnim()) {
@@ -128,6 +131,7 @@ bool Darkseed::Cutscene::introScene() {
 	case 20:
 		_animIdx = 47;
 		_animCount = _animIdx + 29;
+		runAnim();
 		break;
 	case 21:
 		if (stepAnim()) {
@@ -137,6 +141,7 @@ bool Darkseed::Cutscene::introScene() {
 	case 22: _animation.load("art/t2.anm");
 		_animIdx = 0;
 		_animCount = 50;
+		runAnim();
 		break;
 	case 23:
 		if (stepAnim()) {
@@ -314,11 +319,99 @@ bool Darkseed::Cutscene::introScene() {
 	return true;
 }
 
+bool Darkseed::Cutscene::embryoInsertedScene() {
+	switch (_movieStep) {
+	case 1:
+	case 2: break;
+	case 3:
+		g_engine->_screen->clear();
+		g_engine->_screen->makeAllDirty();
+		_palette.load("art/ship.pal");
+		_animation.load("art/nm1.anm");
+		g_engine->_screen->clearPalette();
+		break;
+	case 4: {
+		Img tmImg;
+		tmImg.load("art/nmf0.img");
+		tmImg.draw();
+		Img nmf1Img;
+		nmf1Img.load("art/nmf1.img");
+		nmf1Img.draw();
+		break;
+	}
+	case 5: {
+		Img tmImg;
+		tmImg.load("art/nm101.img");
+		tmImg.draw(1);
+		break;
+	}
+	case 6:
+		// TODO play implant music here.
+		registTime();
+		g_engine->fadeIn(_palette);
+		break;
+	case 7: if (g_engine->fadeStep()) { return true; } break;
+	case 8:
+		_animIdx = 0;
+		_animCount = 39;
+		runAnim();
+		break;
+	case 9:
+		if (stepAnim()) {
+			return true;
+		}
+		registTime();
+		break;
+	case 10: if (waitTime(30)) {
+			return true;
+		}
+		break;
+	case 11:
+		g_engine->fadeOut();
+		break;
+	case 12: if (g_engine->fadeStep()) { return true; } break;
+	case 13: {
+		g_engine->_screen->clear();
+		_palette.load("art/house.pal");
+		if (titleFont == nullptr) {
+			titleFont = new TitleFont();
+		}
+		titleFont->displayString(80,130, "AFTER A HORRIFYING NIGHTMARE");
+		titleFont->displayString(80,170, "MIKE DAWSON AWAKENS TO THE");
+		titleFont->displayString(80,210, "FIRST DAY IN HIS NEW HOUSE...");
+		g_engine->fadeIn(_palette);
+		break;
+	}
+	case 14: if (g_engine->fadeStep()) { return true; }
+		registTime();
+		break;
+	case 15: if (waitTime(30)) {
+			return true;
+		}
+		break;
+	case 16:
+		g_engine->fadeOut();
+		break;
+	case 17: if (g_engine->fadeStep()) { return true; } break;
+	default: _movieStep = 9999; return false;
+	}
+	_movieStep++;
+	return true;
+}
+
 bool Darkseed::Cutscene::stepAnim() {
-	Img animFrame;
-	_animation.getImg(_animIdx, animFrame);
-	animFrame.draw(1);
-	_animIdx++;
+	if (_animDelayCount == 0) {
+		Img animFrame;
+		_animation.getImg(_animIdx, animFrame);
+		animFrame.draw(1);
+		_animIdx++;
+	}
+
+	_animDelayCount++;
+	if (_animDelayCount == 6) {
+		_animDelayCount = 0;
+	}
+
 	if (_animIdx < _animCount) {
 		return true;
 	}
@@ -345,3 +438,6 @@ bool Darkseed::Cutscene::waitTime(int16 duration) {
 	return g_system->getMillis() < _startTime + (duration * 100);
 }
 
+void Darkseed::Cutscene::runAnim() {
+	_animDelayCount = 0;
+}
diff --git a/engines/darkseed/cutscene.h b/engines/darkseed/cutscene.h
index 935176b3b60..4c5676e724d 100644
--- a/engines/darkseed/cutscene.h
+++ b/engines/darkseed/cutscene.h
@@ -37,6 +37,7 @@ private:
 	Anm _animation;
 	int _animIdx;
 	int _animCount;
+	int _animDelayCount;
 	uint32 _startTime = 0;
 
 public:
@@ -47,6 +48,8 @@ public:
 
 private:
 	bool introScene();
+	bool embryoInsertedScene();
+	void runAnim();
 	bool stepAnim();
 
 	void putHouse();
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 8cfc1709244..5c5937170cb 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -148,11 +148,11 @@ void DarkseedEngine::fadeIn(const Pal &palette) {
 }
 
 bool DarkseedEngine::fadeStep() {
-	if (_fadeStepCounter < 32) {
-		_fadeTempPalette.updatePalette(_fadeDirection == FadeDirection::OUT ? -8 : 8, _fadeTargetPalette);
+	if (_fadeStepCounter < 64) {
+		_fadeTempPalette.updatePalette(_fadeDirection == FadeDirection::OUT ? -4 : 4, _fadeTargetPalette);
 		_fadeStepCounter++;
 	}
-	return _fadeStepCounter < 32;
+	return _fadeStepCounter < 64;
 }
 
 void DarkseedEngine::gameloop() {
@@ -172,9 +172,7 @@ void DarkseedEngine::gameloop() {
 		}
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
 		if (_cutscene.isPlaying()) {
-//			if (systemTimerCounter == 5) {
 				_cutscene.update();
-//			}
 		} else if (systemTimerCounter == 5) {
 			if (_objectVar[1] != 0) {
 				if (_room->_roomNumber == 30) {


Commit: 7d6104d0f94661b5403591ee51754f7367a0dd35
    https://github.com/scummvm/scummvm/commit/7d6104d0f94661b5403591ee51754f7367a0dd35
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Ship launch sequence

Changed paths:
    engines/darkseed/cutscene.cpp
    engines/darkseed/cutscene.h


diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index 438b928fcac..3b70d1c57ff 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -40,7 +40,7 @@ void Darkseed::Cutscene::update() {
 	case 'B' : _movieStep = 9999; break;
 	case 'C' : _movieStep = 9999; break;
 	case 'D' : _movieStep = 9999; break;
-	case 'E' : _movieStep = 9999; break;
+	case 'E' : shipLaunchScene(); break;
 	case 'G' : _movieStep = 9999; break;
 	case 'H' : _movieStep = 9999; break;
 	case 'I' : introScene(); break;
@@ -130,7 +130,7 @@ bool Darkseed::Cutscene::introScene() {
 		break;
 	case 20:
 		_animIdx = 47;
-		_animCount = _animIdx + 29;
+		_animCount = 29;
 		runAnim();
 		break;
 	case 21:
@@ -399,12 +399,88 @@ bool Darkseed::Cutscene::embryoInsertedScene() {
 	return true;
 }
 
-bool Darkseed::Cutscene::stepAnim() {
+bool Darkseed::Cutscene::shipLaunchScene() {
+	switch (_movieStep) {
+	case 1: {
+		_palette.load("art/ship.pal");
+		_animation.load("art/left.anm");
+		Img left00Img;
+		left00Img.load("art/left00.img");
+		left00Img.draw();
+		Img left01Img;
+		left01Img.load("art/left01.img");
+		left01Img.draw();
+		g_engine->_screen->clearPalette();
+		break;
+	}
+	case 2: g_engine->fadeIn(_palette); break;
+	case 3: if (g_engine->fadeStep()) { return true; } break;
+	case 4:
+		// TODO play music 'launch'
+		_animIdx = 2;
+		_animCount = 49;
+		runAnim();
+		break;
+	case 5:
+		if (stepAnim(1)) {
+			return true;
+		}
+		break;
+	case 6:
+		_animation.load("art/shipin.anm");
+		_animIdx = 75;
+		_animCount = 29;
+		runAnim(-1);
+		break;
+	case 7:
+		if (stepAnim()) {
+			return true;
+		}
+		break;
+	case 8: if (waitTime(20)) {
+			return true;
+		}
+		break;
+	case 9:
+		_animIdx = 46;
+		_animCount = 47;
+		runAnim(-1);
+		break;
+	case 10:
+		if (stepAnim()) {
+			return true;
+		}
+		break;
+	case 11:
+		_animation.load("art/left2.anm");
+		_animIdx = 0;
+		_animCount = 23;
+		runAnim();
+		break;
+	case 12:
+		if (stepAnim()) {
+			return true;
+		}
+		break;
+	case 13:
+		g_engine->fadeOut();
+		break;
+	case 14: if (g_engine->fadeStep()) { return true; } break;
+	default:
+		_movieStep = 9999;
+		return false;
+	}
+	_movieStep++;
+	return true;
+}
+
+bool Darkseed::Cutscene::stepAnim(int drawMode) {
 	if (_animDelayCount == 0) {
 		Img animFrame;
 		_animation.getImg(_animIdx, animFrame);
-		animFrame.draw(1);
-		_animIdx++;
+		animFrame.draw(drawMode);
+		_animIdx += _animDirection;
+		_animCount--;
 	}
 
 	_animDelayCount++;
@@ -412,7 +488,7 @@ bool Darkseed::Cutscene::stepAnim() {
 		_animDelayCount = 0;
 	}
 
-	if (_animIdx < _animCount) {
+	if (_animCount > 0) {
 		return true;
 	}
 	return false;
@@ -438,6 +514,7 @@ bool Darkseed::Cutscene::waitTime(int16 duration) {
 	return g_system->getMillis() < _startTime + (duration * 100);
 }
 
-void Darkseed::Cutscene::runAnim() {
+void Darkseed::Cutscene::runAnim(int direction) {
 	_animDelayCount = 0;
+	_animDirection = direction;
 }
diff --git a/engines/darkseed/cutscene.h b/engines/darkseed/cutscene.h
index 4c5676e724d..c6d1872ce31 100644
--- a/engines/darkseed/cutscene.h
+++ b/engines/darkseed/cutscene.h
@@ -38,6 +38,7 @@ private:
 	int _animIdx;
 	int _animCount;
 	int _animDelayCount;
+	int _animDirection;
 	uint32 _startTime = 0;
 
 public:
@@ -49,8 +50,9 @@ public:
 private:
 	bool introScene();
 	bool embryoInsertedScene();
-	void runAnim();
-	bool stepAnim();
+	bool shipLaunchScene();
+	void runAnim(int direction=1);
+	bool stepAnim(int drawMode = 1);
 
 	void putHouse();
 


Commit: 336bb12700941fedd6e4ca200174f049e4c2d73e
    https://github.com/scummvm/scummvm/commit/336bb12700941fedd6e4ca200174f049e4c2d73e
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Alien born sequence

Changed paths:
    engines/darkseed/cutscene.cpp
    engines/darkseed/cutscene.h
    engines/darkseed/darkseed.h


diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index 3b70d1c57ff..642a577d0be 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -45,7 +45,7 @@ void Darkseed::Cutscene::update() {
 	case 'H' : _movieStep = 9999; break;
 	case 'I' : introScene(); break;
 	case 'J' : embryoInsertedScene(); break;
-	case 'Y' : _movieStep = 9999; break;
+	case 'Y' : alienBornScene(); break;
 	case 'Z' : _movieStep = 9999; break;
 	}
 
@@ -61,6 +61,8 @@ void Darkseed::Cutscene::update() {
 			delete titleFont;
 			titleFont = nullptr;
 			g_engine->newGame();
+		} else if (_cutsceneId == 'Y') {
+			play('I');
 		}
 	}
 }
@@ -316,6 +318,12 @@ bool Darkseed::Cutscene::introScene() {
 	default: _movieStep = 9999; return false;
 	}
 	_movieStep++;
+	if (g_engine->_isLeftMouseClicked || g_engine->_isRightMouseClicked) {
+		g_engine->zeromousebuttons();
+		if (_movieStep < 51) {
+			_movieStep = 51;
+		}
+	}
 	return true;
 }
 
@@ -358,6 +366,12 @@ bool Darkseed::Cutscene::embryoInsertedScene() {
 		break;
 	case 9:
 		if (stepAnim()) {
+			if (g_engine->_isLeftMouseClicked || g_engine->_isRightMouseClicked) {
+				g_engine->zeromousebuttons();
+				if (_movieStep < 16) {
+					_movieStep = 16;
+				}
+			}
 			return true;
 		}
 		registTime();
@@ -396,6 +410,12 @@ bool Darkseed::Cutscene::embryoInsertedScene() {
 	default: _movieStep = 9999; return false;
 	}
 	_movieStep++;
+	if (g_engine->_isLeftMouseClicked || g_engine->_isRightMouseClicked) {
+		g_engine->zeromousebuttons();
+		if (_movieStep < 16) {
+			_movieStep = 16;
+		}
+	}
 	return true;
 }
 
@@ -436,6 +456,7 @@ bool Darkseed::Cutscene::shipLaunchScene() {
 		if (stepAnim()) {
 			return true;
 		}
+		registTime();
 		break;
 	case 8: if (waitTime(20)) {
 			return true;
@@ -474,6 +495,59 @@ bool Darkseed::Cutscene::shipLaunchScene() {
 	return true;
 }
 
+bool Darkseed::Cutscene::alienBornScene() {
+	switch (_movieStep) {
+	case 1: {
+		_palette.load("art/ship.pal");
+		Img left00Img;
+		left00Img.load("art/nmf0.img");
+		left00Img.draw();
+		Img left01Img;
+		left01Img.load("art/nmf1.img");
+		left01Img.draw();
+		Img born1Img;
+		born1Img.load("art/born01.img");
+		born1Img.draw(1);
+		g_engine->_screen->clearPalette();
+		break;
+	}
+	case 2:
+		_animation.load("art/born.anm");
+		// TODO play alien music here.
+		g_engine->fadeIn(_palette);
+		break;
+	case 3: if (g_engine->fadeStep()) { return true; } break;
+	case 4:
+		_animIdx = 0;
+		_animCount = 31;
+		// TODO speed = 2
+		runAnim();
+		break;
+	case 5:
+		if (stepAnim()) {
+			return true;
+		}
+		registTime();
+		break;
+	case 6: if (waitTime(30)) {
+			return true;
+		}
+		break;
+	case 7:
+		g_engine->fadeOut();
+		break;
+	case 8: if (g_engine->fadeStep()) { return true; } break;
+	case 9:
+		// TODO some logic here. stopSequence.
+		break;
+	default:
+		_movieStep = 9999;
+		return false;
+	}
+	_movieStep++;
+	return true;
+}
+
 bool Darkseed::Cutscene::stepAnim(int drawMode) {
 	if (_animDelayCount == 0) {
 		Img animFrame;
diff --git a/engines/darkseed/cutscene.h b/engines/darkseed/cutscene.h
index c6d1872ce31..d2de04ca9c2 100644
--- a/engines/darkseed/cutscene.h
+++ b/engines/darkseed/cutscene.h
@@ -51,6 +51,8 @@ private:
 	bool introScene();
 	bool embryoInsertedScene();
 	bool shipLaunchScene();
+	bool alienBornScene();
+
 	void runAnim(int direction=1);
 	bool stepAnim(int drawMode = 1);
 
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 18a16ded4f7..f7fb1cbd448 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -150,6 +150,8 @@ public:
 
 	int16 _SoundTimer = 0;
 	bool _printedcomeheredawson = false;
+	void zeromousebuttons();
+
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	~DarkseedEngine() override;
@@ -264,7 +266,6 @@ private:
 	void leavepackage();
 
 	void removeFullscreenPic();
-	void zeromousebuttons();
 };
 
 extern DarkseedEngine *g_engine;


Commit: c0431bae729c97221fa120648bfb21a688c51b73
    https://github.com/scummvm/scummvm/commit/c0431bae729c97221fa120648bfb21a688c51b73
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix path on engine include files

Changed paths:
    engines/darkseed/anm.cpp
    engines/darkseed/anm.h
    engines/darkseed/console.h
    engines/darkseed/cursor.cpp
    engines/darkseed/cursor.h
    engines/darkseed/cutscene.cpp
    engines/darkseed/cutscene.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/debugconsole.cpp
    engines/darkseed/debugconsole.h
    engines/darkseed/gamefont.cpp
    engines/darkseed/gamefont.h
    engines/darkseed/img.cpp
    engines/darkseed/img.h
    engines/darkseed/inventory.cpp
    engines/darkseed/nsp.cpp
    engines/darkseed/nsp.h
    engines/darkseed/objects.cpp
    engines/darkseed/objects.h
    engines/darkseed/pal.cpp
    engines/darkseed/pal.h
    engines/darkseed/pic.cpp
    engines/darkseed/player.cpp
    engines/darkseed/player.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h
    engines/darkseed/sound.cpp
    engines/darkseed/sprites.cpp
    engines/darkseed/sprites.h
    engines/darkseed/titlefont.cpp
    engines/darkseed/titlefont.h
    engines/darkseed/tostext.cpp
    engines/darkseed/usecode.cpp
    engines/darkseed/usecode.h


diff --git a/engines/darkseed/anm.cpp b/engines/darkseed/anm.cpp
index 075f1f1279a..3ebda1073e8 100644
--- a/engines/darkseed/anm.cpp
+++ b/engines/darkseed/anm.cpp
@@ -19,8 +19,8 @@
  *
  */
 
-#include "anm.h"
 #include "common/debug.h"
+#include "darkseed/anm.h"
 
 namespace Darkseed {
 bool Anm::load(const Common::Path &filename) {
diff --git a/engines/darkseed/anm.h b/engines/darkseed/anm.h
index 04e657ec27e..a1e38cb6fe4 100644
--- a/engines/darkseed/anm.h
+++ b/engines/darkseed/anm.h
@@ -23,7 +23,7 @@
 #define DARKSEED_ANM_H
 
 #include "common/array.h"
-#include "img.h"
+#include "darkseed/img.h"
 namespace Darkseed {
 
 class Anm {
diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
index aee1a681068..093fa734ba0 100644
--- a/engines/darkseed/console.h
+++ b/engines/darkseed/console.h
@@ -23,10 +23,10 @@
 #ifndef DARKSEED_CONSOLE_H
 #define DARKSEED_CONSOLE_H
 
-#include "gamefont.h"
+#include "darkseed/gamefont.h"
 #include "darkseed/sound.h"
-#include "nsp.h"
-#include "tostext.h"
+#include "darkseed/nsp.h"
+#include "darkseed/tostext.h"
 
 namespace Darkseed {
 
diff --git a/engines/darkseed/cursor.cpp b/engines/darkseed/cursor.cpp
index 0595adbac13..5e871b458ed 100644
--- a/engines/darkseed/cursor.cpp
+++ b/engines/darkseed/cursor.cpp
@@ -19,9 +19,9 @@
 *
 */
 
-#include "cursor.h"
-#include "darkseed.h"
 #include "graphics/cursorman.h"
+#include "darkseed/cursor.h"
+#include "darkseed/darkseed.h"
 
 void Darkseed::Cursor::setCursorType(enum CursorType newType) {
 	bool loadCursor = !hasLoadedCursor || _currentCursorType != newType;
diff --git a/engines/darkseed/cursor.h b/engines/darkseed/cursor.h
index 986ac983d6d..dbb1d4aba97 100644
--- a/engines/darkseed/cursor.h
+++ b/engines/darkseed/cursor.h
@@ -23,7 +23,7 @@
 #define DARKSEED_CURSOR_H
 
 #include "common/rect.h"
-#include "nsp.h"
+#include "darkseed/nsp.h"
 
 namespace Darkseed {
 
diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index 642a577d0be..6650591d6f4 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -19,8 +19,8 @@
 *
 */
 
-#include "cutscene.h"
-#include "darkseed.h"
+#include "darkseed/cutscene.h"
+#include "darkseed/darkseed.h"
 
 Darkseed::Cutscene::~Cutscene() {
 	delete titleFont;
diff --git a/engines/darkseed/cutscene.h b/engines/darkseed/cutscene.h
index d2de04ca9c2..7244e4138ce 100644
--- a/engines/darkseed/cutscene.h
+++ b/engines/darkseed/cutscene.h
@@ -23,8 +23,8 @@
 #define DARKSEED_CUTSCENE_H
 
 #include "common/str.h"
-#include "pal.h"
-#include "titlefont.h"
+#include "darkseed/pal.h"
+#include "darkseed/titlefont.h"
 
 namespace Darkseed {
 
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 5c5937170cb..19a72f8ba48 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -19,24 +19,24 @@
  *
  */
 
-#include "darkseed/darkseed.h"
-#include "anm.h"
 #include "common/config-manager.h"
 #include "common/debug-channels.h"
 #include "common/events.h"
 #include "common/scummsys.h"
 #include "common/system.h"
+#include "engines/util.h"
+#include "darkseed/darkseed.h"
+#include "darkseed/anm.h"
 #include "darkseed/console.h"
 #include "darkseed/detection.h"
-#include "debugconsole.h"
-#include "engines/util.h"
+#include "darkseed/debugconsole.h"
 #include "graphics/palette.h"
-#include "img.h"
-#include "nsp.h"
-#include "pal.h"
-#include "pic.h"
-#include "room.h"
-#include "titlefont.h"
+#include "darkseed/img.h"
+#include "darkseed/nsp.h"
+#include "darkseed/pal.h"
+#include "darkseed/pic.h"
+#include "darkseed/room.h"
+#include "darkseed/titlefont.h"
 
 namespace Darkseed {
 
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index f7fb1cbd448..cc95663338e 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -34,19 +34,19 @@
 #include "engines/savestate.h"
 #include "graphics/screen.h"
 
-#include "console.h"
-#include "cursor.h"
-#include "cutscene.h"
+#include "darkseed/console.h"
+#include "darkseed/cursor.h"
+#include "darkseed/cutscene.h"
 #include "darkseed/detection.h"
-#include "inventory.h"
-#include "nsp.h"
-#include "objects.h"
-#include "player.h"
-#include "room.h"
-#include "sound.h"
-#include "sprites.h"
-#include "tostext.h"
-#include "usecode.h"
+#include "darkseed/inventory.h"
+#include "darkseed/nsp.h"
+#include "darkseed/objects.h"
+#include "darkseed/player.h"
+#include "darkseed/room.h"
+#include "darkseed/sound.h"
+#include "darkseed/sprites.h"
+#include "darkseed/tostext.h"
+#include "darkseed/usecode.h"
 
 namespace Darkseed {
 
@@ -122,8 +122,8 @@ public:
 
 	int sprite_y_scaling_threshold_maybe = 0xf0;
 	int scaledWalkSpeed_maybe = 0;
-	uint8 scaledSpriteWidth = 0;
-	uint8 scaledSpriteHeight = 0;
+	uint16 scaledSpriteWidth = 0;
+	uint16 scaledSpriteHeight = 0;
 
 	int nsp_sprite_scaling_y_position = 0;
 
diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
index 921f65b52a6..a786d637153 100644
--- a/engines/darkseed/debugconsole.cpp
+++ b/engines/darkseed/debugconsole.cpp
@@ -19,7 +19,7 @@
  *
  */
 
-#include "darkseed.h"
+#include "darkseed/darkseed.h"
 #include "darkseed/debugconsole.h"
 
 namespace Darkseed {
diff --git a/engines/darkseed/debugconsole.h b/engines/darkseed/debugconsole.h
index e84b7ecd3f5..514100ea847 100644
--- a/engines/darkseed/debugconsole.h
+++ b/engines/darkseed/debugconsole.h
@@ -24,7 +24,7 @@
 #define DARKSEED_DEBUGCONSOLE_H
 
 #include "gui/debugger.h"
-#include "tostext.h"
+#include "darkseed/tostext.h"
 
 namespace Darkseed {
 
diff --git a/engines/darkseed/gamefont.cpp b/engines/darkseed/gamefont.cpp
index f32668b9f9c..fa7e2ac1727 100644
--- a/engines/darkseed/gamefont.cpp
+++ b/engines/darkseed/gamefont.cpp
@@ -19,8 +19,8 @@
 *
 */
 
-#include "darkseed.h"
-#include "gamefont.h"
+#include "darkseed/darkseed.h"
+#include "darkseed/gamefont.h"
 
 namespace Darkseed {
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/gamefont.h b/engines/darkseed/gamefont.h
index 1e3ad743d44..18bd9af8f66 100644
--- a/engines/darkseed/gamefont.h
+++ b/engines/darkseed/gamefont.h
@@ -22,7 +22,7 @@
 #ifndef DARKSEED_GAMEFONT_H
 #define DARKSEED_GAMEFONT_H
 
-#include "nsp.h"
+#include "darkseed/nsp.h"
 namespace Darkseed {
 
 class GameFont {
diff --git a/engines/darkseed/img.cpp b/engines/darkseed/img.cpp
index 2a30f772559..e6023936a70 100644
--- a/engines/darkseed/img.cpp
+++ b/engines/darkseed/img.cpp
@@ -19,10 +19,10 @@
  *
  */
 
-#include "img.h"
 #include "common/debug.h"
 #include "common/file.h"
-#include "darkseed.h"
+#include "darkseed/darkseed.h"
+#include "darkseed/img.h"
 
 namespace Darkseed {
 
diff --git a/engines/darkseed/img.h b/engines/darkseed/img.h
index e000c5718ec..4de6b68acf4 100644
--- a/engines/darkseed/img.h
+++ b/engines/darkseed/img.h
@@ -25,6 +25,7 @@
 #include "common/array.h"
 #include "common/scummsys.h"
 #include "common/file.h"
+
 namespace Darkseed {
 
 class Img {
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index d13d603b174..7a5c8cc77c2 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -19,8 +19,8 @@
 *
 */
 
-#include "darkseed.h"
-#include "inventory.h"
+#include "darkseed/darkseed.h"
+#include "darkseed/inventory.h"
 
 constexpr uint16 MAX_INVENTORY = 42;
 constexpr uint16 MAX_ICONS = 9;
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index 38656a41444..8b218f6aaf0 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -19,9 +19,9 @@
 *
 */
 
-#include "nsp.h"
+#include "darkseed/darkseed.h"
+#include "darkseed/nsp.h"
 #include "common/debug.h"
-#include "darkseed.h"
 
 Darkseed::Sprite::Sprite(uint16 width, uint16 height, uint16 pitch) : width(width), height(height), pitch(pitch) {
 	pixels.resize(pitch * height, 0);
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
index 76b3945e016..6f31e334692 100644
--- a/engines/darkseed/nsp.h
+++ b/engines/darkseed/nsp.h
@@ -60,7 +60,7 @@ private:
 
 public:
 	bool load(const Common::Path &filename);
-	bool containsSpriteAt(int index) { return frames.size() > index; }
+	bool containsSpriteAt(int index) { return (int)frames.size() > index; }
 	const Sprite &getSpriteAt(int index);
 	const Obt &getAnimAt(int index);
 	int16 getTotalAnim() { return (int16)animations.size(); }
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index 056a64d2298..86e5d49eb51 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -19,7 +19,7 @@
 *
 */
 
-#include "objects.h"
+#include "darkseed/objects.h"
 
 Darkseed::Objects::Objects() {
 	_objectVar.resize(MAX_OBJECTS);
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 5492bdac142..8ad407d1433 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -26,6 +26,7 @@
 #include "common/error.h"
 #include "common/rect.h"
 #include "common/serializer.h"
+
 namespace Darkseed {
 
 enum ObjType {
diff --git a/engines/darkseed/pal.cpp b/engines/darkseed/pal.cpp
index 5815e5075bc..4394cb1198d 100644
--- a/engines/darkseed/pal.cpp
+++ b/engines/darkseed/pal.cpp
@@ -19,9 +19,9 @@
  *
  */
 
-#include "pal.h"
-#include "darkseed.h"
 #include "graphics/paletteman.h"
+#include "darkseed/pal.h"
+#include "darkseed/darkseed.h"
 
 namespace Darkseed {
 
diff --git a/engines/darkseed/pal.h b/engines/darkseed/pal.h
index ec7752e64f4..039614f6cbb 100644
--- a/engines/darkseed/pal.h
+++ b/engines/darkseed/pal.h
@@ -23,6 +23,7 @@
 #define DARKSEED_PAL_H
 
 #include "common/path.h"
+
 namespace Darkseed {
 
 #define DARKSEED_NUM_PAL_ENTRIES 16
diff --git a/engines/darkseed/pic.cpp b/engines/darkseed/pic.cpp
index 5ecd08ace24..c5cde62eb71 100644
--- a/engines/darkseed/pic.cpp
+++ b/engines/darkseed/pic.cpp
@@ -19,9 +19,9 @@
 *
 */
 
-#include "pic.h"
+#include "darkseed/pic.h"
+#include "darkseed/darkseed.h"
 #include "common/debug.h"
-#include "darkseed.h"
 
 bool Darkseed::Pic::load(const Common::Path &filename) {
 	Common::File file;
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index b16c84cc031..7c824c35145 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -19,9 +19,9 @@
 *
 */
 
-#include "player.h"
 #include "common/math.h"
-#include "darkseed.h"
+#include "darkseed/player.h"
+#include "darkseed/darkseed.h"
 
 Darkseed::Player::Player() {
 	_cPlayerSprites.load("cplayer.nsp");
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index 74a42257382..2ab06652944 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -23,7 +23,7 @@
 #define DARKSEED_PLAYER_H
 
 #include "common/rect.h"
-#include "nsp.h"
+#include "darkseed/nsp.h"
 
 namespace Darkseed {
 
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 092fefa4319..c522a41ce73 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -19,8 +19,8 @@
 *
 */
 
-#include "room.h"
-#include "darkseed.h"
+#include "darkseed/room.h"
+#include "darkseed/darkseed.h"
 
 const static int roomDescriptionTextTbl[] = {
 	0, 138, 165, 165,
@@ -199,7 +199,7 @@ bool Darkseed::Room::load() {
 Common::String Darkseed::Room::stripSpaces(Common::String source) {
 	Common::String out;
 	const char *src = source.c_str();
-	for (int i = 0; i < source.size(); i++) {
+	for (uint i = 0; i < source.size(); i++) {
 		if (src[i] != ' ') {
 			out += src[i];
 		}
@@ -224,7 +224,7 @@ void Darkseed::Room::draw() {
 			}
 		}
 
-		for (int i = 0; i < _connectors.size(); i++) {
+		for (uint i = 0; i < _connectors.size(); i++) {
 			g_engine->_baseSprites.getSpriteAt(0).draw(_connectors[i].x, _connectors[i].y);
 		}
 	}
@@ -238,7 +238,7 @@ int Darkseed::Room::checkCursorAndMoveableObjects() {
 	bool hasObject = false;
 	int objNum = -1;
 	_collisionType = 0;
-	for (int i = 0; i < _roomObj.size(); i++) {
+	for (uint i = 0; i < _roomObj.size(); i++) {
 		if ((_roomObj[i].type == 1 || _roomObj[i].type == 3)
 			&& _roomObj[i].xOffset <= cursorSprite.width + g_engine->_cursor.getX()
 			&& g_engine->_cursor.getX() <= _roomObj[i].width + _roomObj[i].xOffset
@@ -273,7 +273,7 @@ int Darkseed::Room::checkCursorAndStaticObjects(int x, int y) {
 									 : g_engine->_cursor.getSprite();
 	bool hasObject = false;
 	_collisionType = 0;
-	for (int i = 0; i < _roomObj.size(); i++) {
+	for (uint i = 0; i < _roomObj.size(); i++) {
 		if (_roomObj[i].type == 0
 			&& _roomObj[i].xOffset <= cursorSprite.width + g_engine->_cursor.getX()
 			&& g_engine->_cursor.getX() <= _roomObj[i].width + _roomObj[i].xOffset
@@ -421,7 +421,7 @@ bool Darkseed::Room::exitRoom() {
 }
 int Darkseed::Room::getExitRoomNumberAtPoint(int x, int y) {
 	int obj = checkCursorAndStaticObjects(x, y);
-	for (int i = 0; i < room1.size(); i++) {
+	for (uint i = 0; i < room1.size(); i++) {
 		if (
 			room1[i].roomNumber != 0xff
 			&& _roomObj[obj].xOffset <= room1[i].x
@@ -635,7 +635,7 @@ void Darkseed::Room::printRoomDescriptionText() const {
 }
 
 int Darkseed::Room::getRoomExitAtCursor() {
-	for (int i = 0; i < _roomObj.size(); i++) {
+	for (uint i = 0; i < _roomObj.size(); i++) {
 		Common::Rect roomRect(_roomObj[i].xOffset, _roomObj[i].yOffset, _roomObj[i].xOffset + _roomObj[i].width, _roomObj[i].yOffset + _roomObj[i].height);
 		if (_roomObj[i].type == 0 && _roomObj[i].objNum < 6 && roomRect.contains(g_engine->_cursor.getPosition())) {
 			selectedObjIndex = i;
@@ -646,11 +646,11 @@ int Darkseed::Room::getRoomExitAtCursor() {
 }
 
 void Darkseed::Room::getWalkTargetForObjectType_maybe(int objId) {
-	for (int i = 0; i < _roomObj.size(); i++) {
+	for (uint i = 0; i < _roomObj.size(); i++) {
 		if (_roomObj[i].objNum == objId && _roomObj[i].type == 4) {
 			g_engine->_player->_walkTarget.x = _roomObj[i].xOffset;
 			g_engine->_player->_walkTarget.y = _roomObj[i].yOffset;
-			for (int j = 0; j < room1.size(); j++) {
+			for (uint j = 0; j < room1.size(); j++) {
 				if (room1[j].roomNumber != 0xff
 					&& _roomObj[selectedObjIndex].xOffset < room1[j].x
 					&& room1[j].x < _roomObj[selectedObjIndex].xOffset + _roomObj[selectedObjIndex].width
@@ -725,9 +725,9 @@ void Darkseed::Room::calculateScaledSpriteDimensions(int width, int height, int
 }
 
 uint16 Darkseed::Room::getDoorTargetRoom(int objId) {
-	for (int i = 0; i < _roomObj.size(); i++) {
+	for (uint i = 0; i < _roomObj.size(); i++) {
 		if (_roomObj[i].objNum == objId && _roomObj[i].type == 4) {
-			for (int j = 0; j < room1.size(); j++) {
+			for (uint j = 0; j < room1.size(); j++) {
 				if (room1[j].roomNumber != 0xff
 					&& _roomObj[selectedObjIndex].xOffset < room1[j].x
 					&& room1[j].x < _roomObj[selectedObjIndex].xOffset + _roomObj[selectedObjIndex].width
@@ -786,7 +786,7 @@ void Darkseed::Room::runRoomObjects() {
 	if (_roomNumber == 61) {
 		drawTrunk();
 	}
-	for (int roomObjIdx = 0; roomObjIdx < _roomObj.size(); roomObjIdx++) {
+	for (uint roomObjIdx = 0; roomObjIdx < _roomObj.size(); roomObjIdx++) {
 		auto &roomObj = _roomObj[roomObjIdx];
 		int xPos = roomObj.xOffset;
 		int yPos = roomObj.yOffset;
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index b176ccf3326..557ab6c5b1b 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -22,10 +22,10 @@
 #ifndef DARKSEED_ROOM_H
 #define DARKSEED_ROOM_H
 
-#include "pal.h"
-#include "pic.h"
-#include "nsp.h"
 #include "common/rect.h"
+#include "darkseed/pal.h"
+#include "darkseed/pic.h"
+#include "darkseed/nsp.h"
 
 namespace Darkseed {
 
diff --git a/engines/darkseed/sound.cpp b/engines/darkseed/sound.cpp
index 81b8f07d001..e6fc44d392a 100644
--- a/engines/darkseed/sound.cpp
+++ b/engines/darkseed/sound.cpp
@@ -19,11 +19,11 @@
 *
 */
 
-#include "sound.h"
 #include "audio/audiostream.h"
 #include "audio/decoders/raw.h"
 #include "audio/decoders/voc.h"
-#include "darkseed.h"
+#include "darkseed/sound.h"
+#include "darkseed/darkseed.h"
 
 Darkseed::Sound::Sound(Audio::Mixer *mixer) : _mixer(mixer) {
 	_didSpeech.resize(978);
@@ -58,7 +58,7 @@ void Darkseed::Sound::waitForSpeech() {
 }
 
 void Darkseed::Sound::resetSpeech() {
-	for (int i = 0; i < _didSpeech.size(); i++) {
+	for (int i = 0; i < (int)_didSpeech.size(); i++) {
 		_didSpeech[i] = 0;
 	}
 }
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
index 12f9cab5965..4731e955d0f 100644
--- a/engines/darkseed/sprites.cpp
+++ b/engines/darkseed/sprites.cpp
@@ -19,15 +19,16 @@
 *
 */
 
-#include "sprites.h"
-#include "darkseed.h"
+#include "darkseed/sprites.h"
+#include "darkseed/darkseed.h"
+
 #define DARKSEED_MAX_SPRITES_ON_SCREEN 30
 
 Darkseed::Sprites::Sprites() {
 	spriteDrawList.reserve(DARKSEED_MAX_SPRITES_ON_SCREEN);
 }
 
-void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Darkseed::Sprite *sprite, uint8 order, uint8 destW, uint8 destH, bool flip) {
+void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Darkseed::Sprite *sprite, uint8 order, uint16 destW, uint16 destH, bool flip) {
 	if (spriteDrawList.size() == DARKSEED_MAX_SPRITES_ON_SCREEN || destX >= 570) {
 		return;
 	}
@@ -42,7 +43,7 @@ void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Da
 	drawInstruction.flip = flip;
 
 	if (!spriteDrawList.empty()) {
-		int insertLocation = 0;
+		uint insertLocation = 0;
 		for (; insertLocation < spriteDrawList.size(); insertLocation++) {
 			if (order < spriteDrawList[insertLocation].order) {
 				break;
diff --git a/engines/darkseed/sprites.h b/engines/darkseed/sprites.h
index a6e16287b80..4526154fff8 100644
--- a/engines/darkseed/sprites.h
+++ b/engines/darkseed/sprites.h
@@ -23,7 +23,7 @@
 #define DARKSEED_SPRITES_H
 
 #include "common/scummsys.h"
-#include "nsp.h"
+#include "darkseed/nsp.h"
 
 namespace Darkseed {
 
@@ -34,8 +34,8 @@ struct SpriteDrawInstruction {
 	uint16 srcH = 0;
 	const Sprite *sprite = nullptr;
 	uint8 order = 0;
-	uint8 destW = 0;
-	uint8 destH = 0;
+	uint16 destW = 0;
+	uint16 destH = 0;
 	bool flip = false;
 };
 
@@ -44,7 +44,7 @@ private:
 	Common::Array<SpriteDrawInstruction> spriteDrawList;
 public:
 	Sprites();
-	void addSpriteToDrawList(uint16 destX, uint16 destY, const Sprite *sprite, uint8 order, uint8 destW, uint8 destH, bool flip);
+	void addSpriteToDrawList(uint16 destX, uint16 destY, const Sprite *sprite, uint8 order, uint16 destW, uint16 destH, bool flip);
 	void clearSpriteDrawList();
 
 	void drawSprites();
diff --git a/engines/darkseed/titlefont.cpp b/engines/darkseed/titlefont.cpp
index c6a43c75d0c..30ce01dfabd 100644
--- a/engines/darkseed/titlefont.cpp
+++ b/engines/darkseed/titlefont.cpp
@@ -19,9 +19,9 @@
  *
  */
 
-#include "titlefont.h"
-#include "darkseed.h"
 #include "graphics/screen.h"
+#include "darkseed/titlefont.h"
+#include "darkseed/darkseed.h"
 
 namespace Darkseed {
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/titlefont.h b/engines/darkseed/titlefont.h
index 8b731804303..6a065137464 100644
--- a/engines/darkseed/titlefont.h
+++ b/engines/darkseed/titlefont.h
@@ -22,7 +22,7 @@
 #ifndef DARKSEED_TITLEFONT_H
 #define DARKSEED_TITLEFONT_H
 
-#include "anm.h"
+#include "darkseed/anm.h"
 namespace Darkseed {
 
 class TitleFont {
diff --git a/engines/darkseed/tostext.cpp b/engines/darkseed/tostext.cpp
index a8e6a742d49..287a8fc48fc 100644
--- a/engines/darkseed/tostext.cpp
+++ b/engines/darkseed/tostext.cpp
@@ -20,8 +20,8 @@
  *
  */
 
-#include "tostext.h"
 #include "common/file.h"
+#include "darkseed/tostext.h"
 
 namespace Darkseed {
 
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 9470bcf5859..25b0147b357 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -19,10 +19,10 @@
 *
 */
 
+#include "common/debug.h"
 #include "darkseed/darkseed.h"
 #include "darkseed/usecode.h"
 #include "darkseed/usecode_tos_tables.h"
-#include "common/debug.h"
 
 namespace Darkseed {
 
diff --git a/engines/darkseed/usecode.h b/engines/darkseed/usecode.h
index 159a3648517..426390d87f6 100644
--- a/engines/darkseed/usecode.h
+++ b/engines/darkseed/usecode.h
@@ -23,10 +23,10 @@
 #define DARKSEED_USECODE_H
 
 #include "common/scummsys.h"
-#include "console.h"
-#include "inventory.h"
-#include "objects.h"
-#include "player.h"
+#include "darkseed/console.h"
+#include "darkseed/inventory.h"
+#include "darkseed/objects.h"
+#include "darkseed/player.h"
 
 namespace Darkseed {
 class UseCode {


Commit: 2c713eb41c611ed7a18657c2db19954c5a26163e
    https://github.com/scummvm/scummvm/commit/2c713eb41c611ed7a18657c2db19954c5a26163e
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: CHORE: Fix namespace for math

Changed paths:
    engines/darkseed/player.cpp


diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 7c824c35145..8b760347dc6 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -19,7 +19,7 @@
 *
 */
 
-#include "common/math.h"
+#include "math/utils.h"
 #include "darkseed/player.h"
 #include "darkseed/darkseed.h"
 
@@ -210,8 +210,8 @@ void Darkseed::Player::calculateWalkTarget() {
 		if (connector.x == -1 && connector.y == -1) {
 			return;
 		}
-		int connectorToTargetDist = Common::hypotenuse(connector.x - _walkTarget.x, connector.y - _walkTarget.y);
-		int playerToTargetDist = Common::hypotenuse(_position.x - _walkTarget.x, _position.y - _walkTarget.y);
+		int connectorToTargetDist = Math::hypotenuse(connector.x - _walkTarget.x, connector.y - _walkTarget.y);
+		int playerToTargetDist = Math::hypotenuse(_position.x - _walkTarget.x, _position.y - _walkTarget.y);
 		if (connectorToTargetDist < playerToTargetDist) {
 			if(g_engine->_room->canWalkInLineToTarget(_position.x, _position.y, connector.x, connector.y)) {
 				_finalTarget = _walkTarget;
@@ -370,7 +370,7 @@ Common::Point Darkseed::Player::getClosestUnusedConnector(int16 x, int16 y, bool
 			}
 		}
 		if (!containsPoint) {
-			int dist = Common::hypotenuse((roomConnector.x - x), (roomConnector.y - y));
+			int dist = Math::hypotenuse((roomConnector.x - x), (roomConnector.y - y));
 			if (dist < closestDist) {
 				if (!mustHaveCleanLine || g_engine->_room->canWalkInLineToTarget(x, y, roomConnector.x, roomConnector.y)) {
 					closestPoint = roomConnector;


Commit: 83ed789d39439a9fe12ec17c9f8ce2c9d4c63c4b
    https://github.com/scummvm/scummvm/commit/83ed789d39439a9fe12ec17c9f8ce2c9d4c63c4b
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Whitespace fixes

Changed paths:
    engines/darkseed/anm.cpp
    engines/darkseed/console.cpp
    engines/darkseed/cursor.h
    engines/darkseed/cutscene.cpp
    engines/darkseed/cutscene.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/debugconsole.cpp
    engines/darkseed/gamefont.cpp
    engines/darkseed/img.cpp
    engines/darkseed/inventory.cpp
    engines/darkseed/metaengine.cpp
    engines/darkseed/nsp.cpp
    engines/darkseed/nsp.h
    engines/darkseed/pal.cpp
    engines/darkseed/pic.cpp
    engines/darkseed/player.cpp
    engines/darkseed/room.cpp
    engines/darkseed/room.h
    engines/darkseed/sound.cpp
    engines/darkseed/sprites.cpp
    engines/darkseed/titlefont.cpp
    engines/darkseed/tostext.cpp
    engines/darkseed/usecode.cpp


diff --git a/engines/darkseed/anm.cpp b/engines/darkseed/anm.cpp
index 3ebda1073e8..b96c24f5542 100644
--- a/engines/darkseed/anm.cpp
+++ b/engines/darkseed/anm.cpp
@@ -27,7 +27,7 @@ bool Anm::load(const Common::Path &filename) {
 	if (file.isOpen()) {
 		file.close();
 	}
-	if(!file.open(filename)) {
+	if (!file.open(filename)) {
 		return false;
 	}
 	numRecords = file.readUint16LE();
@@ -39,7 +39,7 @@ bool Anm::load(const Common::Path &filename) {
 bool Anm::getImg(uint16 index, Img &img, bool includesPosition) {
 	file.seek(4 + index * 2);
 	int offset = file.readUint16LE();
-	file.seek((offset*16) + (4 + numRecords * 2));
+	file.seek((offset * 16) + (4 + numRecords * 2));
 	if (includesPosition) {
 		img.load(file);
 	} else {
diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index d5e95405001..d27bab9362c 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -28,7 +28,7 @@ namespace Darkseed {
 static constexpr Common::Rect consoleArea = {{0x70, 280}, 416, 44};
 
 Console::Console(TosText *tosText, Sound *sound) : _tosText(tosText), _sound(sound) {
-	if(!_font.load()) {
+	if (!_font.load()) {
 		error("Error loading tosfont.nsp");
 	}
 	_text.resize(10);
diff --git a/engines/darkseed/cursor.h b/engines/darkseed/cursor.h
index dbb1d4aba97..0d564fbca3b 100644
--- a/engines/darkseed/cursor.h
+++ b/engines/darkseed/cursor.h
@@ -47,13 +47,23 @@ public:
 
 	void showCursor(bool showCursor);
 	void setCursorType(enum CursorType newType);
-	CursorType getCursorType() { return _currentCursorType; }
+	CursorType getCursorType() {
+		return _currentCursorType;
+	}
 
-	Common::Point &getPosition() { return _position; }
-	void setPosition(Common::Point &position) { _position = position; }
+	Common::Point &getPosition() {
+		return _position;
+	}
+	void setPosition(Common::Point &position) {
+		_position = position;
+	}
 
-	int16 getX() const { return _position.x; }
-	int16 getY() const { return _position.y; }
+	int16 getX() const {
+		return _position.x;
+	}
+	int16 getY() const {
+		return _position.y;
+	}
 
 	int getWidth();
 	int getHeight();
diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index 6650591d6f4..84ef847b11e 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -36,17 +36,37 @@ void Darkseed::Cutscene::play(char cutsceneId) {
 
 
 void Darkseed::Cutscene::update() {
-	switch(_cutsceneId) {
-	case 'B' : _movieStep = 9999; break;
-	case 'C' : _movieStep = 9999; break;
-	case 'D' : _movieStep = 9999; break;
-	case 'E' : shipLaunchScene(); break;
-	case 'G' : _movieStep = 9999; break;
-	case 'H' : _movieStep = 9999; break;
-	case 'I' : introScene(); break;
-	case 'J' : embryoInsertedScene(); break;
-	case 'Y' : alienBornScene(); break;
-	case 'Z' : _movieStep = 9999; break;
+	switch (_cutsceneId) {
+	case 'B' :
+		_movieStep = 9999;
+		break;
+	case 'C' :
+		_movieStep = 9999;
+		break;
+	case 'D' :
+		_movieStep = 9999;
+		break;
+	case 'E' :
+		shipLaunchScene();
+		break;
+	case 'G' :
+		_movieStep = 9999;
+		break;
+	case 'H' :
+		_movieStep = 9999;
+		break;
+	case 'I' :
+		introScene();
+		break;
+	case 'J' :
+		embryoInsertedScene();
+		break;
+	case 'Y' :
+		alienBornScene();
+		break;
+	case 'Z' :
+		_movieStep = 9999;
+		break;
 	}
 
 	if (_movieStep == 9999) {
@@ -71,37 +91,73 @@ static constexpr int _CREDITS_DELAY = 25;
 
 bool Darkseed::Cutscene::introScene() {
 	switch (_movieStep) {
-	case 1: g_engine->fadeOut(); break;
-	case 2: if (g_engine->fadeStep()) { return true; } break;
+	case 1:
+		g_engine->fadeOut();
+		break;
+	case 2:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
 	case 3: {
 		g_engine->_screen->clear();
 		_palette.load("art/house.pal");
 		if (titleFont == nullptr) {
 			titleFont = new TitleFont();
 		}
-		titleFont->displayString(68,160, "DEVELOPING NEW WAYS TO AMAZE");
+		titleFont->displayString(68, 160, "DEVELOPING NEW WAYS TO AMAZE");
 		g_engine->fadeIn(_palette);
 	}
+	break;
+	case 4:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
+	case 5:
+		g_engine->fadeOut();
+		break;
+	case 6:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
 		break;
-	case 4: if (g_engine->fadeStep()) { return true; } break;
-	case 5: g_engine->fadeOut(); break;
-	case 6: if (g_engine->fadeStep()) { return true; } break;
 	case 7:
 		g_engine->_screen->clear();
-		titleFont->displayString(222,160, "CYBERDREAMS");
+		titleFont->displayString(222, 160, "CYBERDREAMS");
 		g_engine->fadeIn(_palette);
 		break;
-	case 8: if (g_engine->fadeStep()) { return true; } break;
-	case 9: g_engine->fadeOut(); break;
-	case 10: if (g_engine->fadeStep()) { return true; } break;
+	case 8:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
+	case 9:
+		g_engine->fadeOut();
+		break;
+	case 10:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
 	case 11:
 		g_engine->_screen->clear();
-		titleFont->displayString(250,160, "PRESENTS");
+		titleFont->displayString(250, 160, "PRESENTS");
 		g_engine->fadeIn(_palette);
 		break;
-	case 12: if (g_engine->fadeStep()) { return true; } break;
-	case 13: g_engine->fadeOut(); break;
-	case 14: if (g_engine->fadeStep()) { return true; } break;
+	case 12:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
+	case 13:
+		g_engine->fadeOut();
+		break;
+	case 14:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
 	case 15: {
 		g_engine->_screen->clear();
 		g_engine->_screen->clearPalette();
@@ -118,9 +174,16 @@ bool Darkseed::Cutscene::introScene() {
 		i001Img.draw(1);
 		break;
 	}
-	case 16: g_engine->fadeIn(_palette); break;
-	case 17: if (g_engine->fadeStep()) { return true; } break;
-	case 18: _animation.load("art/shipin.anm");
+	case 16:
+		g_engine->fadeIn(_palette);
+		break;
+	case 17:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
+	case 18:
+		_animation.load("art/shipin.anm");
 		_animIdx = 0;
 		_animCount = 47;
 		runAnim();
@@ -140,7 +203,8 @@ bool Darkseed::Cutscene::introScene() {
 			return true;
 		}
 		break;
-	case 22: _animation.load("art/t2.anm");
+	case 22:
+		_animation.load("art/t2.anm");
 		_animIdx = 0;
 		_animCount = 50;
 		runAnim();
@@ -169,7 +233,8 @@ bool Darkseed::Cutscene::introScene() {
 		registTime();
 		break;
 	}
-	case 25: if (waitTime(_CREDITS_DELAY)) {
+	case 25:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -178,7 +243,8 @@ bool Darkseed::Cutscene::introScene() {
 		registTime();
 		g_engine->_screen->makeAllDirty();
 		break;
-	case 27: if (waitTime(_CREDITS_DELAY)) {
+	case 27:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -191,7 +257,8 @@ bool Darkseed::Cutscene::introScene() {
 		titleFont->displayString(236, 190, "JEAN KLUG");
 		g_engine->_screen->makeAllDirty();
 		break;
-	case 29: if (waitTime(_CREDITS_DELAY)) {
+	case 29:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -203,7 +270,8 @@ bool Darkseed::Cutscene::introScene() {
 		titleFont->displayString(218, 165, "MIKE DAWSON");
 		g_engine->_screen->makeAllDirty();
 		break;
-	case 31: if (waitTime(_CREDITS_DELAY)) {
+	case 31:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -215,7 +283,8 @@ bool Darkseed::Cutscene::introScene() {
 		titleFont->displayString(227, 165, "MIKE DAWSON");
 		g_engine->_screen->makeAllDirty();
 		break;
-	case 33: if (waitTime(_CREDITS_DELAY)) {
+	case 33:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -228,7 +297,8 @@ bool Darkseed::Cutscene::introScene() {
 		titleFont->displayString(245, 195, "GARY VICK");
 		g_engine->_screen->makeAllDirty();
 		break;
-	case 35: if (waitTime(_CREDITS_DELAY)) {
+	case 35:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -239,7 +309,8 @@ bool Darkseed::Cutscene::introScene() {
 		titleFont->displayString(200, 140, "GREGORY ALPER");
 		g_engine->_screen->makeAllDirty();
 		break;
-	case 37: if (waitTime(_CREDITS_DELAY)) {
+	case 37:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -250,7 +321,8 @@ bool Darkseed::Cutscene::introScene() {
 		titleFont->displayString(200, 140, "DAVID A. BEAN");
 		g_engine->_screen->makeAllDirty();
 		break;
-	case 39: if (waitTime(_CREDITS_DELAY)) {
+	case 39:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -261,7 +333,8 @@ bool Darkseed::Cutscene::introScene() {
 		titleFont->displayString(236, 140, "BRUMMBAER");
 		g_engine->_screen->makeAllDirty();
 		break;
-	case 41: if (waitTime(_CREDITS_DELAY)) {
+	case 41:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -272,7 +345,8 @@ bool Darkseed::Cutscene::introScene() {
 		titleFont->displayString(191, 140, "PAUL DRZEWIECKI");
 		g_engine->_screen->makeAllDirty();
 		break;
-	case 43: if (waitTime(_CREDITS_DELAY)) {
+	case 43:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -283,7 +357,8 @@ bool Darkseed::Cutscene::introScene() {
 		titleFont->displayString(245, 140, "H.R. GIGER");
 		g_engine->_screen->makeAllDirty();
 		break;
-	case 45: if (waitTime(_CREDITS_DELAY)) {
+	case 45:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -296,7 +371,8 @@ bool Darkseed::Cutscene::introScene() {
 		titleFont->displayString(236, 190, "PAUL RYAN");
 		g_engine->_screen->makeAllDirty();
 		break;
-	case 47: if (waitTime(_CREDITS_DELAY)) {
+	case 47:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -307,15 +383,24 @@ bool Darkseed::Cutscene::introScene() {
 		titleFont->displayString(209, 140, "MICHEL HORVAT");
 		g_engine->_screen->makeAllDirty();
 		break;
-	case 49: if (waitTime(_CREDITS_DELAY)) {
+	case 49:
+		if (waitTime(_CREDITS_DELAY)) {
 			return true;
 		}
 		break;
 	case 50: // TODO wait for music.
 		break;
-	case 51: g_engine->fadeOut(); break;
-	case 52: if (g_engine->fadeStep()) { return true; } break;
-	default: _movieStep = 9999; return false;
+	case 51:
+		g_engine->fadeOut();
+		break;
+	case 52:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
+	default:
+		_movieStep = 9999;
+		return false;
 	}
 	_movieStep++;
 	if (g_engine->_isLeftMouseClicked || g_engine->_isRightMouseClicked) {
@@ -330,7 +415,8 @@ bool Darkseed::Cutscene::introScene() {
 bool Darkseed::Cutscene::embryoInsertedScene() {
 	switch (_movieStep) {
 	case 1:
-	case 2: break;
+	case 2:
+		break;
 	case 3:
 		g_engine->_screen->clear();
 		g_engine->_screen->makeAllDirty();
@@ -358,7 +444,11 @@ bool Darkseed::Cutscene::embryoInsertedScene() {
 		registTime();
 		g_engine->fadeIn(_palette);
 		break;
-	case 7: if (g_engine->fadeStep()) { return true; } break;
+	case 7:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
 	case 8:
 		_animIdx = 0;
 		_animCount = 39;
@@ -376,38 +466,53 @@ bool Darkseed::Cutscene::embryoInsertedScene() {
 		}
 		registTime();
 		break;
-	case 10: if (waitTime(30)) {
+	case 10:
+		if (waitTime(30)) {
 			return true;
 		}
 		break;
 	case 11:
 		g_engine->fadeOut();
 		break;
-	case 12: if (g_engine->fadeStep()) { return true; } break;
+	case 12:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
 	case 13: {
 		g_engine->_screen->clear();
 		_palette.load("art/house.pal");
 		if (titleFont == nullptr) {
 			titleFont = new TitleFont();
 		}
-		titleFont->displayString(80,130, "AFTER A HORRIFYING NIGHTMARE");
-		titleFont->displayString(80,170, "MIKE DAWSON AWAKENS TO THE");
-		titleFont->displayString(80,210, "FIRST DAY IN HIS NEW HOUSE...");
+		titleFont->displayString(80, 130, "AFTER A HORRIFYING NIGHTMARE");
+		titleFont->displayString(80, 170, "MIKE DAWSON AWAKENS TO THE");
+		titleFont->displayString(80, 210, "FIRST DAY IN HIS NEW HOUSE...");
 		g_engine->fadeIn(_palette);
 		break;
 	}
-	case 14: if (g_engine->fadeStep()) { return true; }
+	case 14:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
 		registTime();
 		break;
-	case 15: if (waitTime(30)) {
+	case 15:
+		if (waitTime(30)) {
 			return true;
 		}
 		break;
 	case 16:
 		g_engine->fadeOut();
 		break;
-	case 17: if (g_engine->fadeStep()) { return true; } break;
-	default: _movieStep = 9999; return false;
+	case 17:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
+	default:
+		_movieStep = 9999;
+		return false;
 	}
 	_movieStep++;
 	if (g_engine->_isLeftMouseClicked || g_engine->_isRightMouseClicked) {
@@ -433,8 +538,14 @@ bool Darkseed::Cutscene::shipLaunchScene() {
 		g_engine->_screen->clearPalette();
 		break;
 	}
-	case 2: g_engine->fadeIn(_palette); break;
-	case 3: if (g_engine->fadeStep()) { return true; } break;
+	case 2:
+		g_engine->fadeIn(_palette);
+		break;
+	case 3:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
 	case 4:
 		// TODO play music 'launch'
 		_animIdx = 2;
@@ -458,7 +569,8 @@ bool Darkseed::Cutscene::shipLaunchScene() {
 		}
 		registTime();
 		break;
-	case 8: if (waitTime(20)) {
+	case 8:
+		if (waitTime(20)) {
 			return true;
 		}
 		break;
@@ -486,7 +598,11 @@ bool Darkseed::Cutscene::shipLaunchScene() {
 	case 13:
 		g_engine->fadeOut();
 		break;
-	case 14: if (g_engine->fadeStep()) { return true; } break;
+	case 14:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
 	default:
 		_movieStep = 9999;
 		return false;
@@ -516,7 +632,11 @@ bool Darkseed::Cutscene::alienBornScene() {
 		// TODO play alien music here.
 		g_engine->fadeIn(_palette);
 		break;
-	case 3: if (g_engine->fadeStep()) { return true; } break;
+	case 3:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
 	case 4:
 		_animIdx = 0;
 		_animCount = 31;
@@ -529,14 +649,19 @@ bool Darkseed::Cutscene::alienBornScene() {
 		}
 		registTime();
 		break;
-	case 6: if (waitTime(30)) {
+	case 6:
+		if (waitTime(30)) {
 			return true;
 		}
 		break;
 	case 7:
 		g_engine->fadeOut();
 		break;
-	case 8: if (g_engine->fadeStep()) { return true; } break;
+	case 8:
+		if (g_engine->fadeStep()) {
+			return true;
+		}
+		break;
 	case 9:
 		// TODO some logic here. stopSequence.
 		break;
diff --git a/engines/darkseed/cutscene.h b/engines/darkseed/cutscene.h
index 7244e4138ce..4a43fa812ba 100644
--- a/engines/darkseed/cutscene.h
+++ b/engines/darkseed/cutscene.h
@@ -44,7 +44,9 @@ private:
 public:
 	virtual ~Cutscene();
 	void play(char cutsceneId);
-	bool isPlaying() { return _movieStep != 9999; }
+	bool isPlaying() {
+		return _movieStep != 9999;
+	}
 	void update();
 
 private:
@@ -53,7 +55,7 @@ private:
 	bool shipLaunchScene();
 	bool alienBornScene();
 
-	void runAnim(int direction=1);
+	void runAnim(int direction = 1);
 	bool stepAnim(int drawMode = 1);
 
 	void putHouse();
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 19a72f8ba48..7db3984f8dd 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -77,7 +77,7 @@ Common::Error DarkseedEngine::run() {
 
 	_baseSprites.load("cbase.nsp");
 
-	_cursor.updatePosition(0x140,0xaf);
+	_cursor.updatePosition(0x140, 0xaf);
 	_cursor.setCursorType(Pointer);
 	_cursor.showCursor(true);
 
@@ -172,7 +172,7 @@ void DarkseedEngine::gameloop() {
 		}
 		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
 		if (_cutscene.isPlaying()) {
-				_cutscene.update();
+			_cutscene.update();
 		} else if (systemTimerCounter == 5) {
 			if (_objectVar[1] != 0) {
 				if (_room->_roomNumber == 30) {
@@ -187,11 +187,11 @@ void DarkseedEngine::gameloop() {
 			if (_room->_roomNumber == 57 && _previousRoomNumber == 54) {
 				if (_objectVar.getMoveObjectRoom(28) == 255) {
 					if (_objectVar[56] == 4) {
-						playSound(21,5,-1);
+						playSound(21, 5, -1);
 					}
 					if (_objectVar[56] == 6) {
 //						LoadModeSong(7);
-						playSound(0,6,-1);
+						playSound(0, 6, -1);
 						stuffPlayer();
 					}
 				} else {
@@ -201,7 +201,7 @@ void DarkseedEngine::gameloop() {
 					_player->updateSprite();
 					_inventory.gotoJailLogic();
 
-					playSound(0,6,-1);
+					playSound(0, 6, -1);
 				}
 			}
 			if (_currentTimeInSeconds > 35999 && _currentTimeInSeconds < 36005 &&
@@ -255,10 +255,9 @@ void DarkseedEngine::gameloop() {
 			}
 			if ((_room->_roomNumber < 10 || _room->_roomNumber == 61 || _room->_roomNumber == 62) && _currentTimeInSeconds % 3600 == 0) {
 				if (_room->_roomNumber == 7) {
-					playSound(45,5,-1);
-				}
-				else {
-					playSound(46,5,-1);
+					playSound(45, 5, -1);
+				} else {
+					playSound(46, 5, -1);
 				}
 			}
 			_room->darkenSky();
@@ -351,17 +350,24 @@ void DarkseedEngine::updateEvents() {
 //	_isLeftMouseClicked = false;
 	while (g_system->getEventManager()->pollEvent(event)) {
 		switch (event.type) {
-		case Common::EVENT_MOUSEMOVE: _cursor.updatePosition(event.mouse.x, event.mouse.y); break;
-		case Common::EVENT_RBUTTONDOWN: _isRightMouseClicked = true; break;
+		case Common::EVENT_MOUSEMOVE:
+			_cursor.updatePosition(event.mouse.x, event.mouse.y);
+			break;
+		case Common::EVENT_RBUTTONDOWN:
+			_isRightMouseClicked = true;
+			break;
 //		case Common::EVENT_RBUTTONUP: _isRightMouseClicked = false; break;
-		case Common::EVENT_LBUTTONDOWN: _isLeftMouseClicked = true; break;
+		case Common::EVENT_LBUTTONDOWN:
+			_isLeftMouseClicked = true;
+			break;
 //		case Common::EVENT_LBUTTONUP: _isLeftMouseClicked = false; break;
 		case Common::EVENT_KEYDOWN:
 			if (event.kbd.keycode == Common::KEYCODE_t) {
 				_timeAdvanceEventSelected = true;
 			}
 			break;
-		default: break;
+		default:
+			break;
 		}
 	}
 }
@@ -374,32 +380,33 @@ void DarkseedEngine::wait() {
 	}
 }
 
-static constexpr uint8 walkToDirTbl[] =
-	{0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
-	 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
-	 0x04, 0x04, 0x04, 0x01, 0x04, 0x04, 0x04, 0x00,
-	 0x04, 0x04, 0x04, 0x04, 0x01, 0x04, 0x01, 0x00,
-	 0x00, 0x00, 0x04, 0x01, 0x04, 0x04, 0x04, 0x04,
-	 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x00, 0x03,
-	 0x01, 0x04, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00,
-	 0x04, 0x01, 0x04, 0x04, 0x04, 0x00, 0x04, 0x04,
-	 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04,
-	 0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x04, 0x04,
-	 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03,
-	 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03,
-	 0x03, 0x03, 0x01, 0x04, 0x03, 0x00, 0x04, 0x00,
-	 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x04,
-	 0x04, 0x04, 0x03, 0x04, 0x04, 0x01, 0x00, 0x04,
-	 0x04, 0x04, 0x04, 0x03, 0x04, 0x04, 0x04, 0x01,
-	 0x04, 0x04, 0x03, 0x04, 0x04, 0x00, 0x01, 0x00,
-	 0x04, 0x04, 0x04, 0x03, 0x04, 0x01, 0x04, 0x00,
-	 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00,
-	 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x00, 0x04,
-	 0x00, 0x04, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04,
-	 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00,
-	 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x04, 0x04,
-	 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x04,
-	 0x04, 0x04, 0x01, 0x04, 0x03, 0x00, 0x04};
+static constexpr uint8 walkToDirTbl[] = {
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+	0x04, 0x04, 0x04, 0x01, 0x04, 0x04, 0x04, 0x00,
+	0x04, 0x04, 0x04, 0x04, 0x01, 0x04, 0x01, 0x00,
+	0x00, 0x00, 0x04, 0x01, 0x04, 0x04, 0x04, 0x04,
+	0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x00, 0x03,
+	0x01, 0x04, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00,
+	0x04, 0x01, 0x04, 0x04, 0x04, 0x00, 0x04, 0x04,
+	0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04,
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x04, 0x04,
+	0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03,
+	0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03,
+	0x03, 0x03, 0x01, 0x04, 0x03, 0x00, 0x04, 0x00,
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x04,
+	0x04, 0x04, 0x03, 0x04, 0x04, 0x01, 0x00, 0x04,
+	0x04, 0x04, 0x04, 0x03, 0x04, 0x04, 0x04, 0x01,
+	0x04, 0x04, 0x03, 0x04, 0x04, 0x00, 0x01, 0x00,
+	0x04, 0x04, 0x04, 0x03, 0x04, 0x01, 0x04, 0x00,
+	0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00,
+	0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x00, 0x04,
+	0x00, 0x04, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04,
+	0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00,
+	0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x04, 0x04,
+	0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x04,
+	0x04, 0x04, 0x01, 0x04, 0x03, 0x00, 0x04
+};
 
 static constexpr int16 walkToXTbl[] = {
 	0, 0, 0, 0, 0, 0, 0, 0,
@@ -431,30 +438,30 @@ static constexpr int16 walkToXTbl[] = {
 
 static constexpr uint8 walkToYTbl[] = {
 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0xcf,
-	 0x00, 0x00, 0x00, 0x00, 0xd8, 0x00, 0xaa, 0xe1,
-	 0xe1, 0xe1, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00,
-	 0x00, 0x00, 0x00, 0x00, 0xd5, 0x00, 0xd4, 0xb7,
-	 0xd9, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0xd3,
-	 0x00, 0xb8, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00,
-	 0x00, 0x00, 0xcd, 0xcd, 0xcd, 0x00, 0x00, 0x00,
-	 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00,
-	 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6,
-	 0xdf, 0xbc, 0xa2, 0xa0, 0xa1, 0xaa, 0xdd, 0xcd,
-	 0xd1, 0xd8, 0xe2, 0x00, 0xd7, 0xd5, 0x00, 0xaa,
-	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00,
-	 0x00, 0x00, 0x00, 0xb8, 0x00, 0xbd, 0xb4, 0x00,
-	 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xdb,
-	 0x00, 0x00, 0xee, 0x00, 0x00, 0xc5, 0xd9, 0xd8,
-	 0x00, 0x00, 0x00, 0xcc, 0x00, 0xd8, 0x00, 0xb6,
-	 0xc6, 0xc8, 0x00, 0xd3, 0xba, 0xd2, 0xd2, 0xaa,
-	 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0xd6, 0x00,
-	 0xe0, 0x00, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00,
-	 0x00, 0x00, 0xe8, 0xb9, 0xd7, 0xcf, 0xb2, 0x00,
-	 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00,
-	 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00,
-	 0x00, 0x00, 0xec, 0x00, 0xe8, 0xd3, 0x00
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0xcf,
+	0x00, 0x00, 0x00, 0x00, 0xd8, 0x00, 0xaa, 0xe1,
+	0xe1, 0xe1, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0xd5, 0x00, 0xd4, 0xb7,
+	0xd9, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0xd3,
+	0x00, 0xb8, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00,
+	0x00, 0x00, 0xcd, 0xcd, 0xcd, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00,
+	0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6,
+	0xdf, 0xbc, 0xa2, 0xa0, 0xa1, 0xaa, 0xdd, 0xcd,
+	0xd1, 0xd8, 0xe2, 0x00, 0xd7, 0xd5, 0x00, 0xaa,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00,
+	0x00, 0x00, 0x00, 0xb8, 0x00, 0xbd, 0xb4, 0x00,
+	0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xdb,
+	0x00, 0x00, 0xee, 0x00, 0x00, 0xc5, 0xd9, 0xd8,
+	0x00, 0x00, 0x00, 0xcc, 0x00, 0xd8, 0x00, 0xb6,
+	0xc6, 0xc8, 0x00, 0xd3, 0xba, 0xd2, 0xd2, 0xaa,
+	0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0xd6, 0x00,
+	0xe0, 0x00, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0xe8, 0xb9, 0xd7, 0xcf, 0xb2, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00,
+	0x00, 0x00, 0xec, 0x00, 0xe8, 0xd3, 0x00
 };
 
 void DarkseedEngine::handleInput() {
@@ -464,12 +471,12 @@ void DarkseedEngine::handleInput() {
 		_player->_isAutoWalkingToBed = false;
 		_currentTimeInSeconds = 0x7e90;
 		_player->loadAnimations("bedsleep.nsp");
-		setupOtherNspAnimation(1,5);
+		setupOtherNspAnimation(1, 5);
 	}
 
 	if (!isPlayingAnimation_maybe) {
 		if (!_player->_playerIsChangingDirection) {
-			if (currentRoomNumber == 0x39 &&_previousRoomNumber == 0x36) {
+			if (currentRoomNumber == 0x39 && _previousRoomNumber == 0x36) {
 				_player->updateSprite();
 			} else {
 				if (_player->isAtWalkTarget() && !_player->_heroMoving) {
@@ -540,8 +547,8 @@ void DarkseedEngine::handleInput() {
 									_cursor.updatePosition(409, 173);
 								}
 							} else if (objNum == 112 || objNum == 111) {
-							_player->_sequenceRotation = 1;
-							_cursor.updatePosition(464, 191);
+								_player->_sequenceRotation = 1;
+								_cursor.updatePosition(464, 191);
 							} else if (objNum == 138 || objNum == 7 || objNum == 152) {
 								_player->_sequenceRotation = 1;
 								_cursor.updatePosition(292, 208);
@@ -669,23 +676,23 @@ void DarkseedEngine::handleInput() {
 								}
 								if (currentRoomNumber == 7 && roomExit.roomNumber == 38 && bVar) {
 									_player->loadAnimations("mirror.nsp");
-									setupOtherNspAnimation(0,27);
+									setupOtherNspAnimation(0, 27);
 									return;
 								}
 								if ((currentRoomNumber == 41 && roomExit.roomNumber == 44 && bVar) ||
 									(currentRoomNumber == 44 && roomExit.roomNumber == 41 && bVar)) {
 									_player->loadAnimations("beamer.nsp");
-									setupOtherNspAnimation(0,57);
+									setupOtherNspAnimation(0, 57);
 									return;
 								}
 								if (currentRoomNumber == 10 && roomExit.roomNumber == 6 && bVar && !_player->_isAutoWalkingToBed) {
 									_player->loadAnimations("rm10strs.nsp");
-									setupOtherNspAnimation(0,53);
+									setupOtherNspAnimation(0, 53);
 									return;
 								}
 								if (currentRoomNumber == 38 && roomExit.roomNumber == 7 && bVar) {
 									_player->loadAnimations("darkin.nsp");
-									setupOtherNspAnimation(0,41);
+									setupOtherNspAnimation(0, 41);
 									return;
 								}
 								if (_objectVar[52] == 1 &&
@@ -696,7 +703,7 @@ void DarkseedEngine::handleInput() {
 									// TODO the original sets roomExit to number 8 here.
 								} else if (currentRoomNumber == 11 && roomExit.roomNumber == 15 && bVar) {
 									_player->loadAnimations("rm11strs.nsp");
-									setupOtherNspAnimation(0,55);
+									setupOtherNspAnimation(0, 55);
 									return;
 								}
 								if (currentRoomNumber == 14 && roomExit.roomNumber == 35 && _objectVar[99] != 1) {
@@ -710,7 +717,7 @@ void DarkseedEngine::handleInput() {
 												)
 									) {
 									_player->loadAnimations("opendoor.nsp");
-									setupOtherNspAnimation(0,14);
+									setupOtherNspAnimation(0, 14);
 									// FUN_1208_0dac_sound_related(10,CONCAT11(extraout_AH,5));
 									return;
 								}
@@ -718,12 +725,12 @@ void DarkseedEngine::handleInput() {
 									_player->_position.x = 346;
 									_player->_position.y = 176;
 									_player->loadAnimations("stairs.nsp");
-									setupOtherNspAnimation(1,6);
+									setupOtherNspAnimation(1, 6);
 									return;
 								}
 								if (currentRoomNumber == 33 && roomExit.roomNumber == 34 && bVar) {
 									_player->loadAnimations("opendoor.nsp");
-									setupOtherNspAnimation(0,25);
+									setupOtherNspAnimation(0, 25);
 									// FUN_1208_0dac_sound_related(24,CONCAT11(extraout_AH,5));
 									return;
 								}
@@ -731,7 +738,7 @@ void DarkseedEngine::handleInput() {
 									if (_player->_position.x == 466 && _player->_position.y == 195) {
 										_player->loadAnimations("stairs.nsp");
 										_player->_position.x -= 35;
-										setupOtherNspAnimation(3,7);
+										setupOtherNspAnimation(3, 7);
 										return;
 									}
 									bVar = false;
@@ -793,8 +800,8 @@ void DarkseedEngine::handleInput() {
 					int objIdx = _room->getObjectUnderCursor();
 					_cursor.setPosition(currentCursorPos);
 					if (objIdx != -1) {
-					int objType = _room->_roomObj[objIdx].type;
-					int objNum = _room->_roomObj[objIdx].objNum;
+						int objType = _room->_roomObj[objIdx].type;
+						int objNum = _room->_roomObj[objIdx].objNum;
 						if (((objType != 4 && objType != 0 && objType < 10) || objNum > 5 || _room->_collisionType != 0)) {
 							if (_room->_collisionType == 0) {
 								handleObjCollision(objNum);
@@ -821,7 +828,7 @@ void DarkseedEngine::handleInput() {
 					int walkXDelta = 0;
 					int walkYDelta = 0;
 					int local_a = scaledWalkSpeed_maybe * 16;
-					if ( _player->_direction == 0 || _player->_direction == 2) {
+					if (_player->_direction == 0 || _player->_direction == 2) {
 						local_a = local_a / 3;
 					}
 					if (local_a < 1000) {
@@ -1062,21 +1069,21 @@ void DarkseedEngine::changeToRoom(int newRoomNumber, bool placeDirectly) { // AK
 		_player->loadAnimations("stairs.nsp");
 		_player->_position.x = 0x174;
 		_player->_position.y = 0x100;
-		setupOtherNspAnimation(2,6);
+		setupOtherNspAnimation(2, 6);
 	} else if (newRoomNumber == 6 && _previousRoomNumber == 5) {
 		_player->loadAnimations("stairs.nsp");
 		_player->_position.x = 0x19f;
 		_player->_position.y = 0x8c;
-		setupOtherNspAnimation(0,7);
+		setupOtherNspAnimation(0, 7);
 	} else if (newRoomNumber == 32 && _previousRoomNumber == 13) {
 		_player->loadAnimations("slide.nsp");
-		setupOtherNspAnimation(0,16);
+		setupOtherNspAnimation(0, 16);
 	} else if (newRoomNumber == 10 && _previousRoomNumber == 6) {
 		_player->loadAnimations("rm10strs.nsp");
-		setupOtherNspAnimation(1,54);
+		setupOtherNspAnimation(1, 54);
 	} else if (newRoomNumber == 11 && _previousRoomNumber == 15) {
 		_player->loadAnimations("rm11strs.nsp");
-		setupOtherNspAnimation(1,56);
+		setupOtherNspAnimation(1, 56);
 	} else if (newRoomNumber == 46 && _previousRoomNumber == 60 && _objectVar[57] == 1) {
 		_console->printTosText(62);
 		// TODO wait logic here.
@@ -1084,7 +1091,7 @@ void DarkseedEngine::changeToRoom(int newRoomNumber, bool placeDirectly) { // AK
 		return;
 	} else if (newRoomNumber == 7 && _previousRoomNumber == 38) {
 		_player->loadAnimations("mirror.nsp");
-		setupOtherNspAnimation(1,28);
+		setupOtherNspAnimation(1, 28);
 		if (_objectVar[47] == 0 && _currentDay == 3 && _objectVar[51] == 1) {
 			_objectVar.setObjectRunningCode(47, 2);
 		}
@@ -1159,8 +1166,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 	if (isPlayingAnimation_maybe == 0 ||
 		(otherNspAnimationType_maybe != 6 && otherNspAnimationType_maybe != 7) || currentRoomNumber != 5) {
 		_frameBottom = 240;
-	}
-	else {
+	} else {
 		_frameBottom = 208;
 	}
 
@@ -1242,8 +1248,8 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 					int curScaledWidth = g_engine->scaledSpriteWidth;
 					int curScaledHeight = g_engine->scaledSpriteHeight;
 					_room->calculateScaledSpriteDimensions(
-						_player->_animations.getSpriteAt(_player->_frameIdx+1).width,
-						_player->_animations.getSpriteAt(_player->_frameIdx+1).height, _player->_position.y);
+						_player->_animations.getSpriteAt(_player->_frameIdx + 1).width,
+						_player->_animations.getSpriteAt(_player->_frameIdx + 1).height, _player->_position.y);
 					const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 					_sprites.addSpriteToDrawList(_player->_position.x - (curScaledWidth + g_engine->scaledSpriteWidth) / 2, _player->_position.y - curScaledHeight, &animSprite, 240 - _player->_position.y, curScaledWidth, curScaledHeight, false);
 				} else if (!_scaleSequence) {
@@ -1256,12 +1262,10 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						if (_player->_frameIdx < 4) {
 							x = 0x75;
 							y = 0x71;
-						}
-						else if (_player->_frameIdx == 4) {
+						} else if (_player->_frameIdx == 4) {
 							x = 0x75;
 							y = 0x69;
-						}
-						else if (_player->_frameIdx == 7) {
+						} else if (_player->_frameIdx == 7) {
 							x = 0xa6;
 							y = 0x5b;
 						}
@@ -1311,9 +1315,9 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 							} else if (otherNspAnimationType_maybe == 57 || otherNspAnimationType_maybe == 58) {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-								Common::Point spritePos = {344,57};
+								Common::Point spritePos = {344, 57};
 								if (_room->_roomNumber == 41) {
-									spritePos = {295,46};
+									spritePos = {295, 46};
 								}
 								_sprites.addSpriteToDrawList(spritePos.x, spritePos.y, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
 							} else {
@@ -1525,7 +1529,7 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		break;
 	case 44:
 	case 46:
-		playSound(30,5,-1);
+		playSound(30, 5, -1);
 		break;
 	case 47:
 		_scaleSequence = true;
@@ -1546,7 +1550,7 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		break;
 	case 57:
 	case 58:
-		playSound(48,5,-1);
+		playSound(48, 5, -1);
 		break;
 	case 63:
 		_player->_position.x = 249;
@@ -1561,13 +1565,13 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 void DarkseedEngine::updateAnimation() {
 	int currentRoomNumber = _room->_roomNumber;
 	switch (otherNspAnimationType_maybe) {
-	case 0: break;
+	case 0:
+		break;
 	case 1 : // sleep wake anim
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
-		}
-		else {
+		} else {
 			_player->_position.x = 0xdf;
 			_player->_position.y = 0xbe;
 			_player->_walkTarget.x = 0xdf;
@@ -1640,8 +1644,7 @@ void DarkseedEngine::updateAnimation() {
 		advanceAnimationFrame(1);
 		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
-		}
-		else {
+		} else {
 			gotonextmorning(); // TODO there might be some extra logic required from original function
 			_player->_position.x = 242;
 			_player->_position.y = 187;
@@ -1723,8 +1726,7 @@ void DarkseedEngine::updateAnimation() {
 					_console->printTosText(904);
 					_objectVar[47] = 1;
 					_objectVar[46] = 1;
-				}
-				else {
+				} else {
 					_objectVar[51] = 2;
 					_objectVar[47] = 1;
 					_console->printTosText(922);
@@ -1808,7 +1810,7 @@ void DarkseedEngine::updateAnimation() {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
 		}
 		if (animIndexTbl[0] == 5 && _FrameAdvanced) {
-			playSound(31,5,-1);
+			playSound(31, 5, -1);
 			_console->printTosText(666);
 			if (_objectVar[42] == 0) {
 				_objectVar[42] = 1;
@@ -1880,7 +1882,7 @@ void DarkseedEngine::updateAnimation() {
 					int newRoomNumber = _previousRoomNumber;
 					if (_room->_roomNumber == 6) {
 						if (_player->_isAutoWalkingToBed && _objectVar[137] == 2) {
-							 wongame();
+							wongame();
 						}
 						newRoomNumber = 10;
 					} else if (_room->_roomNumber == 10) {
@@ -2005,8 +2007,7 @@ void DarkseedEngine::updateAnimation() {
 		_room->advanceFrame(1);
 		if (!_ObjRestarted) {
 			_player->_frameIdx = _room->_locationSprites.getAnimAt(1).frameNo[_room->_locObjFrame[1]];
-		}
-		else {
+		} else {
 			throwmikeinjail();
 		}
 		break;
@@ -2092,15 +2093,13 @@ void DarkseedEngine::updateAnimation() {
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
-		}
-		else {
+		} else {
 			if (otherNspAnimationType_maybe == 52) {
 				_objectVar[108] = (_objectVar[108] == 0) ? 1 : 0;
-			}
-			else {
+			} else {
 				_objectVar[56 + otherNspAnimationType_maybe] = _objectVar[56 + otherNspAnimationType_maybe] == 0 ? 1 : 0;
 			}
-			playSound(42,5,-1);
+			playSound(42, 5, -1);
 		}
 		break;
 	case 53 :
@@ -2201,8 +2200,7 @@ void DarkseedEngine::updateAnimation() {
 				animIndexTbl[0] = 0;
 				spriteAnimCountdownTimer[0] = 3;
 				_objectVar[1] = 2000;
-			}
-			else {
+			} else {
 				_console->addTextLine("The cops ignore your demands for attention.");
 			}
 		}
@@ -2223,8 +2221,7 @@ void DarkseedEngine::updateAnimation() {
 void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
 	if (!_scaleSequence) {
 		scaledWalkSpeed_maybe = 1000;
-	}
-	else {
+	} else {
 		_room->calculateScaledSpriteDimensions(10, 10, _player->_position.y);
 	}
 	_ObjRestarted = false;
@@ -2276,7 +2273,7 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 						_inventory.removeItem(20);
 						_inventory.removeItem(25);
 						updateDisplay();
-						playSound(17,5,-1);
+						playSound(17, 5, -1);
 						_inventory.addItem(27);
 //						waitxticks(30); TODO do we need to add delay here?
 						return;
@@ -2389,7 +2386,7 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 		_ObjRestarted = false;
 		int16 frameIdx = 0;
 		int16 prevFrameIdx = 0;
-		while(!_ObjRestarted) {
+		while (!_ObjRestarted) {
 			prevFrameIdx = frameIdx;
 			for (int i = 0; i < 6; i++) {
 				wait();
@@ -2412,7 +2409,7 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 		}
 
 		_ObjRestarted = false;
-		while(!_ObjRestarted) {
+		while (!_ObjRestarted) {
 			for (int i = 0; i < 6; i++) {
 				wait();
 			}
@@ -2442,8 +2439,7 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			_console->printTosText(930);
 		} else if (_actionMode == 27) {
 			_console->printTosText(929);
-		}
-		else {
+		} else {
 			_console->printTosText(967);
 			_console->addToCurrentLine(_objectVar.getObjectName(_actionMode)); // TODO remove newline after object name
 			_console->printTosText(968);
@@ -2472,7 +2468,7 @@ void DarkseedEngine::lookCode(int objNum) {
 		return;
 	}
 	if (objNum == 42) {
-		switch(_objectVar[42]) {
+		switch (_objectVar[42]) {
 		case 0:
 			_console->printTosText(652);
 			break;
@@ -2495,7 +2491,7 @@ void DarkseedEngine::lookCode(int objNum) {
 		return;
 	}
 	if (objNum == 101) {
-		switch(_objectVar[101]) {
+		switch (_objectVar[101]) {
 		case 0:
 		case 4:
 			_console->printTosText(732);
@@ -2517,12 +2513,10 @@ void DarkseedEngine::lookCode(int objNum) {
 		if (_objectVar[80] > 1) {
 			if (_objectVar[25] == 0 || _objectVar[25] == 100) {
 				_console->printTosText(691);
-			}
-			else if (_objectVar[25] == 1 || _objectVar[25] == 2) {
+			} else if (_objectVar[25] == 1 || _objectVar[25] == 2) {
 				_objectVar[25] = 2;
 				_console->printTosText(697);
-			}
-			else {
+			} else {
 				_console->printTosText(693);
 			}
 		}
@@ -2554,8 +2548,7 @@ void DarkseedEngine::lookCode(int objNum) {
 	if (objNum == 194) {
 		if (_objectVar[53] == 2) {
 			_console->printTosText(494);
-		}
-		else {
+		} else {
 			_console->printTosText(496);
 		}
 		return;
@@ -2620,16 +2613,14 @@ void DarkseedEngine::lookCode(int objNum) {
 	if (objNum == 51) {
 		if (_objectVar[187] == 0) {
 			_console->printTosText(851);
-		}
-		else if (_objectVar[51] == 0) {
+		} else if (_objectVar[51] == 0) {
 			_console->printTosText(853);
 			_objectVar[51] = 1;
 			keeperanim();
 			_objectVar.setObjectRunningCode(72, 1);
 			_inventory.addItem(24);
 			_console->printTosText(959);
-		}
-		else {
+		} else {
 			_console->printTosText(960);
 		}
 	}
@@ -2718,7 +2709,7 @@ void DarkseedEngine::showFullscreenPic(const Common::Path &filename) {
 		delete _fullscreenPic;
 	}
 	_fullscreenPic = new Pic();
-	if(!_fullscreenPic->load(filename)) {
+	if (!_fullscreenPic->load(filename)) {
 		delete _fullscreenPic;
 		_fullscreenPic = nullptr;
 		error("Failed to load %s", filename.toString().c_str());
@@ -2844,7 +2835,7 @@ void DarkseedEngine::initDelbertAtSide() {
 void DarkseedEngine::throwmikeinjail() {
 	_console->printTosText(912);
 	if (_room->_roomNumber == 15) {
-		playSound(0,6,-1);
+		playSound(0, 6, -1);
 	}
 	_player->_position = {250, 200};
 	isPlayingAnimation_maybe = false;
@@ -2870,7 +2861,7 @@ void DarkseedEngine::runObjects() {
 	}
 	if (((_room->_roomNumber == 46) || (_room->_roomNumber == 60)) &&
 		(((_SoundTimer & 15) == 0 && (g_engine->_objectVar[57] == 1)))) {
-		playSound(9,5,-1);
+		playSound(9, 5, -1);
 	}
 	if ((_room->_roomNumber == 12) && (_SoundTimer > 5)) {
 		_SoundTimer = 0;
@@ -2879,10 +2870,10 @@ void DarkseedEngine::runObjects() {
 		_SoundTimer = 0;
 	}
 	if ((_room->_roomNumber == 38) && ((_SoundTimer & 31) == 0)) {
-		playSound(23,5,-1);
+		playSound(23, 5, -1);
 	}
 	if ((_room->_roomNumber == 45) && ((_SoundTimer & 63) == 0)) {
-		playSound(10,5,-1);
+		playSound(10, 5, -1);
 	}
 
 	int16 delbertSpriteIdx = 0;
@@ -2940,7 +2931,7 @@ void DarkseedEngine::runObjects() {
 		if (delbertPos.x < 560) {
 			const Sprite &sprite = _room->_locationSprites.getSpriteAt(delbertSpriteIdx);
 			g_engine->_sprites.addSpriteToDrawList(delbertPos.x, 140, &sprite, 240 - (sprite.height + 140), sprite.width, sprite.height, false);
-			_room->updateRoomObj(141,delbertPos.x,sprite.width,140,sprite.height);
+			_room->updateRoomObj(141, delbertPos.x, sprite.width, 140, sprite.height);
 		} else {
 			_objectVar[141] = 11;
 			_room->removeObjectFromRoom(141);
@@ -2953,7 +2944,7 @@ void DarkseedEngine::runObjects() {
 		const Sprite &sprite = _room->_locationSprites.getSpriteAt(delbertSpriteIdx);
 		delthrowstick(delbertSpriteIdx);
 		g_engine->_sprites.addSpriteToDrawList(145, 140, &sprite, 240 - (sprite.height + 140), sprite.width, sprite.height, false);
-		_room->updateRoomObj(141,145,sprite.width,140,sprite.height);
+		_room->updateRoomObj(141, 145, sprite.width, 140, sprite.height);
 	}
 	if ((_objectVar[141] == 7 || _objectVar[141] == 8) && _room->_roomNumber == 31) {
 		if (delbertSpriteIdx > 7 && _objectVar[45] == 0) {
@@ -3012,11 +3003,10 @@ void DarkseedEngine::runObjects() {
 				if ((_objectVar[45] == 0) && (_room->_locObjFrame[1] < 6)) {
 					flipFidoSprite = true;
 				}
-				if ((_objectVar[45]== 1) && (7 < _room->_locObjFrame[2])) {
+				if ((_objectVar[45] == 1) && (7 < _room->_locObjFrame[2])) {
 					flipFidoSprite = true;
 				}
-				if (((_objectVar[45] == 1) && (_room->_locObjFrame[2] == 9)) && (_objectVar[141] ==  8)
-				) {
+				if (((_objectVar[45] == 1) && (_room->_locObjFrame[2] == 9)) && (_objectVar[141] ==  8)) {
 					stickPosition = {230, 205};
 					_objectVar.setMoveObjectPosition(19, stickPosition);
 					_objectVar[45] = 2;
@@ -3060,8 +3050,7 @@ void DarkseedEngine::runObjects() {
 			if (_delbertspeech == 64) {
 				_console->printTosText(908);
 				_sound->waitForSpeech();
-			}
-			else if (_delbertspeech == 65) {
+			} else if (_delbertspeech == 65) {
 				setupOtherNspAnimation(3, 20);
 				spriteAnimCountdownTimer[1] = 3;
 				_delbertspeech = 72;
@@ -3120,7 +3109,7 @@ void DarkseedEngine::runObjects() {
 	}
 	if (_room->_roomNumber == 32 && _currentDay == 2 && _objectVar[141] == 12) {
 		Common::Point delbertPosition = _objectVar.getMoveObjectPosition(141);
-		if(_room->advanceFrame(2)) {
+		if (_room->advanceFrame(2)) {
 			delbertPosition.x -= 8;
 			_objectVar.setMoveObjectX(141, delbertPosition.x);
 		}
@@ -3152,7 +3141,7 @@ void DarkseedEngine::runObjects() {
 		_room->removeObjectFromRoom(189);
 		const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]);
 		g_engine->_sprites.addSpriteToDrawList(463, 99, &sprite, 255, sprite.width, sprite.height, false);
-		_room->updateRoomObj(64,467,200,99,200);
+		_room->updateRoomObj(64, 467, 200, 99, 200);
 	}
 	if ((((!isPlayingAnimation_maybe || otherNspAnimationType_maybe != 39) && _room->_roomNumber == 10) &&
 		 _objectVar.getObjectRunningCode(72) != 0) &&
@@ -3178,7 +3167,7 @@ void DarkseedEngine::runObjects() {
 				}
 				if (!_player->_heroMoving) {
 					Common::Point oldCursor = g_engine->_cursor.getPosition();
-					Common::Point newTarget = {322,226};
+					Common::Point newTarget = {322, 226};
 					g_engine->_cursor.setPosition(newTarget);
 					_player->calculateWalkTarget();
 					g_engine->_cursor.setPosition(oldCursor);
@@ -3237,7 +3226,7 @@ void DarkseedEngine::runObjects() {
 	}
 	// handle package logic.
 	if (_objectVar._objectRunningCode[140] != 0) {
-		switch(_currentTimeInSeconds - 36000) {
+		switch (_currentTimeInSeconds - 36000) {
 		case 120:
 		case 121:
 		case 420:
@@ -3248,8 +3237,7 @@ void DarkseedEngine::runObjects() {
 				if (_room->_roomNumber == 6) {
 //					FUN_1208_0dac_sound_related(93,5); TODO floppy sound
 					playSound(27, 5, -1);
-				}
-				else {
+				} else {
 					playSound(29, 5, -1);
 //					FUN_1208_0dac_sound_related(95,5); TODO floppy sound
 				}
@@ -3272,7 +3260,7 @@ void DarkseedEngine::moveplayertodelbert() {
 		_player->_herowaiting = true;
 		if (!_player->_heroMoving && _player->_position.x != 364 && _player->_position.y != 198) {
 			Common::Point oldCursor = g_engine->_cursor.getPosition();
-			Common::Point newTarget = {364,198};
+			Common::Point newTarget = {364, 198};
 			g_engine->_cursor.setPosition(newTarget);
 			_player->calculateWalkTarget();
 			g_engine->_cursor.setPosition(oldCursor);
@@ -3361,7 +3349,7 @@ void DarkseedEngine::libanim(bool pickingUpReservedBook) {
 		_console->draw();
 
 		advanceAnimationFrame(0);
-		const Sprite &eyesSprite = _player->_animations.getSpriteAt( _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]);
+		const Sprite &eyesSprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]);
 		g_engine->_sprites.addSpriteToDrawList(255, 114, &eyesSprite, 255, eyesSprite.width, eyesSprite.height, false);
 		advanceAnimationFrame(1);
 
@@ -3417,7 +3405,8 @@ static constexpr uint8 dcopList[100] = {
 	2, 1, 2, 3,
 	2, 1, 0, 1,
 	2, 1, 2, 1,
-	2, 3, 2, 1};
+	2, 3, 2, 1
+};
 
 void DarkseedEngine::dcopanim() {
 	_player->loadAnimations("dcopb.nsp");
@@ -3519,7 +3508,8 @@ static constexpr uint8 keeperList[250] = {
 	13, 10, 11, 10,
 	0, 0, 0, 0,
 	0, 0, 0, 0,
-	0, 0};
+	0, 0
+};
 
 void DarkseedEngine::keeperanim() {
 	_cursor.showCursor(false);
@@ -3628,7 +3618,8 @@ static constexpr uint8 sargoList[100] = {
 	1, 2, 3, 2,
 	1, 0, 1, 2,
 	3, 4, 3, 2,
-	3, 2, 1, 1};
+	3, 2, 1, 1
+};
 
 void DarkseedEngine::sargoanim() {
 	_cursor.showCursor(false);
diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
index a786d637153..308a8d4f0fd 100644
--- a/engines/darkseed/debugconsole.cpp
+++ b/engines/darkseed/debugconsole.cpp
@@ -100,7 +100,7 @@ bool DebugConsole::Cmd_enablePathfinderOverlay(int argc, const char **argv) {
 	} else if (!strcmp(argv[1], "false") || !strcmp(argv[1], "f")) {
 		g_engine->_debugShowWalkPath = false;
 	}
-		return true;
+	return true;
 }
 
 bool DebugConsole::validateObjVarIndex(int16 varIdx) {
diff --git a/engines/darkseed/gamefont.cpp b/engines/darkseed/gamefont.cpp
index fa7e2ac1727..a242ecad24c 100644
--- a/engines/darkseed/gamefont.cpp
+++ b/engines/darkseed/gamefont.cpp
@@ -56,19 +56,45 @@ int GameFont::stringLength(const Common::String &text) {
 const Sprite *GameFont::getCharacterSprite(char c) {
 	int letterIdx = 1000;
 	switch (c) {
-	case 0x20 : letterIdx = 0x46; break;
-	case 0x21 : letterIdx = 0x36; break;
-	case 0x22 : letterIdx = 0x3a; break;
-	case 0x27 : letterIdx = 0x45; break;
-	case 0x28 : letterIdx = 0x37; break;
-	case 0x29 : letterIdx = 0x38; break;
-	case 0x2b : letterIdx = 0xa; break;
-	case 0x2c : letterIdx = 0x34; break;
-	case 0x2d : letterIdx = 0x46; break;
-	case 0x2e : letterIdx = 0x35; break;
-	case 0x3a : letterIdx = 0x47; break;
-	case 0x3f : letterIdx = 0x39; break;
-	case 0x5e : letterIdx = 0x3a; break;
+	case 0x20 :
+		letterIdx = 0x46;
+		break;
+	case 0x21 :
+		letterIdx = 0x36;
+		break;
+	case 0x22 :
+		letterIdx = 0x3a;
+		break;
+	case 0x27 :
+		letterIdx = 0x45;
+		break;
+	case 0x28 :
+		letterIdx = 0x37;
+		break;
+	case 0x29 :
+		letterIdx = 0x38;
+		break;
+	case 0x2b :
+		letterIdx = 0xa;
+		break;
+	case 0x2c :
+		letterIdx = 0x34;
+		break;
+	case 0x2d :
+		letterIdx = 0x46;
+		break;
+	case 0x2e :
+		letterIdx = 0x35;
+		break;
+	case 0x3a :
+		letterIdx = 0x47;
+		break;
+	case 0x3f :
+		letterIdx = 0x39;
+		break;
+	case 0x5e :
+		letterIdx = 0x3a;
+		break;
 
 	default: {
 		if (c < 0x41 || c > 0x5a) {
diff --git a/engines/darkseed/img.cpp b/engines/darkseed/img.cpp
index e6023936a70..9ee65675027 100644
--- a/engines/darkseed/img.cpp
+++ b/engines/darkseed/img.cpp
@@ -28,7 +28,7 @@ namespace Darkseed {
 
 bool Img::load(const Common::Path &filename) {
 	Common::File file;
-	if(!file.open(filename)) {
+	if (!file.open(filename)) {
 		return false;
 	}
 	bool ret = load(file);
@@ -60,7 +60,7 @@ bool Img::loadWithoutPosition(Common::SeekableReadStream &readStream) {
 bool Img::unpackRLE(Common::SeekableReadStream &readStream, Common::Array<byte> &buf) {
 	uint16 size = readStream.readUint16LE();
 	uint16 idx = 0;
-	buf.resize(size+1);
+	buf.resize(size + 1);
 
 	while (idx <= size) {
 		uint8 byte = readStream.readByte();
@@ -91,11 +91,11 @@ void Img::unpackPlanarData(Common::Array<uint8> &planarData, uint16 headerOffset
 	mode = planarData.data()[headerOffset + 4];
 //	assert(mode == 0xff);
 	pixels.resize(width * height, 0);
-	for (int py=0; py < height; py++) {
+	for (int py = 0; py < height; py++) {
 		for (int plane = 0; plane < 4; plane++) {
-			for (int px=0; px < width; px++) {
+			for (int px = 0; px < width; px++) {
 				int bitPos = (7 - (px % 8));
-				int planeBit = (planarData[(headerOffset + 5) + (px/8) + (width/8)*plane + py * (width/8)*4] & (1 << bitPos)) >> bitPos;
+				int planeBit = (planarData[(headerOffset + 5) + (px / 8) + (width / 8) * plane + py * (width / 8) * 4] & (1 << bitPos)) >> bitPos;
 				pixels[px + py * width] |= planeBit << (3 - plane);
 			}
 		}
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 7a5c8cc77c2..64e01f66d21 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -24,7 +24,7 @@
 
 constexpr uint16 MAX_INVENTORY = 42;
 constexpr uint16 MAX_ICONS = 9;
-static constexpr Common::Rect drawArea = {{139,0}, 334, 40};
+static constexpr Common::Rect drawArea = {{139, 0}, 334, 40};
 
 Darkseed::Inventory::Inventory() {
 	_iconList.resize(MAX_ICONS);
@@ -50,7 +50,7 @@ void Darkseed::Inventory::removeItem(uint8 item) {
 	for (int i = 0; i < _inventoryLength; i++) {
 		if (_inventory[i] == item) {
 			for (int j = i; j < _inventoryLength - 1; j++) {
-				_inventory[j] = _inventory[j+1];
+				_inventory[j] = _inventory[j + 1];
 			}
 			_inventoryLength--;
 			update();
@@ -72,11 +72,11 @@ void Darkseed::Inventory::update() {
 	if (_inventoryLength + 1 < MAX_ICONS) {
 		_viewOffset = 0;
 		for (int i = 0; i < _inventoryLength; i++) {
-			_iconList[i+1] = _inventory[i];
+			_iconList[i + 1] = _inventory[i];
 		}
 	} else {
 		for (int i = 0; i < MAX_ICONS - 1; i++) {
-			_iconList[i+1] = _inventory[_viewOffset + i];
+			_iconList[i + 1] = _inventory[_viewOffset + i];
 		}
 		if (_viewOffset + 8 < _inventoryLength) {
 			_iconList[8] = 43;
@@ -109,7 +109,7 @@ void Darkseed::Inventory::draw() {
 	}
 
 	isVisible = true;
-	for(int i = 0; i < _numIcons; i++) {
+	for (int i = 0; i < _numIcons; i++) {
 		int icon = _iconList[i];
 		if (icon != 42 && icon != 43) {
 			icon += 42;
diff --git a/engines/darkseed/metaengine.cpp b/engines/darkseed/metaengine.cpp
index 38951c71bb2..ca46271b2a8 100644
--- a/engines/darkseed/metaengine.cpp
+++ b/engines/darkseed/metaengine.cpp
@@ -63,7 +63,7 @@ bool DarkseedMetaEngine::hasFeature(MetaEngineFeature f) const {
 }
 
 #if PLUGIN_ENABLED_DYNAMIC(DARKSEED)
-REGISTER_PLUGIN_DYNAMIC(DARKSEED, PLUGIN_TYPE_ENGINE, DarkseedMetaEngine);
+	REGISTER_PLUGIN_DYNAMIC(DARKSEED, PLUGIN_TYPE_ENGINE, DarkseedMetaEngine);
 #else
-REGISTER_PLUGIN_STATIC(DARKSEED, PLUGIN_TYPE_ENGINE, DarkseedMetaEngine);
+	REGISTER_PLUGIN_STATIC(DARKSEED, PLUGIN_TYPE_ENGINE, DarkseedMetaEngine);
 #endif
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index 8b218f6aaf0..32b2777f443 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -42,7 +42,7 @@ bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
 					return false;
 				}
 				hasReadByte = true;
-				 pixels[i] = currentDataByte >> 4;
+				pixels[i] = currentDataByte >> 4;
 			} else {
 				hasReadByte = false;
 				pixels[i] =  currentDataByte & 0xf;
@@ -59,7 +59,7 @@ void Darkseed::Sprite::draw(int x, int y, uint16 frameBottom) const {
 		clippedWidth = g_engine->_screen->w - x;
 	}
 	if (frameBottom != 0 && y + height > g_engine->_frameBottom) {
-		if ( y >= frameBottom) {
+		if (y >= frameBottom) {
 			return;
 		}
 		clippedHeight = frameBottom - y;
@@ -77,7 +77,7 @@ void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destH
 	}
 	const byte *source = pixels.data();
 	const int xs = ((width - 1) << 16) / destWidth;
-	const int ys = ((height -1) << 16) / destHeight;
+	const int ys = ((height - 1) << 16) / destHeight;
 	int clipX = 0, clipY = 0;
 	const int destPitch = destSurface->pitch;
 	if (destX < 0) {
@@ -135,7 +135,7 @@ void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destH
 bool Darkseed::Nsp::load(const Common::Path &filename) {
 	Common::File file;
 	Common::Path filePath = g_engine->getRoomFilePath(filename);
-	if(!file.open(filePath)) {
+	if (!file.open(filePath)) {
 		return false;
 	}
 	bool ret = load(file);
@@ -159,7 +159,7 @@ bool Darkseed::Nsp::load(Common::SeekableReadStream &readStream) {
 	}
 
 	for (int i = 0; i < 96; i++) {
-		if(!frames[i].loadData(readStream)) {
+		if (!frames[i].loadData(readStream)) {
 			return false;
 		}
 	}
@@ -176,7 +176,7 @@ const Darkseed::Sprite &Darkseed::Nsp::getSpriteAt(int index) {
 
 bool Darkseed::Nsp::loadObt(const Common::Path &filename) {
 	Common::File file;
-	if(!file.open(filename)) {
+	if (!file.open(filename)) {
 		return false;
 	}
 
@@ -187,14 +187,14 @@ bool Darkseed::Nsp::loadObt(const Common::Path &filename) {
 
 		for (int j = 0; j < 20; j++) {
 			if (file.readByte()) {
-				animations[i].deltaX.push_back(-(file.readUint16LE()/100));
+				animations[i].deltaX.push_back(-(file.readUint16LE() / 100));
 			} else {
-				animations[i].deltaX.push_back(file.readUint16LE()/100);
+				animations[i].deltaX.push_back(file.readUint16LE() / 100);
 			}
 			if (file.readByte()) {
-				animations[i].deltaY.push_back(-(file.readUint16LE()/100));
+				animations[i].deltaY.push_back(-(file.readUint16LE() / 100));
 			} else {
-				animations[i].deltaY.push_back(file.readUint16LE()/100);
+				animations[i].deltaY.push_back(file.readUint16LE() / 100);
 			}
 			animations[i].frameNo.push_back(file.readByte());
 			animations[i].frameDuration.push_back(file.readByte());
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
index 6f31e334692..670271dad80 100644
--- a/engines/darkseed/nsp.h
+++ b/engines/darkseed/nsp.h
@@ -60,10 +60,14 @@ private:
 
 public:
 	bool load(const Common::Path &filename);
-	bool containsSpriteAt(int index) { return (int)frames.size() > index; }
+	bool containsSpriteAt(int index) {
+		return (int)frames.size() > index;
+	}
 	const Sprite &getSpriteAt(int index);
 	const Obt &getAnimAt(int index);
-	int16 getTotalAnim() { return (int16)animations.size(); }
+	int16 getTotalAnim() {
+		return (int16)animations.size();
+	}
 
 private:
 	bool load(Common::SeekableReadStream &readStream);
diff --git a/engines/darkseed/pal.cpp b/engines/darkseed/pal.cpp
index 4394cb1198d..f8c9a5cd578 100644
--- a/engines/darkseed/pal.cpp
+++ b/engines/darkseed/pal.cpp
@@ -38,13 +38,13 @@ void Pal::load(const Pal &pal) {
 
 bool Pal::load(const Common::Path &filename, bool shouldInstallPalette) {
 	Common::File file;
-	if(!file.open(filename)) {
+	if (!file.open(filename)) {
 		return false;
 	}
 	uint32 bytesRead = file.read(palData, DARKSEED_PAL_SIZE);
 	assert(bytesRead == DARKSEED_PAL_SIZE);
 
-	for (int i=0; i < DARKSEED_PAL_SIZE; i++) {
+	for (int i = 0; i < DARKSEED_PAL_SIZE; i++) {
 		palData[i] = palData[i] << 2;
 	}
 	if (shouldInstallPalette) {
diff --git a/engines/darkseed/pic.cpp b/engines/darkseed/pic.cpp
index c5cde62eb71..d43c1d3ce94 100644
--- a/engines/darkseed/pic.cpp
+++ b/engines/darkseed/pic.cpp
@@ -26,7 +26,7 @@
 bool Darkseed::Pic::load(const Common::Path &filename) {
 	Common::File file;
 	Common::Path fullPath = g_engine->getPictureFilePath(filename);
-	if(!file.open(fullPath)) {
+	if (!file.open(fullPath)) {
 		debug("Failed to load %s", fullPath.toString().c_str());
 		return false;
 	}
@@ -41,11 +41,11 @@ bool Darkseed::Pic::load(const Common::Path &filename) {
 bool Darkseed::Pic::load(Common::SeekableReadStream &readStream) {
 	width = readStream.readUint16BE();
 	height = readStream.readUint16BE();
-	pixels.resize(width * (height+1), 0);
+	pixels.resize(width * (height + 1), 0);
 
 	int curX = 0;
 	int curY = 0;
-	while(curY < height) {
+	while (curY < height) {
 		int rleCommand = readNextNibble(readStream);
 
 		if (rleCommand < 8) {
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 8b760347dc6..eb0b22a197c 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -58,26 +58,22 @@ void Darkseed::Player::updateSprite() {
 		if (_direction == 2) {
 			if (_position.x < _walkTarget.x) {
 				g_engine->player_sprite_related_2c85_82f3 = true;
-			}
-			else if (_walkTarget.x < _position.x) {
+			} else if (_walkTarget.x < _position.x) {
 				g_engine->player_sprite_related_2c85_82f3 = false;
 			}
 		}
 		if (_direction == 0) {
 			if (_walkTarget.x < _position.x) {
 				g_engine->player_sprite_related_2c85_82f3 = true;
-			}
-			else if (_position.x < _walkTarget.x) {
+			} else if (_position.x < _walkTarget.x) {
 				g_engine->player_sprite_related_2c85_82f3 = false;
 			}
 		}
-	}
-	else {
+	} else {
 		g_engine->player_sprite_related_2c85_82f3 = 4 < playerSpriteWalkIndex_maybe;
 		if (g_engine->player_sprite_related_2c85_82f3) {
 			_frameIdx = 0x20 - playerSpriteWalkIndex_maybe;
-		}
-		else {
+		} else {
 			_frameIdx = playerSpriteWalkIndex_maybe + 0x18;
 		}
 	}
@@ -87,7 +83,7 @@ bool Darkseed::Player::isAtPosition(int x, int y) const {
 }
 
 bool Darkseed::Player::isAtWalkTarget() const {
-	return _position ==_walkTarget;
+	return _position == _walkTarget;
 }
 
 void Darkseed::Player::changeDirection(int16 oldDir, int16 newDir) {
@@ -127,35 +123,30 @@ void Darkseed::Player::playerFaceWalkTarget() {
 	int previousDirection;
 	int xDelta;
 	int yDelta;
-  
+
 	previousDirection = _direction;
 	if (_position.x < _walkTarget.x) {
 		xDelta = _walkTarget.x - _position.x;
-	}
-	else {
+	} else {
 		xDelta = _position.x - _walkTarget.x;
 	}
 	if (_position.y < _walkTarget.y) {
 		yDelta = _walkTarget.y - _position.y;
-	}
-	else {
+	} else {
 		yDelta = _position.y - _walkTarget.y;
 	}
 	if (yDelta * 2 <= xDelta) {
 		if (_position.x < _walkTarget.x) {
 			_direction = 1;
-		}
-		else if (_walkTarget.x < _position.x) {
+		} else if (_walkTarget.x < _position.x) {
 			_direction = 3;
 		}
-	}
-	else if (_position.y < _walkTarget.y) {
+	} else if (_position.y < _walkTarget.y) {
 		_direction = 2;
-	}
-	else {
+	} else {
 		_direction = 0;
 	}
-	changeDirection(previousDirection,_direction);
+	changeDirection(previousDirection, _direction);
 	updateSprite();
 	_positionLong = _position;
 }
@@ -166,7 +157,7 @@ void Darkseed::Player::calculateWalkTarget() {
 	walkPathIndex = -1;
 	numConnectorsInWalkPath = 0;
 	int selectedObjNum = 0;
-	if(g_engine->_actionMode == PointerAction) {
+	if (g_engine->_actionMode == PointerAction) {
 		selectedObjNum = g_engine->_room->getRoomExitAtCursor();
 	}
 
@@ -213,7 +204,7 @@ void Darkseed::Player::calculateWalkTarget() {
 		int connectorToTargetDist = Math::hypotenuse(connector.x - _walkTarget.x, connector.y - _walkTarget.y);
 		int playerToTargetDist = Math::hypotenuse(_position.x - _walkTarget.x, _position.y - _walkTarget.y);
 		if (connectorToTargetDist < playerToTargetDist) {
-			if(g_engine->_room->canWalkInLineToTarget(_position.x, _position.y, connector.x, connector.y)) {
+			if (g_engine->_room->canWalkInLineToTarget(_position.x, _position.y, connector.x, connector.y)) {
 				_finalTarget = _walkTarget;
 				_walkTarget = connector;
 			} else {
@@ -272,10 +263,10 @@ void Darkseed::Player::updatePlayerPositionAfterRoomChange() {
 
 		int yUp = _position.y;
 		int yDown = _position.y;
-		while(!g_engine->_room->canWalkAtLocation(_position.x, yUp) && yUp < 0xee) {
+		while (!g_engine->_room->canWalkAtLocation(_position.x, yUp) && yUp < 0xee) {
 			yUp++;
 		}
-		while(!g_engine->_room->canWalkAtLocation(_position.x, yDown) && yDown > 0x28) {
+		while (!g_engine->_room->canWalkAtLocation(_position.x, yDown) && yDown > 0x28) {
 			yDown--;
 		}
 		if (yUp - _position.y < _position.y - yDown) {
@@ -292,10 +283,10 @@ void Darkseed::Player::updatePlayerPositionAfterRoomChange() {
 
 		int yUp = _position.y;
 		int yDown = _position.y;
-		while(!g_engine->_room->canWalkAtLocation(_position.x, yUp) && yUp < 0xee) {
+		while (!g_engine->_room->canWalkAtLocation(_position.x, yUp) && yUp < 0xee) {
 			yUp++;
 		}
-		while(!g_engine->_room->canWalkAtLocation(_position.x, yDown) && yDown > 0x28) {
+		while (!g_engine->_room->canWalkAtLocation(_position.x, yDown) && yDown > 0x28) {
 			yDown--;
 		}
 		if (yUp - _position.y < _position.y - yDown) {
@@ -307,7 +298,7 @@ void Darkseed::Player::updatePlayerPositionAfterRoomChange() {
 }
 
 void Darkseed::Player::createConnectorPathToDest() {
-	constexpr Common::Point noConnectorFound(-1,-1);
+	constexpr Common::Point noConnectorFound(-1, -1);
 	Common::Point origWalkTarget = _walkTarget;
 	Common::Point startPoint = _position;
 	if (g_engine->_room->_roomNumber != 5 || _position.x > 320) {
@@ -403,10 +394,10 @@ void Darkseed::Player::draw() {
 				if (i == walkPathIndex) {
 					g_engine->_screen->drawLine(_position.x, _position.y, _connectorList[i].x, _connectorList[i].y, 2);
 				} else {
-					g_engine->_screen->drawLine(_connectorList[i].x, _connectorList[i].y, _connectorList[i-1].x, _connectorList[i-1].y, 2);
+					g_engine->_screen->drawLine(_connectorList[i].x, _connectorList[i].y, _connectorList[i - 1].x, _connectorList[i - 1].y, 2);
 				}
 			}
-			g_engine->_screen->drawLine(_connectorList[numConnectorsInWalkPath-1].x, _connectorList[numConnectorsInWalkPath-1].y, _finalTarget.x, _finalTarget.y, 2);
+			g_engine->_screen->drawLine(_connectorList[numConnectorsInWalkPath - 1].x, _connectorList[numConnectorsInWalkPath - 1].y, _finalTarget.x, _finalTarget.y, 2);
 		}
 	}
 }
@@ -427,7 +418,7 @@ void Darkseed::Player::reverseConnectorList() {
 void Darkseed::Player::OptimisePath() {
 	if (g_engine->_room->_roomNumber != 7 && g_engine->_room->_roomNumber != 32) {
 		while (numConnectorsInWalkPath > 1) {
-			if(g_engine->_room->canWalkInLineToTarget(_connectorList[numConnectorsInWalkPath - 2].x, _connectorList[numConnectorsInWalkPath - 2].y, _walkTarget.x, _walkTarget.y)) {
+			if (g_engine->_room->canWalkInLineToTarget(_connectorList[numConnectorsInWalkPath - 2].x, _connectorList[numConnectorsInWalkPath - 2].y, _walkTarget.x, _walkTarget.y)) {
 				numConnectorsInWalkPath--;
 			} else {
 				break;
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index c522a41ce73..9cc069a12a7 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -40,7 +40,8 @@ const static int roomDescriptionTextTbl[] = {
 	850, 860, 867, 874,
 	886, 651, 682, 701,
 	702, 701, 898, 899,
-	903};
+	903
+};
 
 Darkseed::Room::Room(int roomNumber) : _roomNumber(roomNumber) {
 	room1.resize(8);
@@ -50,7 +51,7 @@ Darkseed::Room::Room(int roomNumber) : _roomNumber(roomNumber) {
 	_locObjFrame.resize(30);
 	_locObjFrameTimer.resize(30);
 
-	if(!load()) {
+	if (!load()) {
 		error("Failed to load room %d", roomNumber);
 	}
 }
@@ -69,7 +70,7 @@ void Darkseed::Room::initRoom() {
 	g_engine->_objectVar.setMoveObjectX(45, 230);
 	if (g_engine->_objectVar[45] < 3) {
 		g_engine->_objectVar[45] = 0;
-		g_engine->_objectVar.setMoveObjectPosition(19, {230,205});
+		g_engine->_objectVar.setMoveObjectPosition(19, {230, 205});
 	}
 	if (g_engine->_objectVar[141] == 8) {
 		g_engine->_objectVar[141] = 7;
@@ -81,7 +82,7 @@ bool Darkseed::Room::load() {
 	Common::Path romFilename;
 	Common::File file;
 	romFilename = g_engine->getRoomFilePath(Common::Path(Common::String::format("%s.rom", filenameBase.c_str(), _roomNumber)));
-	if(!file.open(romFilename)) {
+	if (!file.open(romFilename)) {
 		return false;
 	}
 
@@ -154,7 +155,7 @@ bool Darkseed::Room::load() {
 	file.close();
 
 	_collisionType = 0;
-	if(!pic.load(picFilename)) {
+	if (!pic.load(picFilename)) {
 		return false;
 	}
 
@@ -373,7 +374,7 @@ void Darkseed::Room::update() {
 		if (checkCursorAndMoveableObjects() != -1 || CheckCursorAndMovedObjects() != -1) {
 			g_engine->_cursor.setCursorType(ExclamationMark);
 		} else {
-			int objIdx = checkCursorAndStaticObjects(0,0);
+			int objIdx = checkCursorAndStaticObjects(0, 0);
 			if (objIdx != -1 && _roomObj[objIdx].objNum > 7) {
 				g_engine->_cursor.setCursorType(ExclamationMark);
 			} else {
@@ -470,13 +471,12 @@ bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int de
 						srcX = srcX + -1;
 					}
 					srcY = srcY + -1;
-					iVar2 = canWalkAtLocation(srcX,srcY);
+					iVar2 = canWalkAtLocation(srcX, srcY);
 					if (iVar2 == 0) {
 						return 0;
 					}
 				}
-			}
-			else {
+			} else {
 				while (srcX != destX) {
 					iVar4 = iVar4 - destY;
 					if (-iVar4 == iVar1 || -iVar1 < iVar4) {
@@ -484,14 +484,13 @@ bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int de
 						srcY = srcY + -1;
 					}
 					srcX = srcX + -1;
-					iVar2 = canWalkAtLocation(srcX,srcY);
+					iVar2 = canWalkAtLocation(srcX, srcY);
 					if (iVar2 == 0) {
 						return 0;
 					}
 				}
 			}
-		}
-		else if ((iVar1 < 1) && (0 < destY)) {
+		} else if ((iVar1 < 1) && (0 < destY)) {
 			iVar2 = -iVar1;
 			if (-destY == iVar1 || iVar2 < destY) {
 				while (srcX != destX) {
@@ -501,13 +500,12 @@ bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int de
 						srcX = srcX + -1;
 					}
 					srcY = srcY + 1;
-					iVar2 = canWalkAtLocation(srcX,srcY);
+					iVar2 = canWalkAtLocation(srcX, srcY);
 					if (iVar2 == 0) {
 						return 0;
 					}
 				}
-			}
-			else {
+			} else {
 				while (srcX != destX) {
 					iVar4 = iVar4 + destY;
 					if (-iVar4 == iVar1 || -iVar1 < iVar4) {
@@ -515,14 +513,13 @@ bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int de
 						srcY = srcY + 1;
 					}
 					srcX = srcX + -1;
-					iVar2 = canWalkAtLocation(srcX,srcY);
+					iVar2 = canWalkAtLocation(srcX, srcY);
 					if (iVar2 == 0) {
 						return 0;
 					}
 				}
 			}
-		}
-		else {
+		} else {
 			iVar2 = iVar1;
 			if (destY < iVar1) {
 				while (srcX != destX) {
@@ -532,13 +529,12 @@ bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int de
 						srcY = srcY + 1;
 					}
 					srcX = srcX + 1;
-					iVar2 = canWalkAtLocation(srcX,srcY);
+					iVar2 = canWalkAtLocation(srcX, srcY);
 					if (iVar2 == 0) {
 						return 0;
 					}
 				}
-			}
-			else {
+			} else {
 				while (srcX != destX) {
 					iVar4 = iVar4 + iVar1;
 					if (destY <= iVar4) {
@@ -546,15 +542,14 @@ bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int de
 						srcX = srcX + 1;
 					}
 					srcY = srcY + 1;
-					iVar2 = canWalkAtLocation(srcX,srcY);
+					iVar2 = canWalkAtLocation(srcX, srcY);
 					if (iVar2 == 0) {
 						return 0;
 					}
 				}
 			}
 		}
-	}
-	else {
+	} else {
 		iVar2 = -destY;
 		if (iVar2 < iVar1) {
 			while (srcX != destX) {
@@ -564,13 +559,12 @@ bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int de
 					srcY = srcY + -1;
 				}
 				srcX = srcX + 1;
-				iVar2 = canWalkAtLocation(srcX,srcY);
+				iVar2 = canWalkAtLocation(srcX, srcY);
 				if (iVar2 == 0) {
 					return 0;
 				}
 			}
-		}
-		else {
+		} else {
 			while (srcX != destX) {
 				iVar4 = iVar4 + iVar1;
 				if (-iVar4 == destY || -destY < iVar4) {
@@ -578,7 +572,7 @@ bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int de
 					srcX = srcX + 1;
 				}
 				srcY = srcY + -1;
-				iVar2 = canWalkAtLocation(srcX,srcY);
+				iVar2 = canWalkAtLocation(srcX, srcY);
 				if (iVar2 == 0) {
 					return 0;
 				}
@@ -694,7 +688,7 @@ static const int scaleTbl[] = {
 };
 
 static const uint8 room_sprite_related_2c85_4303[] = {
-	 13,            13,            25,            25,
+	13,            13,            25,            25,
 	28,            15,            22,            18,
 	18,            13,            15,            15,
 	35,            18,            40,            45,
@@ -748,7 +742,7 @@ int Darkseed::Room::getObjectUnderCursor() {
 	if (objIdx == -1) {
 		objIdx = CheckCursorAndMovedObjects();
 		if (objIdx == -1) {
-			objIdx = checkCursorAndStaticObjects(0,0);
+			objIdx = checkCursorAndStaticObjects(0, 0);
 		}
 	}
 	return objIdx;
@@ -759,24 +753,19 @@ bool Darkseed::Room::isOutside() {
 
 	if (_roomNumber == 61) {
 		isRoomOutside = true;
-	}
-	else if (_roomNumber < 10 || _roomNumber > 14) {
+	} else if (_roomNumber < 10 || _roomNumber > 14) {
 		if (_roomNumber < 24 || _roomNumber > 27) {
 			if (_roomNumber >= 63 && _roomNumber <= 65) {
 				isRoomOutside = true;
-			}
-			else if (_roomNumber == 31 || _roomNumber == 32 || _roomNumber == 36) {
+			} else if (_roomNumber == 31 || _roomNumber == 32 || _roomNumber == 36) {
 				isRoomOutside = true;
-			}
-			else {
+			} else {
 				isRoomOutside = false;
 			}
-		}
-		else {
+		} else {
 			isRoomOutside = true;
 		}
-	}
-	else {
+	} else {
 		isRoomOutside = true;
 	}
 	return isRoomOutside;
@@ -790,7 +779,7 @@ void Darkseed::Room::runRoomObjects() {
 		auto &roomObj = _roomObj[roomObjIdx];
 		int xPos = roomObj.xOffset;
 		int yPos = roomObj.yOffset;
-		switch(roomObj.type) {
+		switch (roomObj.type) {
 		case 1:
 		case 3: {
 			//			debug("roomObj.objNum: %d", roomObj.objNum);
@@ -801,7 +790,7 @@ void Darkseed::Room::runRoomObjects() {
 			} else {
 				calculateScaledSpriteDimensions(sprite.width, sprite.height, roomObj.yOffset + sprite.height);
 			}
-			if (((roomObj.spriteNum != 7) && (roomObj.spriteNum != 36)) && ((roomObj.spriteNum != 37 && (((roomObj.spriteNum != 38 && (roomObj.spriteNum != 39)) && (roomObj.spriteNum != 40))))) ) {
+			if (((roomObj.spriteNum != 7) && (roomObj.spriteNum != 36)) && ((roomObj.spriteNum != 37 && (((roomObj.spriteNum != 38 && (roomObj.spriteNum != 39)) && (roomObj.spriteNum != 40)))))) {
 				xPos = (sprite.width / 2 + xPos) - g_engine->scaledSpriteWidth / 2;
 			}
 			if (roomObj.spriteNum == 14) { // gloves
@@ -1035,7 +1024,7 @@ void Darkseed::Room::runRoomObjects() {
 		g_engine->_sprites.addSpriteToDrawList(111, 136, &sprite, 1, sprite.width, sprite.height, false);
 	}
 	if (_roomNumber == 2 && g_engine->_player->_isAutoWalkingToBed && g_engine->_player->_position.x < 150) {
-			g_engine->_objectVar[78] = 2; // open door for player.
+		g_engine->_objectVar[78] = 2; // open door for player.
 	}
 	if (_roomNumber == 2 && g_engine->_objectVar[78] == 2) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
@@ -1222,7 +1211,7 @@ void Darkseed::Room::drawTrunk() {
 	int trunkXPos;
 	int trunkYPos;
 	int spriteIdx;
-  
+
 	if (g_engine->_objectVar[22] == 0) {
 		trunkXPos = 460;
 		trunkYPos = 132;
@@ -1247,8 +1236,8 @@ void Darkseed::Room::drawTrunk() {
 	g_engine->sprite_y_scaling_threshold_maybe = 211;
 	calculateScaledSpriteDimensions(sprite.width, sprite.height, trunkYPos + sprite.height);
 	g_engine->sprite_y_scaling_threshold_maybe = 240;
-	updateRoomObj(42, trunkXPos + 20,6, trunkYPos + 34,8);
-	updateRoomObj(22, trunkXPos + 60,12, trunkYPos + 46,8);
+	updateRoomObj(42, trunkXPos + 20, 6, trunkYPos + 34, 8);
+	updateRoomObj(22, trunkXPos + 60, 12, trunkYPos + 46, 8);
 	g_engine->_sprites.addSpriteToDrawList(
 		trunkXPos,
 		trunkYPos + sprite.height - g_engine->scaledSpriteHeight,
@@ -1306,7 +1295,7 @@ void Darkseed::Room::mikeStickThrowAnim() {
 void Darkseed::Room::loadRoom61AWalkableLocations() {
 	Common::File file;
 	Common::Path romFilename = g_engine->getRoomFilePath(Common::Path("room61a.rom"));
-	if(!file.open(romFilename)) {
+	if (!file.open(romFilename)) {
 		return;
 	}
 
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index 557ab6c5b1b..ad4468a8763 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -92,7 +92,7 @@ public:
 	bool exitRoom();
 	Common::String getRoomFilenameBase(int roomNumber);
 	bool canWalkAtLocation(int x, int y);
-	bool canWalkInLineToTarget(int x,int y,int targetX,int targetY);
+	bool canWalkInLineToTarget(int x, int y, int targetX, int targetY);
 	void printRoomDescriptionText() const;
 	void calculateScaledSpriteDimensions(int width, int height, int curYPosition);
 	bool isOutside();
diff --git a/engines/darkseed/sound.cpp b/engines/darkseed/sound.cpp
index e6fc44d392a..741467642bd 100644
--- a/engines/darkseed/sound.cpp
+++ b/engines/darkseed/sound.cpp
@@ -52,7 +52,7 @@ bool Darkseed::Sound::isPlayingSpeech() {
 }
 
 void Darkseed::Sound::waitForSpeech() {
-	while(isPlayingSpeech()) {
+	while (isPlayingSpeech()) {
 		// TODO poll events / wait a bit here.
 	}
 }
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
index 4731e955d0f..2c23cc2682a 100644
--- a/engines/darkseed/sprites.cpp
+++ b/engines/darkseed/sprites.cpp
@@ -57,7 +57,7 @@ void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Da
 
 void Darkseed::Sprites::clearSpriteDrawList() {
 	// not using clear() here to avoid freeing array storage memory.
-	while(!spriteDrawList.empty()) {
+	while (!spriteDrawList.empty()) {
 		spriteDrawList.pop_back();
 	}
 }
diff --git a/engines/darkseed/titlefont.cpp b/engines/darkseed/titlefont.cpp
index 30ce01dfabd..e43daa36279 100644
--- a/engines/darkseed/titlefont.cpp
+++ b/engines/darkseed/titlefont.cpp
@@ -65,7 +65,7 @@ void TitleFont::displayString(uint16 x, uint16 y, const Common::String &text) {
 		Img letter;
 		int letterId = letterIndexLookupTbl[text[i] - 45];
 		letters.getImg(letterId, letterShadow, false);
-		letters.getImg(letterId+1, letter, false);
+		letters.getImg(letterId + 1, letter, false);
 
 		int w = letterWidthLookupTbl[letterId / 2];
 		letterShadow.drawAt(x, y, 2, w - 1); // TODO the original doesn't seem to need to override the width here.
diff --git a/engines/darkseed/tostext.cpp b/engines/darkseed/tostext.cpp
index 287a8fc48fc..e64e3998093 100644
--- a/engines/darkseed/tostext.cpp
+++ b/engines/darkseed/tostext.cpp
@@ -27,7 +27,7 @@ namespace Darkseed {
 
 bool TosText::load() {
 	Common::File tostextFile;
-	if(!tostextFile.open("tostext.bin")) {
+	if (!tostextFile.open("tostext.bin")) {
 		return false;
 	}
 	numEntries = tostextFile.readUint16LE() / 2;
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 25b0147b357..6419ad2f699 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -167,7 +167,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 		return;
 	}
 	if (objNum == 42) {
-		switch(_objectVar[42]) {
+		switch (_objectVar[42]) {
 		case 0:
 			_console->printTosText(653);
 			break;
@@ -202,10 +202,9 @@ void Darkseed::UseCode::useCode(int objNum) {
 	if (objNum == 47) {
 		_player->loadAnimations("phone.nsp");
 		if (_objectVar.getObjectRunningCode(47) == 0) {
-			g_engine->setupOtherNspAnimation(2,63);
-		}
-		else {
-			g_engine->setupOtherNspAnimation(0,8);
+			g_engine->setupOtherNspAnimation(2, 63);
+		} else {
+			g_engine->setupOtherNspAnimation(0, 8);
 		}
 		_player->_direction = 3;
 	}
@@ -256,10 +255,10 @@ void Darkseed::UseCode::useCode(int objNum) {
 		return;
 	}
 	if ((162 < objNum) && (objNum < 169)) {
-		g_engine->playSound(47,5,-1);
+		g_engine->playSound(47, 5, -1);
 	}
 	if (objNum == 175) {
-		g_engine->playSound(39,5,-1);
+		g_engine->playSound(39, 5, -1);
 		//		while (iVar2 = VOCPlaying(), iVar2 != 0) {
 		//			VOCPoll();
 		//		}
@@ -299,7 +298,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 	}
 	if (objNum == 46) {
 		if (_objectVar[46] == 1) {
-			g_engine->setupOtherNspAnimation(0,19);
+			g_engine->setupOtherNspAnimation(0, 19);
 		} else {
 			_console->printTosText(539);
 		}
@@ -345,27 +344,22 @@ void Darkseed::UseCode::useCode(int objNum) {
 				if (objNum == 108) {
 					if (_objectVar[108] == 0) {
 						_console->printTosText(383);
-					}
-					else {
+					} else {
 						_console->printTosText(385);
 					}
 					g_engine->setupOtherNspAnimation(0, 52);
-				}
-				else {
+				} else {
 					if (_objectVar[objNum] == 0) {
 						_console->printTosText(371);
-					}
-					else {
+					} else {
 						_console->printTosText(373);
 					}
-					g_engine->setupOtherNspAnimation(0,objNum - 56);
+					g_engine->setupOtherNspAnimation(0, objNum - 56);
 				}
-			}
-			else {
+			} else {
 				if (_objectVar[objNum] == 0) {
 					_console->printTosText(389);
-				}
-				else {
+				} else {
 					_console->printTosText(391);
 				}
 				_objectVar[objNum] = _objectVar[objNum] == 0 ? 1 : 0;
@@ -374,13 +368,13 @@ void Darkseed::UseCode::useCode(int objNum) {
 		}
 		if (objNum == 111) { // tap
 			_player->loadAnimations("aspirin.nsp");
-			g_engine->setupOtherNspAnimation(0,30);
+			g_engine->setupOtherNspAnimation(0, 30);
 			_console->printTosText(242);
 			return;
 		}
 		if (objNum == 112) { // mirror cabinet
 			_player->loadAnimations("aspirin.nsp");
-			g_engine->setupOtherNspAnimation(2,32);
+			g_engine->setupOtherNspAnimation(2, 32);
 			return;
 		}
 		if (objNum > 30 && objNum < 34) {
@@ -398,18 +392,18 @@ void Darkseed::UseCode::useCode(int objNum) {
 			return;
 		}
 		if (objNum == 101) {
-			switch(_objectVar[101]) {
+			switch (_objectVar[101]) {
 			case 0:
 				_player->loadAnimations("opendoor.nsp");
-				g_engine->setupOtherNspAnimation(0,65);
-				g_engine->playSound(31,5,-1);
+				g_engine->setupOtherNspAnimation(0, 65);
+				g_engine->playSound(31, 5, -1);
 				_objectVar[101] = 1;
 				_console->printTosText(733);
 				break;
 			case 1:
 				_player->loadAnimations("opendoor.nsp");
-				g_engine->setupOtherNspAnimation(0,65);
-				g_engine->playSound(31,5,-1);
+				g_engine->setupOtherNspAnimation(0, 65);
+				g_engine->playSound(31, 5, -1);
 				_objectVar[101] = 0;
 				_console->printTosText(737);
 				break;
@@ -420,15 +414,15 @@ void Darkseed::UseCode::useCode(int objNum) {
 				return;
 			case 3:
 				_player->loadAnimations("opendoor.nsp");
-				g_engine->setupOtherNspAnimation(0,65);
-				g_engine->playSound(31,5,-1);
+				g_engine->setupOtherNspAnimation(0, 65);
+				g_engine->playSound(31, 5, -1);
 				_objectVar[101] = 4;
 				_console->printTosText(737);
 				break;
 			case 4:
 				_player->loadAnimations("opendoor.nsp");
-				g_engine->setupOtherNspAnimation(0,65);
-				g_engine->playSound(31,5,-1);
+				g_engine->setupOtherNspAnimation(0, 65);
+				g_engine->playSound(31, 5, -1);
 				_objectVar[101] = 3;
 				_console->printTosText(733);
 				break;
@@ -484,7 +478,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 			}
 		} else if (objNum == 86) {
 			_objectVar[86] = _objectVar[86] == 0 ? 1 : 0;
-			g_engine->playSound(42,5,-1);
+			g_engine->playSound(42, 5, -1);
 		} else if (objNum == 22) {
 			if (_objectVar[22] < 4) {
 				_player->loadAnimations("push.nsp");
@@ -517,7 +511,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 					if (((_objectVar[49] == 0) || (1 < _objectVar[62])) || (g_engine->_currentDay != 3)) {
 						if (_objectVar[62] < 101) {
 							//							LoadModeSong(9);
-							g_engine->playSound(0,6,-1);
+							g_engine->playSound(0, 6, -1);
 							_objectVar[62] = 101;
 							_console->addTextLine("You turn on the music.");
 						} else if (_objectVar[62] == 101) {
@@ -554,8 +548,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 			if (g_engine->_room->_roomNumber == 41) {
 				g_engine->_room->_roomNumber = 44;
 				_console->printTosText(956);
-			}
-			else {
+			} else {
 				g_engine->_room->_roomNumber = 41;
 				_console->printTosText(957);
 			}
@@ -568,7 +561,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 				_player->loadAnimations("shower.nsp");
 				g_engine->setupOtherNspAnimation(0, 2);
 				_console->printTosText(193);
-				g_engine->playSound(2,4,-1);
+				g_engine->playSound(2, 4, -1);
 			} else {
 				_console->printTosText(194);
 			}
@@ -578,8 +571,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 				if (g_engine->_room->_roomNumber == 0 || g_engine->_room->_roomNumber == 9) {
 					_console->printTosText(409);
 				}
-			}
-			else {
+			} else {
 				if (g_engine->_room->_roomNumber == 0 || g_engine->_room->_roomNumber == 9) {
 					_console->printTosText(407);
 				}
@@ -591,9 +583,8 @@ void Darkseed::UseCode::useCode(int objNum) {
 				if (g_engine->_room->_roomNumber == 0 || g_engine->_room->_roomNumber == 9) {
 					_console->printTosText(409);
 				}
-			}
-			else {
-				g_engine->playSound(41,5,-1);
+			} else {
+				g_engine->playSound(41, 5, -1);
 				if (g_engine->_room->_roomNumber == 0 || g_engine->_room->_roomNumber == 9) {
 					_console->printTosText(32);
 				}
@@ -601,7 +592,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 			}
 		} else if (objNum == 139) {
 			_player->loadAnimations("ltladder.nsp");
-			g_engine->setupOtherNspAnimation(0,10);
+			g_engine->setupOtherNspAnimation(0, 10);
 		} else if (objNum == 76) {
 			//			_NoScroll = 0;
 			//			Ordinal_184(unaff_CS,(int)&_file_name,4192,(int)sg_engine->_room3.nnn_1060_31e1);
@@ -614,7 +605,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 			g_engine->setupOtherNspAnimation(0, 12);
 		} else if (objNum == 66 && _objectVar[68] == 0) {
 			if (_objectVar[12] == 2) {
-				g_engine->playSound(5,5,-1);
+				g_engine->playSound(5, 5, -1);
 				if (_objectVar[66] == 0) {
 					if (_objectVar[67] == 0 && _objectVar[68] == 0) {
 						_objectVar[66] = 1;
@@ -629,7 +620,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 			}
 		} else if (objNum == 67 && _objectVar[68] == 0) {
 			if (_objectVar[12] == 2) {
-				g_engine->playSound(5,5,-1);
+				g_engine->playSound(5, 5, -1);
 				if (_objectVar[67] == 0) {
 					if (_objectVar[66] == 1 && _objectVar[68] == 0) {
 						_objectVar[67] = 1;
@@ -646,9 +637,9 @@ void Darkseed::UseCode::useCode(int objNum) {
 			if (_objectVar[12] == 2) {
 				if (true) {
 					if ((_objectVar[66] == 1) && (_objectVar[67] == 1)) {
-						g_engine->playSound(13,5,-1);
+						g_engine->playSound(13, 5, -1);
 						_objectVar[68] = 1;
-						g_engine->setupOtherNspAnimation(0,23);
+						g_engine->setupOtherNspAnimation(0, 23);
 					} else {
 						_objectVar[68] = 2;
 					}
@@ -658,8 +649,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 			} else {
 				_console->addTextLine("You touch the surface of the ornate sigil.");
 			}
-		}
-		else if (objNum == 84) {
+		} else if (objNum == 84) {
 			_console->printTosText(566);
 		}
 		//		_NoScroll = 0;
@@ -667,8 +657,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 	}
 	if (_objectVar[138] == 0) {
 		_console->printTosText(906);
-	}
-	else {
+	} else {
 		_inventory.addItem(objNum);
 		g_engine->_room->removeObjectFromRoom(objNum);
 		_objectVar[138] = 0;
@@ -695,7 +684,7 @@ void Darkseed::UseCode::useCodeGloves(int16 targetObjNum) {
 		if (tosIdx < 979) {
 			_console->printTosText(tosIdx);
 		} else {
-			genericresponse(14,targetObjNum, tosIdx);
+			genericresponse(14, targetObjNum, tosIdx);
 		}
 	}
 	if (targetObjNum == 57) {
@@ -745,9 +734,8 @@ void Darkseed::UseCode::useCodeJournal(int16 actionObjNum, int16 targetObjNum) {
 		if (tosIdx != 0) {
 			if (tosIdx < 979) {
 				_console->printTosText(tosIdx);
-			}
-			else {
-				genericresponse(6,targetObjNum, tosIdx);
+			} else {
+				genericresponse(6, targetObjNum, tosIdx);
 			}
 		}
 	}
@@ -1011,7 +999,7 @@ void Darkseed::UseCode::useCrowBar(int16 targetObjNum) {
 		if (tosIdx < 979) {
 			_console->printTosText(tosIdx);
 		} else {
-			genericresponse(5,targetObjNum, tosIdx);
+			genericresponse(5, targetObjNum, tosIdx);
 		}
 	}
 	if (targetObjNum == 42) {
@@ -1131,11 +1119,11 @@ void UseCode::useCodeBobbyPin(int16 targetObjNum) {
 	if (targetObjNum == 190) {
 		if (_objectVar[190] == 0) {
 			_console->printTosText(882);
-			g_engine->playSound(18,5,-1);
+			g_engine->playSound(18, 5, -1);
 			_objectVar[190] = 1;
 		} else if (_objectVar[190] == 1) {
 			_console->printTosText(883);
-			g_engine->playSound(18,5,-1);
+			g_engine->playSound(18, 5, -1);
 			_objectVar[190] = 2;
 		} else {
 			_console->printTosText(963);
@@ -1263,8 +1251,7 @@ void UseCode::useCodeDelbertsCard(int16 targetObjNum) {
 	if (targetObjNum == 64) {
 		if (g_engine->_room->_roomNumber == 30) {
 			g_engine->setupOtherNspAnimation(1, 40);
-		}
-		else {
+		} else {
 			_console->printTosText(488);
 		}
 	}
@@ -1338,8 +1325,7 @@ void UseCode::useCodeMicroFilm(int16 targetObjNum) {
 		} else {
 			_console->printTosText(964);
 		}
-	}
-	else if (targetObjNum == 113) {
+	} else if (targetObjNum == 113) {
 		putobjunderpillow(24);
 	}
 }
@@ -1700,8 +1686,8 @@ void UseCode::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx)
 					"Using the %s on the %s doesn't make any sense, it must be your headaches!",
 					_objectVar.getObjectName(useObjNum),
 					_objectVar.getObjectName(targetObjNum)
-					)
-				);
+				)
+			);
 			break;
 		case 1:
 			_console->addTextLine(
@@ -1709,7 +1695,7 @@ void UseCode::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx)
 					"The %s will do nothing to the %s.",
 					_objectVar.getObjectName(useObjNum),
 					_objectVar.getObjectName(targetObjNum)
-						)
+				)
 			);
 			break;
 		case 2:
@@ -1718,7 +1704,7 @@ void UseCode::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx)
 					"The %s doesn't have any effect on the %s.",
 					_objectVar.getObjectName(useObjNum),
 					_objectVar.getObjectName(targetObjNum)
-						)
+				)
 			);
 			break;
 		case 3:
@@ -1727,7 +1713,7 @@ void UseCode::genericresponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx)
 					"The %s has nothing to do with %s.",
 					_objectVar.getObjectName(useObjNum),
 					_objectVar.getObjectName(targetObjNum)
-						)
+				)
 			);
 			break;
 		case 4:
@@ -1765,15 +1751,15 @@ static constexpr bool diggingxflipTbl[12] = {
 void UseCode::startdigging(int16 targetObjNum) {
 	if (targetObjNum == 0) {
 		_player->loadAnimations("lgravedg.nsp");
-		g_engine->setupOtherNspAnimation(0,21);
+		g_engine->setupOtherNspAnimation(0, 21);
 	} else if (diggingxflipTbl[targetObjNum]) {
 		_player->loadAnimations("lgravedg.nsp");
-		g_engine->setupOtherNspAnimation(0,4);
+		g_engine->setupOtherNspAnimation(0, 4);
 	} else {
 		_player->loadAnimations("rgravedg.nsp");
-		g_engine->setupOtherNspAnimation(0,22);
+		g_engine->setupOtherNspAnimation(0, 22);
 	}
-	g_engine->playSound(14,5,-1);
+	g_engine->playSound(14, 5, -1);
 }
 
 }
\ No newline at end of file


Commit: 96f02408357bac09b727bfbcfa8a86a4b981f619
    https://github.com/scummvm/scummvm/commit/96f02408357bac09b727bfbcfa8a86a4b981f619
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Add missing newline at end of files

Changed paths:
    engines/darkseed/anm.cpp
    engines/darkseed/gamefont.cpp
    engines/darkseed/img.cpp
    engines/darkseed/pal.cpp
    engines/darkseed/titlefont.cpp
    engines/darkseed/tostext.cpp


diff --git a/engines/darkseed/anm.cpp b/engines/darkseed/anm.cpp
index b96c24f5542..a5bc1ad9aa6 100644
--- a/engines/darkseed/anm.cpp
+++ b/engines/darkseed/anm.cpp
@@ -54,4 +54,4 @@ int Anm::numImages() {
 	return numRecords;
 }
 
-} // namespace Darkseed
\ No newline at end of file
+} // namespace Darkseed
diff --git a/engines/darkseed/gamefont.cpp b/engines/darkseed/gamefont.cpp
index a242ecad24c..c8a8c815005 100644
--- a/engines/darkseed/gamefont.cpp
+++ b/engines/darkseed/gamefont.cpp
@@ -119,4 +119,4 @@ const Sprite *GameFont::getCharacterSprite(char c) {
 	return nullptr;
 }
 
-} // namespace Darkseed
\ No newline at end of file
+} // namespace Darkseed
diff --git a/engines/darkseed/img.cpp b/engines/darkseed/img.cpp
index 9ee65675027..13957027f57 100644
--- a/engines/darkseed/img.cpp
+++ b/engines/darkseed/img.cpp
@@ -134,4 +134,4 @@ void Img::drawAt(uint16 xPos, uint16 yPos, int drawMode, int drawWidth) {
 	g_engine->_screen->addDirtyRect({{(int16)xPos, (int16)yPos}, (int16)width, (int16)height});
 }
 
-} // namespace Darkseed
\ No newline at end of file
+} // namespace Darkseed
diff --git a/engines/darkseed/pal.cpp b/engines/darkseed/pal.cpp
index f8c9a5cd578..505b5f3cfce 100644
--- a/engines/darkseed/pal.cpp
+++ b/engines/darkseed/pal.cpp
@@ -80,4 +80,4 @@ void Pal::installPalette() {
 	g_system->getPaletteManager()->setPalette(palData, 0, DARKSEED_NUM_PAL_ENTRIES);
 }
 
-} // namespace Darkseed
\ No newline at end of file
+} // namespace Darkseed
diff --git a/engines/darkseed/titlefont.cpp b/engines/darkseed/titlefont.cpp
index e43daa36279..eb67dd2ee0a 100644
--- a/engines/darkseed/titlefont.cpp
+++ b/engines/darkseed/titlefont.cpp
@@ -75,4 +75,4 @@ void TitleFont::displayString(uint16 x, uint16 y, const Common::String &text) {
 	}
 }
 
-} // namespace Darkseed
\ No newline at end of file
+} // namespace Darkseed
diff --git a/engines/darkseed/tostext.cpp b/engines/darkseed/tostext.cpp
index e64e3998093..6a7309e08c2 100644
--- a/engines/darkseed/tostext.cpp
+++ b/engines/darkseed/tostext.cpp
@@ -62,4 +62,4 @@ uint16 TosText::getNumEntries() const {
 	return numEntries;
 }
 
-} // namespace Darkseed
\ No newline at end of file
+} // namespace Darkseed


Commit: d52cb0514e3880657b4cca60e1ce98d23bdcc4dd
    https://github.com/scummvm/scummvm/commit/d52cb0514e3880657b4cca60e1ce98d23bdcc4dd
Author: D G Turner (digitall at scummvm.org)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix Signed vs. Unsigned Comparison GCC Compiler Warnings

Changed paths:
    engines/darkseed/console.cpp
    engines/darkseed/darkseed.cpp
    engines/darkseed/gamefont.cpp
    engines/darkseed/nsp.cpp
    engines/darkseed/room.cpp
    engines/darkseed/titlefont.cpp


diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index d27bab9362c..ec042af46eb 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -78,7 +78,7 @@ Common::Array<Common::String> Console::wrapText(const Common::String &text) {
 	Common::String word;
 	int lineLength = 0;
 
-	for (int i = 0; i < text.size(); i++) {
+	for (unsigned int i = 0; i < text.size(); i++) {
 		if (text[i] != '\r') {
 			word += text[i];
 		}
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 7db3984f8dd..b944ca05c94 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -635,7 +635,7 @@ void DarkseedEngine::handleInput() {
 					}
 					_player->_heroMoving = false;
 					if (useDoorTarget || _doorEnabled) {
-						for (int i = 0; i < _room->room1.size(); i++) {
+						for (unsigned int i = 0; i < _room->room1.size(); i++) {
 							RoomExit &roomExit = _room->room1[i];
 							if (roomExit.roomNumber != 0xff
 								&& roomExit.x < scaledSpriteWidth / 2 + _player->_position.x
@@ -1117,7 +1117,7 @@ void DarkseedEngine::changeToRoom(int newRoomNumber, bool placeDirectly) { // AK
 			}
 		}
 	} else if (!placeDirectly && newRoomNumber != 0x22 && (newRoomNumber < 0x13 || newRoomNumber > 0x17)) {
-		for (int i = 0; i < _room->room1.size(); i++) {
+		for (unsigned int i = 0; i < _room->room1.size(); i++) {
 			const RoomExit &roomExit = _room->room1[i];
 			if (roomExit.roomNumber == _previousRoomNumber) {
 				_player->_position.x = roomExit.x + roomExit.width / 2;
@@ -1147,7 +1147,7 @@ void DarkseedEngine::debugTeleportToRoom(int newRoomNumber, int entranceNumber)
 
 	updateBaseSprites();
 
-	if (entranceNumber < _room->room1.size()) {
+	if (entranceNumber < (int) _room->room1.size()) {
 		const RoomExit &roomExit = _room->room1[entranceNumber];
 		_player->_position.x = roomExit.x + roomExit.width / 2;
 		_player->_position.y = roomExit.y;
diff --git a/engines/darkseed/gamefont.cpp b/engines/darkseed/gamefont.cpp
index c8a8c815005..2c270ded91e 100644
--- a/engines/darkseed/gamefont.cpp
+++ b/engines/darkseed/gamefont.cpp
@@ -33,7 +33,7 @@ bool GameFont::load() {
 }
 
 void GameFont::displayString(uint16 x, uint16 y, const Common::String &text) {
-	for (int i = 0; i < text.size(); i++) {
+	for (unsigned int i = 0; i < text.size(); i++) {
 		auto letter = getCharacterSprite(text[i]);
 		if (letter) {
 			letter->draw(x, y);
@@ -44,7 +44,7 @@ void GameFont::displayString(uint16 x, uint16 y, const Common::String &text) {
 
 int GameFont::stringLength(const Common::String &text) {
 	int width = 0;
-	for (int i = 0; i < text.size(); i++) {
+	for (unsigned int i = 0; i < text.size(); i++) {
 		const Sprite *sprite = getCharacterSprite(text[i]);
 		if (sprite) {
 			width += sprite->width + 1;
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index 32b2777f443..fafc632e4b6 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -168,7 +168,7 @@ bool Darkseed::Nsp::load(Common::SeekableReadStream &readStream) {
 }
 
 const Darkseed::Sprite &Darkseed::Nsp::getSpriteAt(int index) {
-	if (index >= frames.size()) {
+	if (index >= (int) frames.size()) {
 		error("getSpriteAt: Invalid sprite index. %d", index);
 	}
 	return frames[index];
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 9cc069a12a7..2fe9f781d10 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -1336,7 +1336,7 @@ void Darkseed::Room::loadLocationSprites(const Common::Path &path) {
 }
 
 Common::Point Darkseed::Room::getExitPointForRoom(uint8 roomNumber) {
-	for (int i = 0; i < room1.size(); i++) {
+	for (unsigned int i = 0; i < room1.size(); i++) {
 		if (room1[i].roomNumber == roomNumber) {
 			return Common::Point(room1[i].x, room1[i].y);
 		}
diff --git a/engines/darkseed/titlefont.cpp b/engines/darkseed/titlefont.cpp
index eb67dd2ee0a..060de5bebf4 100644
--- a/engines/darkseed/titlefont.cpp
+++ b/engines/darkseed/titlefont.cpp
@@ -56,7 +56,7 @@ int16 letterWidthLookupTbl[] = {
 };
 
 void TitleFont::displayString(uint16 x, uint16 y, const Common::String &text) {
-	for (int i = 0; i < text.size(); i++) {
+	for (unsigned int i = 0; i < text.size(); i++) {
 		if (text[i] == ' ') {
 			x += 0x12;
 			continue;


Commit: 362b01e1b0ee959a1d2e771eb85ae3ad9a6a8bb3
    https://github.com/scummvm/scummvm/commit/362b01e1b0ee959a1d2e771eb85ae3ad9a6a8bb3
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix class variable naming

Changed paths:
    engines/darkseed/anm.cpp
    engines/darkseed/anm.h
    engines/darkseed/console.cpp
    engines/darkseed/console.h
    engines/darkseed/cursor.cpp
    engines/darkseed/cursor.h
    engines/darkseed/cutscene.cpp
    engines/darkseed/cutscene.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/debugconsole.cpp
    engines/darkseed/debugconsole.h
    engines/darkseed/gamefont.cpp
    engines/darkseed/gamefont.h
    engines/darkseed/img.cpp
    engines/darkseed/img.h
    engines/darkseed/inventory.cpp
    engines/darkseed/inventory.h
    engines/darkseed/nsp.cpp
    engines/darkseed/nsp.h
    engines/darkseed/pal.cpp
    engines/darkseed/pal.h
    engines/darkseed/pic.cpp
    engines/darkseed/pic.h
    engines/darkseed/player.cpp
    engines/darkseed/player.h
    engines/darkseed/room.cpp
    engines/darkseed/room.h
    engines/darkseed/sprites.cpp
    engines/darkseed/sprites.h
    engines/darkseed/titlefont.cpp
    engines/darkseed/titlefont.h
    engines/darkseed/tostext.cpp
    engines/darkseed/tostext.h


diff --git a/engines/darkseed/anm.cpp b/engines/darkseed/anm.cpp
index a5bc1ad9aa6..f1ba8109f93 100644
--- a/engines/darkseed/anm.cpp
+++ b/engines/darkseed/anm.cpp
@@ -24,26 +24,26 @@
 
 namespace Darkseed {
 bool Anm::load(const Common::Path &filename) {
-	if (file.isOpen()) {
-		file.close();
+	if (_file.isOpen()) {
+		_file.close();
 	}
-	if (!file.open(filename)) {
+	if (!_file.open(filename)) {
 		return false;
 	}
-	numRecords = file.readUint16LE();
-	assetOffset = file.readUint16LE();
+	_numRecords = _file.readUint16LE();
+	_assetOffset = _file.readUint16LE();
 
 	return true;
 }
 
 bool Anm::getImg(uint16 index, Img &img, bool includesPosition) {
-	file.seek(4 + index * 2);
-	int offset = file.readUint16LE();
-	file.seek((offset * 16) + (4 + numRecords * 2));
+	_file.seek(4 + index * 2);
+	int offset = _file.readUint16LE();
+	_file.seek((offset * 16) + (4 + _numRecords * 2));
 	if (includesPosition) {
-		img.load(file);
+		img.load(_file);
 	} else {
-		img.loadWithoutPosition(file);
+		img.loadWithoutPosition(_file);
 	}
 	debug("Loaded %d (%d,%d) (%d,%d) %x", index, img.getX(), img.getY(), img.getWidth(), img.getHeight(), 0);
 
@@ -51,7 +51,7 @@ bool Anm::getImg(uint16 index, Img &img, bool includesPosition) {
 }
 
 int Anm::numImages() {
-	return numRecords;
+	return _numRecords;
 }
 
 } // namespace Darkseed
diff --git a/engines/darkseed/anm.h b/engines/darkseed/anm.h
index a1e38cb6fe4..4edc71c2267 100644
--- a/engines/darkseed/anm.h
+++ b/engines/darkseed/anm.h
@@ -28,10 +28,9 @@ namespace Darkseed {
 
 class Anm {
 private:
-//	Common::Array<Img> frames;
-	Common::File file;
-	uint16 numRecords = 0;
-	uint16 assetOffset = 0;
+	Common::File _file;
+	uint16 _numRecords = 0;
+	uint16 _assetOffset = 0;
 
 public:
 	bool load(const Common::Path &filename);
diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index ec042af46eb..54f4e20edeb 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -56,7 +56,7 @@ void Console::addToCurrentLine(const Common::String &text) {
 }
 
 void Console::draw() {
-	if (!redrawRequired) {
+	if (!_redrawRequired) {
 		return;
 	}
 
@@ -68,7 +68,7 @@ void Console::draw() {
 		y -= 11;
 		curIdx = curIdx == 0 ? _text.size() - 1 : curIdx - 1;
 	}
-	redrawRequired = false;
+	_redrawRequired = false;
 	g_engine->_screen->addDirtyRect(consoleArea);
 }
 
@@ -116,7 +116,7 @@ Common::Array<Common::String> Console::wrapText(const Common::String &text) {
 void Console::addLine(const Common::String &line) {
 	_text[_startIdx] = line;
 	_startIdx = (_startIdx + 1) % _text.size();
-	redrawRequired = true;
+	_redrawRequired = true;
 }
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
index 093fa734ba0..c3cb129df25 100644
--- a/engines/darkseed/console.h
+++ b/engines/darkseed/console.h
@@ -38,7 +38,7 @@ private:
 
 	Common::Array<Common::String> _text;
 	int _startIdx = 0;
-	bool redrawRequired = false;
+	bool _redrawRequired = false;
 
 public:
 	Console(TosText *tostext, Sound *sound);
diff --git a/engines/darkseed/cursor.cpp b/engines/darkseed/cursor.cpp
index 5e871b458ed..2f4559dcf89 100644
--- a/engines/darkseed/cursor.cpp
+++ b/engines/darkseed/cursor.cpp
@@ -24,14 +24,14 @@
 #include "darkseed/darkseed.h"
 
 void Darkseed::Cursor::setCursorType(enum CursorType newType) {
-	bool loadCursor = !hasLoadedCursor || _currentCursorType != newType;
+	bool loadCursor = !_hasLoadedCursor || _currentCursorType != newType;
 	_currentCursorType = newType;
 
 	if (loadCursor) {
 		const Sprite cursorSprite = g_engine->_baseSprites.getSpriteAt(_currentCursorType);
 		Graphics::Surface surf;
-		surf.create(cursorSprite.width, cursorSprite.height, Graphics::PixelFormat::createFormatCLUT8());
-		surf.copyRectToSurface(cursorSprite.pixels.data(), cursorSprite.pitch, 0, 0, cursorSprite.width, cursorSprite.height);
+		surf.create(cursorSprite._width, cursorSprite._height, Graphics::PixelFormat::createFormatCLUT8());
+		surf.copyRectToSurface(cursorSprite._pixels.data(), cursorSprite._pitch, 0, 0, cursorSprite._width, cursorSprite._height);
 		CursorMan.replaceCursor(surf, 0, 0, 0xf);
 	}
 }
@@ -43,11 +43,11 @@ void Darkseed::Cursor::updatePosition(int16 x, int16 y) {
 }
 
 int Darkseed::Cursor::getWidth() {
-	return g_engine->_baseSprites.getSpriteAt(_currentCursorType).width;
+	return g_engine->_baseSprites.getSpriteAt(_currentCursorType)._width;
 }
 
 int Darkseed::Cursor::getHeight() {
-	return g_engine->_baseSprites.getSpriteAt(_currentCursorType).height;
+	return g_engine->_baseSprites.getSpriteAt(_currentCursorType)._height;
 }
 
 const Darkseed::Sprite &Darkseed::Cursor::getSprite() {
diff --git a/engines/darkseed/cursor.h b/engines/darkseed/cursor.h
index 0d564fbca3b..aff5c0a9c73 100644
--- a/engines/darkseed/cursor.h
+++ b/engines/darkseed/cursor.h
@@ -41,7 +41,7 @@ class Cursor {
 private:
 	Common::Point _position;
 	enum CursorType _currentCursorType = Pointer;
-	bool hasLoadedCursor = false;
+	bool _hasLoadedCursor = false;
 
 public:
 
diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index 84ef847b11e..4ac44b2ef2c 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -23,7 +23,7 @@
 #include "darkseed/darkseed.h"
 
 Darkseed::Cutscene::~Cutscene() {
-	delete titleFont;
+	delete _titleFont;
 }
 
 void Darkseed::Cutscene::play(char cutsceneId) {
@@ -78,8 +78,8 @@ void Darkseed::Cutscene::update() {
 		} else if (_cutsceneId == 'I') {
 			play('J');
 		} else if (_cutsceneId == 'J') {
-			delete titleFont;
-			titleFont = nullptr;
+			delete _titleFont;
+			_titleFont = nullptr;
 			g_engine->newGame();
 		} else if (_cutsceneId == 'Y') {
 			play('I');
@@ -102,10 +102,10 @@ bool Darkseed::Cutscene::introScene() {
 	case 3: {
 		g_engine->_screen->clear();
 		_palette.load("art/house.pal");
-		if (titleFont == nullptr) {
-			titleFont = new TitleFont();
+		if (_titleFont == nullptr) {
+			_titleFont = new TitleFont();
 		}
-		titleFont->displayString(68, 160, "DEVELOPING NEW WAYS TO AMAZE");
+		_titleFont->displayString(68, 160, "DEVELOPING NEW WAYS TO AMAZE");
 		g_engine->fadeIn(_palette);
 	}
 	break;
@@ -124,7 +124,7 @@ bool Darkseed::Cutscene::introScene() {
 		break;
 	case 7:
 		g_engine->_screen->clear();
-		titleFont->displayString(222, 160, "CYBERDREAMS");
+		_titleFont->displayString(222, 160, "CYBERDREAMS");
 		g_engine->fadeIn(_palette);
 		break;
 	case 8:
@@ -142,7 +142,7 @@ bool Darkseed::Cutscene::introScene() {
 		break;
 	case 11:
 		g_engine->_screen->clear();
-		titleFont->displayString(250, 160, "PRESENTS");
+		_titleFont->displayString(250, 160, "PRESENTS");
 		g_engine->fadeIn(_palette);
 		break;
 	case 12:
@@ -251,10 +251,10 @@ bool Darkseed::Cutscene::introScene() {
 	case 28:
 		putHouse();
 		registTime();
-		titleFont->displayString(155, 90, "EXECUTIVE PRODUCERS");
-		titleFont->displayString(200, 130, "PATRICK KETCHUM");
-		titleFont->displayString(236, 160, "ROLF KLUG");
-		titleFont->displayString(236, 190, "JEAN KLUG");
+		_titleFont->displayString(155, 90, "EXECUTIVE PRODUCERS");
+		_titleFont->displayString(200, 130, "PATRICK KETCHUM");
+		_titleFont->displayString(236, 160, "ROLF KLUG");
+		_titleFont->displayString(236, 190, "JEAN KLUG");
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 29:
@@ -265,9 +265,9 @@ bool Darkseed::Cutscene::introScene() {
 	case 30:
 		putHouse();
 		registTime();
-		titleFont->displayString(236, 95, "PRODUCERS");
-		titleFont->displayString(200, 135, "HARALD SEELEY");
-		titleFont->displayString(218, 165, "MIKE DAWSON");
+		_titleFont->displayString(236, 95, "PRODUCERS");
+		_titleFont->displayString(200, 135, "HARALD SEELEY");
+		_titleFont->displayString(218, 165, "MIKE DAWSON");
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 31:
@@ -278,9 +278,9 @@ bool Darkseed::Cutscene::introScene() {
 	case 32:
 		putHouse();
 		registTime();
-		titleFont->displayString(245, 95, "DESIGNERS");
-		titleFont->displayString(209, 135, "MIKE CRANFORD");
-		titleFont->displayString(227, 165, "MIKE DAWSON");
+		_titleFont->displayString(245, 95, "DESIGNERS");
+		_titleFont->displayString(209, 135, "MIKE CRANFORD");
+		_titleFont->displayString(227, 165, "MIKE DAWSON");
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 33:
@@ -291,10 +291,10 @@ bool Darkseed::Cutscene::introScene() {
 	case 34:
 		putHouse();
 		registTime();
-		titleFont->displayString(227, 95, "PROGRAMMERS");
-		titleFont->displayString(164, 135, "LENNARD FEDDERSEN");
-		titleFont->displayString(227, 165, "JOHN KRAUSE");
-		titleFont->displayString(245, 195, "GARY VICK");
+		_titleFont->displayString(227, 95, "PROGRAMMERS");
+		_titleFont->displayString(164, 135, "LENNARD FEDDERSEN");
+		_titleFont->displayString(227, 165, "JOHN KRAUSE");
+		_titleFont->displayString(245, 195, "GARY VICK");
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 35:
@@ -305,8 +305,8 @@ bool Darkseed::Cutscene::introScene() {
 	case 36:
 		putHouse();
 		registTime();
-		titleFont->displayString(200, 100, "MUSICAL SCORE");
-		titleFont->displayString(200, 140, "GREGORY ALPER");
+		_titleFont->displayString(200, 100, "MUSICAL SCORE");
+		_titleFont->displayString(200, 140, "GREGORY ALPER");
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 37:
@@ -317,8 +317,8 @@ bool Darkseed::Cutscene::introScene() {
 	case 38:
 		putHouse();
 		registTime();
-		titleFont->displayString(119, 100, "MUSIC AND SOUND EFFECTS");
-		titleFont->displayString(200, 140, "DAVID A. BEAN");
+		_titleFont->displayString(119, 100, "MUSIC AND SOUND EFFECTS");
+		_titleFont->displayString(200, 140, "DAVID A. BEAN");
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 39:
@@ -329,8 +329,8 @@ bool Darkseed::Cutscene::introScene() {
 	case 40:
 		putHouse();
 		registTime();
-		titleFont->displayString(218, 100, "ART DIRECTOR");
-		titleFont->displayString(236, 140, "BRUMMBAER");
+		_titleFont->displayString(218, 100, "ART DIRECTOR");
+		_titleFont->displayString(236, 140, "BRUMMBAER");
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 41:
@@ -341,8 +341,8 @@ bool Darkseed::Cutscene::introScene() {
 	case 42:
 		putHouse();
 		registTime();
-		titleFont->displayString(164, 100, "ASST. ART DIRECTOR");
-		titleFont->displayString(191, 140, "PAUL DRZEWIECKI");
+		_titleFont->displayString(164, 100, "ASST. ART DIRECTOR");
+		_titleFont->displayString(191, 140, "PAUL DRZEWIECKI");
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 43:
@@ -353,8 +353,8 @@ bool Darkseed::Cutscene::introScene() {
 	case 44:
 		putHouse();
 		registTime();
-		titleFont->displayString(200, 100, "DARK WORLD ART");
-		titleFont->displayString(245, 140, "H.R. GIGER");
+		_titleFont->displayString(200, 100, "DARK WORLD ART");
+		_titleFont->displayString(245, 140, "H.R. GIGER");
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 45:
@@ -365,10 +365,10 @@ bool Darkseed::Cutscene::introScene() {
 	case 46:
 		putHouse();
 		registTime();
-		titleFont->displayString(182, 90, "COMPUTER ARTISTS");
-		titleFont->displayString(227, 130, "JULIA ULANO");
-		titleFont->displayString(191, 160, "JOBY ROME-OTERO");
-		titleFont->displayString(236, 190, "PAUL RYAN");
+		_titleFont->displayString(182, 90, "COMPUTER ARTISTS");
+		_titleFont->displayString(227, 130, "JULIA ULANO");
+		_titleFont->displayString(191, 160, "JOBY ROME-OTERO");
+		_titleFont->displayString(236, 190, "PAUL RYAN");
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 47:
@@ -379,8 +379,8 @@ bool Darkseed::Cutscene::introScene() {
 	case 48:
 		putHouse();
 		registTime();
-		titleFont->displayString(236, 100, "GAME TEXT");
-		titleFont->displayString(209, 140, "MICHEL HORVAT");
+		_titleFont->displayString(236, 100, "GAME TEXT");
+		_titleFont->displayString(209, 140, "MICHEL HORVAT");
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 49:
@@ -482,12 +482,12 @@ bool Darkseed::Cutscene::embryoInsertedScene() {
 	case 13: {
 		g_engine->_screen->clear();
 		_palette.load("art/house.pal");
-		if (titleFont == nullptr) {
-			titleFont = new TitleFont();
+		if (_titleFont == nullptr) {
+			_titleFont = new TitleFont();
 		}
-		titleFont->displayString(80, 130, "AFTER A HORRIFYING NIGHTMARE");
-		titleFont->displayString(80, 170, "MIKE DAWSON AWAKENS TO THE");
-		titleFont->displayString(80, 210, "FIRST DAY IN HIS NEW HOUSE...");
+		_titleFont->displayString(80, 130, "AFTER A HORRIFYING NIGHTMARE");
+		_titleFont->displayString(80, 170, "MIKE DAWSON AWAKENS TO THE");
+		_titleFont->displayString(80, 210, "FIRST DAY IN HIS NEW HOUSE...");
 		g_engine->fadeIn(_palette);
 		break;
 	}
diff --git a/engines/darkseed/cutscene.h b/engines/darkseed/cutscene.h
index 4a43fa812ba..99f8694592c 100644
--- a/engines/darkseed/cutscene.h
+++ b/engines/darkseed/cutscene.h
@@ -32,7 +32,7 @@ class Cutscene {
 private:
 	char _cutsceneId;
 	uint16 _movieStep = 9999;
-	TitleFont *titleFont = nullptr;
+	TitleFont *_titleFont = nullptr;
 	Pal _palette;
 	Anm _animation;
 	int _animIdx;
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index b944ca05c94..3ac12cd9334 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -170,10 +170,10 @@ void DarkseedEngine::gameloop() {
 				removeFullscreenPic();
 			}
 		}
-		counter_2c85_888b = (counter_2c85_888b + 1) & 0xff;
+		_counter_2c85_888b = (_counter_2c85_888b + 1) & 0xff;
 		if (_cutscene.isPlaying()) {
 			_cutscene.update();
-		} else if (systemTimerCounter == 5) {
+		} else if (_systemTimerCounter == 5) {
 			if (_objectVar[1] != 0) {
 				if (_room->_roomNumber == 30) {
 					if (!_inventory.hasObject(18)) {
@@ -234,7 +234,7 @@ void DarkseedEngine::gameloop() {
 			if (_currentDay == 1 && _currentTimeInSeconds == 64800 && _room->_roomNumber != 16) {
 				_objectVar.setMoveObjectRoom(7, 253); // remove scotch from shop.
 			}
-			if (_timeAdvanceEventSelected && _currentTimeInSeconds < 79200 && !isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting) {
+			if (_timeAdvanceEventSelected && _currentTimeInSeconds < 79200 && !_isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting) {
 				_timeAdvanceEventSelected = false;
 				if (((_room->_roomNumber == 30) || ((0 < _objectVar[141] && (_objectVar[141] < 4)))) ||
 					(((_room->_roomNumber == 31 || (_room->_roomNumber == 32)) &&
@@ -273,7 +273,7 @@ void DarkseedEngine::gameloop() {
 				if (_room->isOutside() && _room->_roomNumber != 30) {
 					_inventory.endOfDayOutsideLogic();
 				}
-				if (!isPlayingAnimation_maybe) {
+				if (!_isPlayingAnimation_maybe) {
 					if (_room->_roomNumber == 30) {
 						gotosleepinjail();
 					} else {
@@ -294,7 +294,7 @@ void DarkseedEngine::gameloop() {
 					}
 				}
 			}
-			if (_room->_roomNumber == 30 && _objectVar[1] == 0 && (otherNspAnimationType_maybe != 40 || !isPlayingAnimation_maybe || _currentTimeInSeconds > 79199)) {
+			if (_room->_roomNumber == 30 && _objectVar[1] == 0 && (_otherNspAnimationType_maybe != 40 || !_isPlayingAnimation_maybe || _currentTimeInSeconds > 79199)) {
 				gotosleepinjail();
 			}
 			updateDisplay(); // Aka serviceRoom()
@@ -329,7 +329,7 @@ void DarkseedEngine::gameloop() {
 			if (_room->_roomNumber == 32 && _currentDay == 2 &&
 				_currentTimeInSeconds > 64799 && _currentTimeInSeconds < 68401 &&
 				  (_objectVar[141] == 5 || _objectVar[141] == 6 || _objectVar[141] == 4
-					 || _objectVar[141] == 12) && !isPlayingAnimation_maybe) {
+					 || _objectVar[141] == 12) && !_isPlayingAnimation_maybe) {
 				zeromousebuttons();
 			}
 			updateHeadache();
@@ -374,9 +374,9 @@ void DarkseedEngine::updateEvents() {
 
 void DarkseedEngine::wait() {
 	g_system->delayMillis(16);
-	systemTimerCounter++;
-	if (systemTimerCounter == 6) {
-		systemTimerCounter = 0;
+	_systemTimerCounter++;
+	if (_systemTimerCounter == 6) {
+		_systemTimerCounter = 0;
 	}
 }
 
@@ -474,7 +474,7 @@ void DarkseedEngine::handleInput() {
 		setupOtherNspAnimation(1, 5);
 	}
 
-	if (!isPlayingAnimation_maybe) {
+	if (!_isPlayingAnimation_maybe) {
 		if (!_player->_playerIsChangingDirection) {
 			if (currentRoomNumber == 0x39 && _previousRoomNumber == 0x36) {
 				_player->updateSprite();
@@ -482,10 +482,10 @@ void DarkseedEngine::handleInput() {
 				if (_player->isAtWalkTarget() && !_player->_heroMoving) {
 					_player->updateSprite();
 				} else {
-					if (counter_2c85_888b >= 0 && !_player->isAtWalkTarget()) {
-						counter_2c85_888b = 0;
-						_player->playerWalkFrameIdx = (_player->playerWalkFrameIdx + 1) % 8;
-						if ((_player->playerWalkFrameIdx == 0 || _player->playerWalkFrameIdx == 4)
+					if (_counter_2c85_888b >= 0 && !_player->isAtWalkTarget()) {
+						_counter_2c85_888b = 0;
+						_player->_playerWalkFrameIdx = (_player->_playerWalkFrameIdx + 1) % 8;
+						if ((_player->_playerWalkFrameIdx == 0 || _player->_playerWalkFrameIdx == 4)
 							&& currentRoomNumber != 0x22 && currentRoomNumber != 0x13
 							&& currentRoomNumber != 0x14 && currentRoomNumber != 0x15
 							&& currentRoomNumber != 16) {
@@ -618,7 +618,7 @@ void DarkseedEngine::handleInput() {
 					}
 					_cursor.setCursorType((CursorType)_actionMode);
 				}
-				if (_player->isAtWalkTarget() && _player->_heroMoving && _player->walkPathIndex != -1) {
+				if (_player->isAtWalkTarget() && _player->_heroMoving && _player->_walkPathIndex != -1) {
 					_player->walkToNextConnector();
 				}
 				if (_isLeftMouseClicked && _cursor.getY() < 41) {
@@ -627,21 +627,21 @@ void DarkseedEngine::handleInput() {
 				_room->calculateScaledSpriteDimensions(_player->getWidth(), _player->getHeight(), _player->_position.y);
 
 				if (_player->isAtWalkTarget() && _player->_heroMoving && !_player->_actionToPerform) {
-					if (useDoorTarget) {
-						_player->changeDirection(_player->_direction, targetPlayerDirection);
-						useDoorTarget = false;
+					if (_useDoorTarget) {
+						_player->changeDirection(_player->_direction, _targetPlayerDirection);
+						_useDoorTarget = false;
 						_doorEnabled = true;
 						return;
 					}
 					_player->_heroMoving = false;
-					if (useDoorTarget || _doorEnabled) {
-						for (unsigned int i = 0; i < _room->room1.size(); i++) {
-							RoomExit &roomExit = _room->room1[i];
+					if (_useDoorTarget || _doorEnabled) {
+						for (unsigned int i = 0; i < _room->_room1.size(); i++) {
+							RoomExit &roomExit = _room->_room1[i];
 							if (roomExit.roomNumber != 0xff
-								&& roomExit.x < scaledSpriteWidth / 2 + _player->_position.x
-								&& _player->_position.x - scaledSpriteWidth / 2 < roomExit.x + roomExit.width
+								&& roomExit.x < _scaledSpriteWidth / 2 + _player->_position.x
+								&& _player->_position.x - _scaledSpriteWidth / 2 < roomExit.x + roomExit.width
 								&& roomExit.y < _player->_position.y
-								&& _player->_position.y - scaledSpriteHeight < roomExit.y + roomExit.height
+								&& _player->_position.y - _scaledSpriteHeight < roomExit.y + roomExit.height
 								&& roomExit.direction == _player->_direction) {
 								bool bVar = true;
 								if (currentRoomNumber == 64 && roomExit.roomNumber == 64) {
@@ -823,11 +823,11 @@ void DarkseedEngine::handleInput() {
 						}
 					}
 				}
-				if (!isPlayingAnimation_maybe) {
+				if (!_isPlayingAnimation_maybe) {
 					// walk to destination point
 					int walkXDelta = 0;
 					int walkYDelta = 0;
-					int local_a = scaledWalkSpeed_maybe * 16;
+					int local_a = _scaledWalkSpeed_maybe * 16;
 					if (_player->_direction == 0 || _player->_direction == 2) {
 						local_a = local_a / 3;
 					}
@@ -980,16 +980,16 @@ void DarkseedEngine::handleInput() {
 			}
 		} else {
 			// turn player around.
-			_player->playerSpriteWalkIndex_maybe = (int16)((_player->playerSpriteWalkIndex_maybe + _player->playerWalkFrameDeltaOffset) & 7);
-			if (_player->playerSpriteWalkIndex_maybe == _player->playerNewFacingDirection_maybe) {
+			_player->_playerSpriteWalkIndex_maybe = (int16)((_player->_playerSpriteWalkIndex_maybe + _player->_playerWalkFrameDeltaOffset) & 7);
+			if (_player->_playerSpriteWalkIndex_maybe == _player->_playerNewFacingDirection_maybe) {
 				_player->_playerIsChangingDirection = false;
-				_player->_direction = _player->playerNewFacingDirection_maybe / 2;
+				_player->_direction = _player->_playerNewFacingDirection_maybe / 2;
 			}
 			_player->updateSprite();
 		}
 	} else {
 		updateAnimation();
-		if (!isPlayingAnimation_maybe && _player->_isAutoWalkingToBed) {
+		if (!_isPlayingAnimation_maybe && _player->_isAutoWalkingToBed) {
 			_player->setplayertowardsbedroom();
 		}
 	}
@@ -1107,7 +1107,7 @@ void DarkseedEngine::changeToRoom(int newRoomNumber, bool placeDirectly) { // AK
 	} else if ((_previousRoomNumber == 41 && newRoomNumber == 44) || (_previousRoomNumber == 44 && newRoomNumber == 41)) {
 		_player->loadAnimations("beamer.nsp");
 		setupOtherNspAnimation(1, 58);
-		for (auto &exit : _room->room1) {
+		for (auto &exit : _room->_room1) {
 			if (exit.roomNumber == _previousRoomNumber) {
 				_player->_position.x = exit.x + exit.width / 2;
 				_player->_position.y = exit.y;
@@ -1117,8 +1117,8 @@ void DarkseedEngine::changeToRoom(int newRoomNumber, bool placeDirectly) { // AK
 			}
 		}
 	} else if (!placeDirectly && newRoomNumber != 0x22 && (newRoomNumber < 0x13 || newRoomNumber > 0x17)) {
-		for (unsigned int i = 0; i < _room->room1.size(); i++) {
-			const RoomExit &roomExit = _room->room1[i];
+		for (unsigned int i = 0; i < _room->_room1.size(); i++) {
+			const RoomExit &roomExit = _room->_room1[i];
 			if (roomExit.roomNumber == _previousRoomNumber) {
 				_player->_position.x = roomExit.x + roomExit.width / 2;
 				_player->_position.y = roomExit.y;
@@ -1132,7 +1132,7 @@ void DarkseedEngine::changeToRoom(int newRoomNumber, bool placeDirectly) { // AK
 		}
 	}
 
-	if (!g_engine->isPlayingAnimation_maybe) {
+	if (!g_engine->_isPlayingAnimation_maybe) {
 		g_engine->_player->updateSprite();
 	}
 	_room->initRoom();
@@ -1147,8 +1147,8 @@ void DarkseedEngine::debugTeleportToRoom(int newRoomNumber, int entranceNumber)
 
 	updateBaseSprites();
 
-	if (entranceNumber < (int) _room->room1.size()) {
-		const RoomExit &roomExit = _room->room1[entranceNumber];
+	if (entranceNumber < (int) _room->_room1.size()) {
+		const RoomExit &roomExit = _room->_room1[entranceNumber];
 		_player->_position.x = roomExit.x + roomExit.width / 2;
 		_player->_position.y = roomExit.y;
 		_player->_direction = roomExit.direction ^ 2;
@@ -1163,8 +1163,8 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 	_sprites.clearSpriteDrawList();
 	_room->runRoomObjects();
 	runObjects();
-	if (isPlayingAnimation_maybe == 0 ||
-		(otherNspAnimationType_maybe != 6 && otherNspAnimationType_maybe != 7) || currentRoomNumber != 5) {
+	if (_isPlayingAnimation_maybe == 0 ||
+		(_otherNspAnimationType_maybe != 6 && _otherNspAnimationType_maybe != 7) || currentRoomNumber != 5) {
 		_frameBottom = 240;
 	} else {
 		_frameBottom = 208;
@@ -1173,50 +1173,50 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 	if (currentRoomNumber != 0x22 && currentRoomNumber != 0x13 &&
 		  currentRoomNumber != 0x14 && currentRoomNumber != 0x15 && currentRoomNumber != 0x16 &&
 		 _objectVar[141] != 9 && (currentRoomNumber != 0x35 || _objectVar[45] != 2)) {
-		if (((otherNspAnimationType_maybe == 60) || (otherNspAnimationType_maybe == 61)) &&
-			isPlayingAnimation_maybe) {
+		if (((_otherNspAnimationType_maybe == 60) || (_otherNspAnimationType_maybe == 61)) &&
+			_isPlayingAnimation_maybe) {
 			const Sprite &sprite = _room->_locationSprites.getSpriteAt(_player->_frameIdx);
-			_sprites.addSpriteToDrawList(431, 66, &sprite, 255, sprite.width, sprite.height, false);
+			_sprites.addSpriteToDrawList(431, 66, &sprite, 255, sprite._width, sprite._height, false);
 		}
-		if (_objectVar[OBJ_21_HEADBAND] == 0 || (headAcheMessageCounter & 1) != 0) {
-			if (!isPlayingAnimation_maybe || otherNspAnimationType_maybe == 19
-				|| otherNspAnimationType_maybe == 23) {
+		if (_objectVar[OBJ_21_HEADBAND] == 0 || (_headAcheMessageCounter & 1) != 0) {
+			if (!_isPlayingAnimation_maybe || _otherNspAnimationType_maybe == 19
+				|| _otherNspAnimationType_maybe == 23) {
 				const Sprite &playerSprite = _player->getSprite(_player->_frameIdx);
-				_room->calculateScaledSpriteDimensions(playerSprite.width, playerSprite.height, _player->_position.y);
+				_room->calculateScaledSpriteDimensions(playerSprite._width, playerSprite._height, _player->_position.y);
 				if ((currentRoomNumber != 53) || (_objectVar[79] != 2)) {
 					_sprites.addSpriteToDrawList(
-						_player->_position.x - (scaledSpriteWidth / 2),
-						_player->_position.y - scaledSpriteHeight,
+						_player->_position.x - (_scaledSpriteWidth / 2),
+						_player->_position.y - _scaledSpriteHeight,
 						&playerSprite,
 						240 - _player->_position.y,
-						scaledSpriteWidth,
-						scaledSpriteHeight, player_sprite_related_2c85_82f3);
+						_scaledSpriteWidth,
+						_scaledSpriteHeight, _player_sprite_related_2c85_82f3);
 				}
 			} else {
-				if (otherNspAnimationType_maybe == 37) {
+				if (_otherNspAnimationType_maybe == 37) {
 					const Sprite &playerSprite = _player->getSprite(26);
-					_room->calculateScaledSpriteDimensions(playerSprite.width, playerSprite.height, _player->_position.y);
+					_room->calculateScaledSpriteDimensions(playerSprite._width, playerSprite._height, _player->_position.y);
 					_sprites.addSpriteToDrawList(
 						_player->_position.x,
-						_player->_position.y - scaledSpriteHeight,
+						_player->_position.y - _scaledSpriteHeight,
 						&playerSprite,
 						240 - _player->_position.y,
-						scaledSpriteWidth,
-						scaledSpriteHeight, player_sprite_related_2c85_82f3);
+						_scaledSpriteWidth,
+						_scaledSpriteHeight, _player_sprite_related_2c85_82f3);
 				}
-				if (otherNspAnimationType_maybe == 39 || otherNspAnimationType_maybe == 59 ||
-					 otherNspAnimationType_maybe == 60 || otherNspAnimationType_maybe == 61) {
+				if (_otherNspAnimationType_maybe == 39 || _otherNspAnimationType_maybe == 59 ||
+					_otherNspAnimationType_maybe == 60 || _otherNspAnimationType_maybe == 61) {
 					const Sprite &playerSprite = _player->getSprite(26);
-					_room->calculateScaledSpriteDimensions(playerSprite.width, playerSprite.height, _player->_position.y);
+					_room->calculateScaledSpriteDimensions(playerSprite._width, playerSprite._height, _player->_position.y);
 					_sprites.addSpriteToDrawList(
 						_player->_position.x,
-						_player->_position.y - scaledSpriteHeight,
+						_player->_position.y - _scaledSpriteHeight,
 						&playerSprite,
 						240 - _player->_position.y,
-						scaledSpriteWidth,
-						scaledSpriteHeight, player_sprite_related_2c85_82f3);
-					if (otherNspAnimationType_maybe == 60 || otherNspAnimationType_maybe == 61) {
-						sprite_y_scaling_threshold_maybe = 240;
+						_scaledSpriteWidth,
+						_scaledSpriteHeight, _player_sprite_related_2c85_82f3);
+					if (_otherNspAnimationType_maybe == 60 || _otherNspAnimationType_maybe == 61) {
+						_sprite_y_scaling_threshold_maybe = 240;
 //						DrawObjectsMenu(); TODO do we need this logic?
 //						UpdateAllVideo();
 //						*(undefined2 *)&_LastTickCursorY = *(undefined2 *)&_CursorY;
@@ -1225,38 +1225,38 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 				}
 //				iVar9 = *(int *)((int)otherNspWidthTbl + _player->_frameIdx * 2);
 //				iVar8 = *(int *)((int)&otherNspHeightTbl + _player->_frameIdx * 2);
-				if (otherNspAnimationType_maybe == 18) {
+				if (_otherNspAnimationType_maybe == 18) {
 					if (_objectVar[22] == 0) {
-						sprite_y_scaling_threshold_maybe = 0xcb;
+						_sprite_y_scaling_threshold_maybe = 0xcb;
 					} else if (_objectVar[22] == 1) {
-						sprite_y_scaling_threshold_maybe = 0xcb;
+						_sprite_y_scaling_threshold_maybe = 0xcb;
 					} else if (_objectVar[22] == 2) {
-						sprite_y_scaling_threshold_maybe = 0xc4;
+						_sprite_y_scaling_threshold_maybe = 0xc4;
 					} else {
-						sprite_y_scaling_threshold_maybe = 0xaf;
+						_sprite_y_scaling_threshold_maybe = 0xaf;
 					}
 				}
 
 				if (_player->_animations.containsSpriteAt(_player->_frameIdx)) { // we need this check as the original logic calls the function below when it isn't initialised
 					_room->calculateScaledSpriteDimensions(
-						_player->_animations.getSpriteAt(_player->_frameIdx).width,
-						_player->_animations.getSpriteAt(_player->_frameIdx).height,
-						nsp_sprite_scaling_y_position != 0 ? nsp_sprite_scaling_y_position : _player->_position.y);
+						_player->_animations.getSpriteAt(_player->_frameIdx)._width,
+						_player->_animations.getSpriteAt(_player->_frameIdx)._height,
+						_nsp_sprite_scaling_y_position != 0 ? _nsp_sprite_scaling_y_position : _player->_position.y);
 				}
 
-				if (otherNspAnimationType_maybe == 3) { // fall unconscious outside.
-					int curScaledWidth = g_engine->scaledSpriteWidth;
-					int curScaledHeight = g_engine->scaledSpriteHeight;
+				if (_otherNspAnimationType_maybe == 3) { // fall unconscious outside.
+					int curScaledWidth = g_engine->_scaledSpriteWidth;
+					int curScaledHeight = g_engine->_scaledSpriteHeight;
 					_room->calculateScaledSpriteDimensions(
-						_player->_animations.getSpriteAt(_player->_frameIdx + 1).width,
-						_player->_animations.getSpriteAt(_player->_frameIdx + 1).height, _player->_position.y);
+						_player->_animations.getSpriteAt(_player->_frameIdx + 1)._width,
+						_player->_animations.getSpriteAt(_player->_frameIdx + 1)._height, _player->_position.y);
 					const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-					_sprites.addSpriteToDrawList(_player->_position.x - (curScaledWidth + g_engine->scaledSpriteWidth) / 2, _player->_position.y - curScaledHeight, &animSprite, 240 - _player->_position.y, curScaledWidth, curScaledHeight, false);
+					_sprites.addSpriteToDrawList(_player->_position.x - (curScaledWidth + g_engine->_scaledSpriteWidth) / 2, _player->_position.y - curScaledHeight, &animSprite, 240 - _player->_position.y, curScaledWidth, curScaledHeight, false);
 				} else if (!_scaleSequence) {
-					if (otherNspAnimationType_maybe == 17) { // open trunk
+					if (_otherNspAnimationType_maybe == 17) { // open trunk
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(_player->_position.x - animSprite.width / 2, _player->_position.y - animSprite.height, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-					} else if (otherNspAnimationType_maybe == 5 || otherNspAnimationType_maybe == 1) {
+						_sprites.addSpriteToDrawList(_player->_position.x - animSprite._width / 2, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+					} else if (_otherNspAnimationType_maybe == 5 || _otherNspAnimationType_maybe == 1) {
 						int x = 0xa6;
 						int y = 0x69;
 						if (_player->_frameIdx < 4) {
@@ -1272,99 +1272,99 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 
 						/* bed wake sequence is played here. */
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(x, y, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-					} else if (otherNspAnimationType_maybe == 43 || otherNspAnimationType_maybe == 44) {
+						_sprites.addSpriteToDrawList(x, y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+					} else if (_otherNspAnimationType_maybe == 43 || _otherNspAnimationType_maybe == 44) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(303, 105, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-					} else if (otherNspAnimationType_maybe == 62) { // sargent approaches jail cell.
+						_sprites.addSpriteToDrawList(303, 105, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+					} else if (_otherNspAnimationType_maybe == 62) { // sargent approaches jail cell.
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(_player->_position.x - animSprite.width / 2, _player->_position.y - animSprite.height, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-					} else if (otherNspAnimationType_maybe == 45 || otherNspAnimationType_maybe == 46) { // pull lever
+						_sprites.addSpriteToDrawList(_player->_position.x - animSprite._width / 2, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+					} else if (_otherNspAnimationType_maybe == 45 || _otherNspAnimationType_maybe == 46) { // pull lever
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(446, 124, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-					} else if (otherNspAnimationType_maybe == 36) {
+						_sprites.addSpriteToDrawList(446, 124, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+					} else if (_otherNspAnimationType_maybe == 36) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(339, 78, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-					} else if (otherNspAnimationType_maybe == 59) {
+						_sprites.addSpriteToDrawList(339, 78, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+					} else if (_otherNspAnimationType_maybe == 59) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(433, 91, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-					} else if (otherNspAnimationType_maybe == 37) {
+						_sprites.addSpriteToDrawList(433, 91, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+					} else if (_otherNspAnimationType_maybe == 37) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(428, 78, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-					} else if (otherNspAnimationType_maybe == 10 || otherNspAnimationType_maybe == 11) {
+						_sprites.addSpriteToDrawList(428, 78, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+					} else if (_otherNspAnimationType_maybe == 10 || _otherNspAnimationType_maybe == 11) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(118, 62, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, false);
-					} else if (otherNspAnimationType_maybe == 12 || otherNspAnimationType_maybe == 13) {
+						_sprites.addSpriteToDrawList(118, 62, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, false);
+					} else if (_otherNspAnimationType_maybe == 12 || _otherNspAnimationType_maybe == 13) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(407, 73, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, false);
-					} else if (otherNspAnimationType_maybe == 20) {
+						_sprites.addSpriteToDrawList(407, 73, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, false);
+					} else if (_otherNspAnimationType_maybe == 20) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList((_player->_position.x - animSprite.width / 2) - 4, _player->_position.y - animSprite.height, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-					} else if (otherNspAnimationType_maybe < 30 || otherNspAnimationType_maybe > 34) {
-						if (otherNspAnimationType_maybe == 40) {
+						_sprites.addSpriteToDrawList((_player->_position.x - animSprite._width / 2) - 4, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+					} else if (_otherNspAnimationType_maybe < 30 || _otherNspAnimationType_maybe > 34) {
+						if (_otherNspAnimationType_maybe == 40) {
 							const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-							_sprites.addSpriteToDrawList(373, 99, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+							_sprites.addSpriteToDrawList(373, 99, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
 							const Sprite &legsSprite = _player->_animations.getSpriteAt(12);
-							_sprites.addSpriteToDrawList(373, 99 + animSprite.height, &legsSprite, 240 - _player->_position.y, legsSprite.width, legsSprite.height, player_sprite_related_2c85_82f3);
-						} else if (otherNspAnimationType_maybe < 48 || otherNspAnimationType_maybe > 52) {
-							if (otherNspAnimationType_maybe == 35) {
+							_sprites.addSpriteToDrawList(373, 99 + animSprite._height, &legsSprite, 240 - _player->_position.y, legsSprite._width, legsSprite._height, _player_sprite_related_2c85_82f3);
+						} else if (_otherNspAnimationType_maybe < 48 || _otherNspAnimationType_maybe > 52) {
+							if (_otherNspAnimationType_maybe == 35) {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-								_sprites.addSpriteToDrawList(_player->_position.x - 10, _player->_position.y - animSprite.height, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-							} else if (otherNspAnimationType_maybe >= 53 && otherNspAnimationType_maybe <= 56) {
+								_sprites.addSpriteToDrawList(_player->_position.x - 10, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+							} else if (_otherNspAnimationType_maybe >= 53 && _otherNspAnimationType_maybe <= 56) {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
-							} else if (otherNspAnimationType_maybe == 57 || otherNspAnimationType_maybe == 58) {
+								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+							} else if (_otherNspAnimationType_maybe == 57 || _otherNspAnimationType_maybe == 58) {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 								Common::Point spritePos = {344, 57};
 								if (_room->_roomNumber == 41) {
 									spritePos = {295, 46};
 								}
-								_sprites.addSpriteToDrawList(spritePos.x, spritePos.y, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+								_sprites.addSpriteToDrawList(spritePos.x, spritePos.y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
 							} else {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
 							}
 						} else {
 							const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-							_sprites.addSpriteToDrawList(_player->_position.x - animSprite.width / 2, _player->_position.y - animSprite.height, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+							_sprites.addSpriteToDrawList(_player->_position.x - animSprite._width / 2, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
 						}
 					} else {
 						// drinking water in bathroom
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
-						_sprites.addSpriteToDrawList(448, 97, &animSprite, 240 - _player->_position.y, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+						_sprites.addSpriteToDrawList(448, 97, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
 						const Sprite &legsSprite = _player->_animations.getSpriteAt(0);
-						_sprites.addSpriteToDrawList(451, 160, &legsSprite, 240 - _player->_position.y, legsSprite.width, legsSprite.height, player_sprite_related_2c85_82f3);
+						_sprites.addSpriteToDrawList(451, 160, &legsSprite, 240 - _player->_position.y, legsSprite._width, legsSprite._height, _player_sprite_related_2c85_82f3);
 
 					}
-				} else if (otherNspAnimationType_maybe == 6) {
+				} else if (_otherNspAnimationType_maybe == 6) {
 					// stairs up
 					_sprites.addSpriteToDrawList(
-						_player->_position.x - scaledSpriteWidth / 2,
-						_player->_position.y - scaledSpriteHeight,
+						_player->_position.x - _scaledSpriteWidth / 2,
+						_player->_position.y - _scaledSpriteHeight,
 						&_player->_animations.getSpriteAt(_player->_frameIdx),
 						0xff,
-						scaledSpriteWidth,
-						scaledSpriteHeight,
-						player_sprite_related_2c85_82f3);
-				} else if (otherNspAnimationType_maybe == 22) { // dig grave
+						_scaledSpriteWidth,
+						_scaledSpriteHeight,
+						_player_sprite_related_2c85_82f3);
+				} else if (_otherNspAnimationType_maybe == 22) { // dig grave
 					_sprites.addSpriteToDrawList(
-						_player->_position.x - ((scaledWalkSpeed_maybe * 30) / 1000),
-						_player->_position.y - scaledSpriteHeight,
+						_player->_position.x - ((_scaledWalkSpeed_maybe * 30) / 1000),
+						_player->_position.y - _scaledSpriteHeight,
 						&_player->_animations.getSpriteAt(_player->_frameIdx),
 						240 - _player->_position.y,
-						scaledSpriteWidth,
-						scaledSpriteHeight,
-						player_sprite_related_2c85_82f3);
-				} else if (otherNspAnimationType_maybe == 4 || otherNspAnimationType_maybe == 21) { // dig grave
+						_scaledSpriteWidth,
+						_scaledSpriteHeight,
+						_player_sprite_related_2c85_82f3);
+				} else if (_otherNspAnimationType_maybe == 4 || _otherNspAnimationType_maybe == 21) { // dig grave
 					_sprites.addSpriteToDrawList(
-						_player->_position.x - ((scaledWalkSpeed_maybe * 95) / 1000),
-						_player->_position.y - scaledSpriteHeight,
+						_player->_position.x - ((_scaledWalkSpeed_maybe * 95) / 1000),
+						_player->_position.y - _scaledSpriteHeight,
 						&_player->_animations.getSpriteAt(_player->_frameIdx),
 						240 - _player->_position.y,
-						scaledSpriteWidth,
-						scaledSpriteHeight,
-						player_sprite_related_2c85_82f3);
-				} else if (otherNspAnimationType_maybe == 39) {
+						_scaledSpriteWidth,
+						_scaledSpriteHeight,
+						_player_sprite_related_2c85_82f3);
+				} else if (_otherNspAnimationType_maybe == 39) {
 					int16 spriteX = 110;
 					int16 spriteY = _player->_position.y;
 					if (_room->_roomNumber == 10) {
@@ -1373,59 +1373,59 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 					}
 					const Sprite &sprite = _room->_locationSprites.getSpriteAt(_player->_frameIdx);
 					_room->calculateScaledSpriteDimensions(
-						sprite.width,
-						sprite.height,
+						sprite._width,
+						sprite._height,
 						spriteX);
 					_sprites.addSpriteToDrawList(
 						spriteX,
-						spriteY - scaledSpriteHeight,
+						spriteY - _scaledSpriteHeight,
 						&sprite,
 						240 - _player->_position.y,
-						scaledSpriteWidth,
-						scaledSpriteHeight,
-						player_sprite_related_2c85_82f3);
-				} else if (otherNspAnimationType_maybe == 47) {
+						_scaledSpriteWidth,
+						_scaledSpriteHeight,
+						_player_sprite_related_2c85_82f3);
+				} else if (_otherNspAnimationType_maybe == 47) {
 					const Sprite &sprite = _room->_locationSprites.getSpriteAt(_player->_frameIdx);
 					_room->calculateScaledSpriteDimensions(
-						sprite.width,
-						sprite.height,
+						sprite._width,
+						sprite._height,
 						_player->_position.y);
 					_sprites.addSpriteToDrawList(
 						_player->_position.x,
-						_player->_position.y - scaledSpriteHeight,
+						_player->_position.y - _scaledSpriteHeight,
 						&sprite,
 						240 - _player->_position.y,
-						scaledSpriteWidth,
-						scaledSpriteHeight,
-						player_sprite_related_2c85_82f3);
+						_scaledSpriteWidth,
+						_scaledSpriteHeight,
+						_player_sprite_related_2c85_82f3);
 				} else {
 					_sprites.addSpriteToDrawList(
-						_player->_position.x - scaledSpriteWidth / 2,
-						_player->_position.y - scaledSpriteHeight,
+						_player->_position.x - _scaledSpriteWidth / 2,
+						_player->_position.y - _scaledSpriteHeight,
 						&_player->_animations.getSpriteAt(_player->_frameIdx),
 						240 - _player->_position.y,
-						scaledSpriteWidth,
-						scaledSpriteHeight,
-						player_sprite_related_2c85_82f3);
+						_scaledSpriteWidth,
+						_scaledSpriteHeight,
+						_player_sprite_related_2c85_82f3);
 				}
-				if (isPlayingAnimation_maybe && otherNspAnimationType_maybe == 14 && animIndexTbl[0] > 1) {
+				if (_isPlayingAnimation_maybe && _otherNspAnimationType_maybe == 14 && _animIndexTbl[0] > 1) {
 					if (_objectVar.getObjectRunningCode(140) == 0 || _room->_roomNumber != 6) {
 						if (_room->_roomNumber == 6 && _player->_isAutoWalkingToBed) {
 							const Sprite &animSprite = _player->_animations.getSpriteAt(8);
-							_sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+							_sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
 						} else if (_room->_roomNumber == 6) {
 							const Sprite &animSprite = _player->_animations.getSpriteAt(2);
-							_sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+							_sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
 						} else if (_room->_roomNumber == 11) {
 							const Sprite &animSprite = _player->_animations.getSpriteAt(6);
-							_sprites.addSpriteToDrawList(369, 119, &animSprite, 255, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+							_sprites.addSpriteToDrawList(369, 119, &animSprite, 255, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
 						} else if (_room->_roomNumber == 12) {
 							const Sprite &animSprite = _player->_animations.getSpriteAt(6);
-							_sprites.addSpriteToDrawList(252, 121, &animSprite, 255, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+							_sprites.addSpriteToDrawList(252, 121, &animSprite, 255, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
 						}
 					} else {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(3);
-						_sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite.width, animSprite.height, player_sprite_related_2c85_82f3);
+						_sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
 					}
 				}
 			}
@@ -1436,29 +1436,29 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 	assert(nspAnimIdx < 20);
 	_player->_playerIsChangingDirection = false;
-	nsp_sprite_scaling_y_position = 0;
+	_nsp_sprite_scaling_y_position = 0;
 	_scaleSequence = false;
 
-	animIndexTbl[nspAnimIdx] = 0;
+	_animIndexTbl[nspAnimIdx] = 0;
 	if (_player->_animations.getTotalAnim() > nspAnimIdx) {
-		spriteAnimCountdownTimer[nspAnimIdx] = _player->_animations.getAnimAt(nspAnimIdx).frameDuration[0];
-		_player->_frameIdx = _player->_animations.getAnimAt(nspAnimIdx).frameNo[0];
+		_spriteAnimCountdownTimer[nspAnimIdx] = _player->_animations.getAnimAt(nspAnimIdx)._frameDuration[0];
+		_player->_frameIdx = _player->_animations.getAnimAt(nspAnimIdx)._frameNo[0];
 	} else {
-		spriteAnimCountdownTimer[nspAnimIdx] = 0;
+		_spriteAnimCountdownTimer[nspAnimIdx] = 0;
 		_player->_frameIdx = 0;
 	}
-	isPlayingAnimation_maybe = true;
-	otherNspAnimationType_maybe = animId;
+	_isPlayingAnimation_maybe = true;
+	_otherNspAnimationType_maybe = animId;
 
-	player_sprite_related_2c85_82f3 = 0;
+	_player_sprite_related_2c85_82f3 = 0;
 	_ObjRestarted = false;
 
-	if (otherNspAnimationType_maybe < 2) {
+	if (_otherNspAnimationType_maybe < 2) {
 		return;
 	}
 
 	// TODO big switch here to init the different animation types.
-	switch (otherNspAnimationType_maybe) {
+	switch (_otherNspAnimationType_maybe) {
 	case 2:
 		_player->_position.x = 188;
 		_player->_position.y = 94;
@@ -1483,11 +1483,11 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		_scaleSequence = 1;
 		break;
 	case 6 : // stairs
-		nsp_sprite_scaling_y_position = 0xbe;
+		_nsp_sprite_scaling_y_position = 0xbe;
 		_scaleSequence = true;
 		break;
 	case 7 : // stairs down
-		nsp_sprite_scaling_y_position = 0xbe;
+		_nsp_sprite_scaling_y_position = 0xbe;
 		_scaleSequence = true;
 		break;
 	case 8 :
@@ -1504,7 +1504,7 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		_player->_frameIdx = 24;
 		break;
 	case 20:
-		spriteAnimCountdownTimer[3] = 3;
+		_spriteAnimCountdownTimer[3] = 3;
 		break;
 	case 26 :
 		_player->_position.x = 324;
@@ -1520,7 +1520,7 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		break;
 	case 39:
 		_scaleSequence = true;
-		_player->_frameIdx = _room->_locationSprites.getAnimAt(nspAnimIdx).frameNo[0];
+		_player->_frameIdx = _room->_locationSprites.getAnimAt(nspAnimIdx)._frameNo[0];
 		break;
 	case 41 :
 	case 42 :
@@ -1533,7 +1533,7 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 		break;
 	case 47:
 		_scaleSequence = true;
-		_player->_frameIdx = _room->_locationSprites.getAnimAt(nspAnimIdx).frameNo[0];
+		_player->_frameIdx = _room->_locationSprites.getAnimAt(nspAnimIdx)._frameNo[0];
 		break;
 	case 53 :
 	case 54 :
@@ -1564,13 +1564,13 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 
 void DarkseedEngine::updateAnimation() {
 	int currentRoomNumber = _room->_roomNumber;
-	switch (otherNspAnimationType_maybe) {
+	switch (_otherNspAnimationType_maybe) {
 	case 0:
 		break;
 	case 1 : // sleep wake anim
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			_player->_position.x = 0xdf;
 			_player->_position.y = 0xbe;
@@ -1582,7 +1582,7 @@ void DarkseedEngine::updateAnimation() {
 	case 2:
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			_player->_position.x = 218;
 			_player->_position.y = 198;
@@ -1597,7 +1597,7 @@ void DarkseedEngine::updateAnimation() {
 	case 3:
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			if (_room->isGiger()) {
 				stuffPlayer();
@@ -1614,16 +1614,16 @@ void DarkseedEngine::updateAnimation() {
 	case 21:
 	case 22: // dig up grave
 		advanceAnimationFrame(0);
-		if (_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]] % 5 == 3 &&
-			_player->_animations.getAnimAt(0).frameDuration[animIndexTbl[0]] == spriteAnimCountdownTimer[0]) {
+		if (_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]] % 5 == 3 &&
+			_player->_animations.getAnimAt(0)._frameDuration[_animIndexTbl[0]] == _spriteAnimCountdownTimer[0]) {
 			playSound(14, 5, -1);
 		}
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
-			isPlayingAnimation_maybe = false;
+			_isPlayingAnimation_maybe = false;
 			_objectVar[52] = 1;
-			if (otherNspAnimationType_maybe == 21 && _objectVar[151] != 0) {
+			if (_otherNspAnimationType_maybe == 21 && _objectVar[151] != 0) {
 				if (_objectVar[87] == 0) {
 					_objectVar[88] = 1;
 					_objectVar[87] = 1;
@@ -1643,7 +1643,7 @@ void DarkseedEngine::updateAnimation() {
 		_player->_position.y = 91;
 		advanceAnimationFrame(1);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]];
 		} else {
 			gotonextmorning(); // TODO there might be some extra logic required from original function
 			_player->_position.x = 242;
@@ -1659,14 +1659,14 @@ void DarkseedEngine::updateAnimation() {
 		} else {
 			advanceAnimationFrame(2);
 		}
-		if (_FrameAdvanced && ((currentRoomNumber == 6 && animIndexTbl[1] == 1) || (currentRoomNumber == 5 && animIndexTbl[2] == 1))) {
+		if (_FrameAdvanced && ((currentRoomNumber == 6 && _animIndexTbl[1] == 1) || (currentRoomNumber == 5 && _animIndexTbl[2] == 1))) {
 //			FUN_1208_0dac_sound_related(0xd,CONCAT11(uVar4,5));
 		}
 		if (!_ObjRestarted) {
 			if (currentRoomNumber == 6) {
-				_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
+				_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]];
 			} else {
-				_player->_frameIdx = _player->_animations.getAnimAt(2).frameNo[_player->_animations.getAnimAt(2).frameNo[animIndexTbl[2]]];
+				_player->_frameIdx = _player->_animations.getAnimAt(2)._frameNo[_player->_animations.getAnimAt(2)._frameNo[_animIndexTbl[2]]];
 			}
 		} else {
 			if (currentRoomNumber == 6) {
@@ -1681,28 +1681,28 @@ void DarkseedEngine::updateAnimation() {
 	case 7: // stairs down
 		if (currentRoomNumber == 5) {
 			advanceAnimationFrame(3);
-			if (_FrameAdvanced && animIndexTbl[3] == 1) {
+			if (_FrameAdvanced && _animIndexTbl[3] == 1) {
 				// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
 			}
 			if (!_ObjRestarted) {
-				_player->_frameIdx = _player->_animations.getAnimAt(3).frameNo[_player->_animations.getAnimAt(3).frameNo[animIndexTbl[3]]];
+				_player->_frameIdx = _player->_animations.getAnimAt(3)._frameNo[_player->_animations.getAnimAt(3)._frameNo[_animIndexTbl[3]]];
 			} else {
 				_previousRoomNumber = 5;
 				changeToRoom(6);
 			}
 		} else {
 			advanceAnimationFrame(0);
-			if (_FrameAdvanced && animIndexTbl[0] == 1) {
+			if (_FrameAdvanced && _animIndexTbl[0] == 1) {
 				// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
 			}
 			if (!_ObjRestarted) {
-				_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+				_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 			}
 		}
 		break;
 	case 8: //phone call
 	case 63:
-		if (otherNspAnimationType_maybe == 8) {
+		if (_otherNspAnimationType_maybe == 8) {
 			advanceAnimationFrame(0);
 		} else {
 			advanceAnimationFrame(2);
@@ -1711,13 +1711,13 @@ void DarkseedEngine::updateAnimation() {
 			}
 		}
 		if (!_ObjRestarted) {
-			if (otherNspAnimationType_maybe == 8) {
-				_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			if (_otherNspAnimationType_maybe == 8) {
+				_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 			} else {
-				_player->_frameIdx = _player->_animations.getAnimAt(2).frameNo[_player->_animations.getAnimAt(2).frameNo[animIndexTbl[2]]];
+				_player->_frameIdx = _player->_animations.getAnimAt(2)._frameNo[_player->_animations.getAnimAt(2)._frameNo[_animIndexTbl[2]]];
 			}
 		} else {
-			if (otherNspAnimationType_maybe == 63) {
+			if (_otherNspAnimationType_maybe == 63) {
 				_console->printTosText(44);
 				setupOtherNspAnimation(1, 64);
 			} else {
@@ -1740,7 +1740,7 @@ void DarkseedEngine::updateAnimation() {
 	case 64:
 		advanceAnimationFrame(1);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]];
 		} else {
 			_player->_position.x = 300;
 			_player->_position.y = 183;
@@ -1753,7 +1753,7 @@ void DarkseedEngine::updateAnimation() {
 	case 11:
 		advanceAnimationFrame(1);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
 		} else {
 			_player->_position.x = 175;
 			_player->_position.y = 200;
@@ -1768,7 +1768,7 @@ void DarkseedEngine::updateAnimation() {
 	case 12:
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			_player->_position.x = 360;
 			_player->_position.y = 238;
@@ -1781,7 +1781,7 @@ void DarkseedEngine::updateAnimation() {
 	case 13:
 		advanceAnimationFrame(1);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
 		} else {
 			_player->_position.x = 450;
 			_player->_position.y = 217;
@@ -1794,7 +1794,7 @@ void DarkseedEngine::updateAnimation() {
 	case 16: // climb down rope
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			_player->_position.x = 336;
 			_player->_position.y = 195;
@@ -1807,9 +1807,9 @@ void DarkseedEngine::updateAnimation() {
 	case 17: // open trunk with crowbar
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		}
-		if (animIndexTbl[0] == 5 && _FrameAdvanced) {
+		if (_animIndexTbl[0] == 5 && _FrameAdvanced) {
 			playSound(31, 5, -1);
 			_console->printTosText(666);
 			if (_objectVar[42] == 0) {
@@ -1822,9 +1822,9 @@ void DarkseedEngine::updateAnimation() {
 	case 18: // push trunk
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		}
-		if (_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]] == 3 && _FrameAdvanced) {
+		if (_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]] == 3 && _FrameAdvanced) {
 			_console->printTosText(_objectVar[22] + 662);
 			_objectVar[22] = _objectVar[22] + 1;
 			if (_objectVar[22] == 3) {
@@ -1835,7 +1835,7 @@ void DarkseedEngine::updateAnimation() {
 	case 19: // pickup book from library
 		_player->_frameIdx = 24;
 		if (_ObjRestarted) {
-			isPlayingAnimation_maybe = true;
+			_isPlayingAnimation_maybe = true;
 			_objectVar[46] = 2;
 			libanim(true);
 		}
@@ -1843,7 +1843,7 @@ void DarkseedEngine::updateAnimation() {
 	case 20: // receive card from delbert
 		advanceAnimationFrame(3);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(3).frameNo[animIndexTbl[3]];
+			_player->_frameIdx = _player->_animations.getAnimAt(3)._frameNo[_animIndexTbl[3]];
 		} else {
 			_inventory.addItem(18);
 		}
@@ -1851,7 +1851,7 @@ void DarkseedEngine::updateAnimation() {
 	case 23:
 		_player->_frameIdx = 24;
 		if (_ObjRestarted != 0) {
-			isPlayingAnimation_maybe = false;
+			_isPlayingAnimation_maybe = false;
 			_objectVar[99] = 1;
 			_console->printTosText(468);
 		}
@@ -1859,7 +1859,7 @@ void DarkseedEngine::updateAnimation() {
 	case 10:
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
 			changeToRoom(61);
@@ -1872,10 +1872,10 @@ void DarkseedEngine::updateAnimation() {
 		// Open doors
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			_player->updateSprite();
-			if (otherNspAnimationType_maybe == 14) {
+			if (_otherNspAnimationType_maybe == 14) {
 				// TODO
 				if (_objectVar.getObjectRunningCode(140) == 0 || _room->_roomNumber != 6) {
 					_previousRoomNumber = _room->_roomNumber;
@@ -1902,7 +1902,7 @@ void DarkseedEngine::updateAnimation() {
 					getPackageObj(_currentDay);
 				}
 			}
-			if (otherNspAnimationType_maybe == 25) {
+			if (_otherNspAnimationType_maybe == 25) {
 				_previousRoomNumber = 33;
 				changeToRoom(34);
 			}
@@ -1911,7 +1911,7 @@ void DarkseedEngine::updateAnimation() {
 	case 26: // climb up rope.
 		advanceAnimationFrame(1);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
 			changeToRoom(13);
@@ -1920,7 +1920,7 @@ void DarkseedEngine::updateAnimation() {
 	case 27:
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]]; // TODO check if this is correct.
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]]; // TODO check if this is correct.
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
 			changeToRoom(38);
@@ -1929,7 +1929,7 @@ void DarkseedEngine::updateAnimation() {
 	case 28: // step out of mirror normal world
 		advanceAnimationFrame(1);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
 		} else {
 			_player->_position.x = 418;
 			_player->_position.y = 170;
@@ -1940,12 +1940,12 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 30:
 	case 31: {
-		int animIdx = otherNspAnimationType_maybe - 30;
+		int animIdx = _otherNspAnimationType_maybe - 30;
 		advanceAnimationFrame(animIdx);
-		if (isPlayingAnimation_maybe) {
-			_player->_frameIdx = _player->_animations.getAnimAt(animIdx).frameNo[animIndexTbl[animIdx]];
+		if (_isPlayingAnimation_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(animIdx)._frameNo[_animIndexTbl[animIdx]];
 		}
-		if (_ObjRestarted && otherNspAnimationType_maybe == 30) {
+		if (_ObjRestarted && _otherNspAnimationType_maybe == 30) {
 			setupOtherNspAnimation(1, 31);
 		}
 		break;
@@ -1954,21 +1954,21 @@ void DarkseedEngine::updateAnimation() {
 	case 33:
 	case 34: {
 		_objectVar[112] = 1;
-		int animIdx = otherNspAnimationType_maybe - 30;
+		int animIdx = _otherNspAnimationType_maybe - 30;
 		advanceAnimationFrame(animIdx);
 		// TODO play sfx.
-		if (isPlayingAnimation_maybe) {
-			_player->_frameIdx = _player->_animations.getAnimAt(animIdx).frameNo[animIndexTbl[animIdx]];
+		if (_isPlayingAnimation_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(animIdx)._frameNo[_animIndexTbl[animIdx]];
 		}
-		if (_ObjRestarted && (otherNspAnimationType_maybe == 32 || otherNspAnimationType_maybe == 33)) {
-			setupOtherNspAnimation(otherNspAnimationType_maybe - 29, otherNspAnimationType_maybe + 1);
+		if (_ObjRestarted && (_otherNspAnimationType_maybe == 32 || _otherNspAnimationType_maybe == 33)) {
+			setupOtherNspAnimation(_otherNspAnimationType_maybe - 29, _otherNspAnimationType_maybe + 1);
 		}
 		break;
 	}
 	case 35: // pay shopkeeper
 		advanceAnimationFrame(6);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(6).frameNo[animIndexTbl[6]];
+			_player->_frameIdx = _player->_animations.getAnimAt(6)._frameNo[_animIndexTbl[6]];
 		} else {
 			_objectVar[8]++;
 			if (_objectVar[8] > 2) {
@@ -1980,13 +1980,13 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 36:
 	case 37: // smash mirror
-		advanceAnimationFrame(otherNspAnimationType_maybe - 36);
-		_player->_frameIdx = _player->_animations.getAnimAt(otherNspAnimationType_maybe - 36).frameNo[animIndexTbl[otherNspAnimationType_maybe - 36]];
-		if (_FrameAdvanced && otherNspAnimationType_maybe == 36 && _player->_frameIdx == 4) {
+		advanceAnimationFrame(_otherNspAnimationType_maybe - 36);
+		_player->_frameIdx = _player->_animations.getAnimAt(_otherNspAnimationType_maybe - 36)._frameNo[_animIndexTbl[_otherNspAnimationType_maybe - 36]];
+		if (_FrameAdvanced && _otherNspAnimationType_maybe == 36 && _player->_frameIdx == 4) {
 			playSound(28, 5, -1);
 		}
 		if (_ObjRestarted) {
-			if (otherNspAnimationType_maybe == 36) {
+			if (_otherNspAnimationType_maybe == 36) {
 				setupOtherNspAnimation(1, 37);
 			} else {
 				_objectVar[137] = 2;
@@ -1998,7 +1998,7 @@ void DarkseedEngine::updateAnimation() {
 	case 38:
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			stuffPlayer();
 		}
@@ -2006,7 +2006,7 @@ void DarkseedEngine::updateAnimation() {
 	case 39: // Arrest Mike.
 		_room->advanceFrame(1);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _room->_locationSprites.getAnimAt(1).frameNo[_room->_locObjFrame[1]];
+			_player->_frameIdx = _room->_locationSprites.getAnimAt(1)._frameNo[_room->_locObjFrame[1]];
 		} else {
 			throwmikeinjail();
 		}
@@ -2014,7 +2014,7 @@ void DarkseedEngine::updateAnimation() {
 	case 40: // give Delbert's card to cop.
 		advanceAnimationFrame(1);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
 		} else {
 			_console->printTosText(61);
 			_console->draw();
@@ -2024,7 +2024,7 @@ void DarkseedEngine::updateAnimation() {
 			_player->_position.x = 240;
 			_player->_position.y = 200;
 			_player->updateSprite();
-			isPlayingAnimation_maybe = false;
+			_isPlayingAnimation_maybe = false;
 			changeToRoom(15, true);
 			_inventory.removeItem(41);
 			_inventory.removeItem(18);
@@ -2034,7 +2034,7 @@ void DarkseedEngine::updateAnimation() {
 	case 41:
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
 			changeToRoom(7);
@@ -2043,7 +2043,7 @@ void DarkseedEngine::updateAnimation() {
 	case 42: // step out of mirror giger world
 		advanceAnimationFrame(1);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]];
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
 		} else {
 			_player->_position.x = 456;
 			_player->_position.y = 173;
@@ -2057,14 +2057,14 @@ void DarkseedEngine::updateAnimation() {
 	case 45:
 	case 46: {
 		int iVar4 = 0;
-		if ((otherNspAnimationType_maybe == 44) || (otherNspAnimationType_maybe == 46)) {
+		if ((_otherNspAnimationType_maybe == 44) || (_otherNspAnimationType_maybe == 46)) {
 			iVar4 = 1;
 		}
 		advanceAnimationFrame(iVar4);
-		_player->_frameIdx = _player->_animations.getAnimAt(iVar4).frameNo[_player->_animations.getAnimAt(iVar4).frameNo[animIndexTbl[iVar4]]];
+		_player->_frameIdx = _player->_animations.getAnimAt(iVar4)._frameNo[_player->_animations.getAnimAt(iVar4)._frameNo[_animIndexTbl[iVar4]]];
 //		_HeroSpr = (uint) * (byte *)((int)&DAT_1060_7eb8 + *(int *)((int)&_ObjFrame + iVar4 * 2) + iVar4 * 202);
-		if (!_ObjRestarted || (otherNspAnimationType_maybe != 46 && otherNspAnimationType_maybe != 44)) {
-			if (otherNspAnimationType_maybe == 45) {
+		if (!_ObjRestarted || (_otherNspAnimationType_maybe != 46 && _otherNspAnimationType_maybe != 44)) {
+			if (_otherNspAnimationType_maybe == 45) {
 				_objectVar[117] = 1;
 			} else if (_ObjRestarted) {
 				if ((_objectVar[71] == 2) && (_objectVar[44] != 0)) {
@@ -2092,12 +2092,12 @@ void DarkseedEngine::updateAnimation() {
 		// open/close cupboards, oven
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
-			if (otherNspAnimationType_maybe == 52) {
+			if (_otherNspAnimationType_maybe == 52) {
 				_objectVar[108] = (_objectVar[108] == 0) ? 1 : 0;
 			} else {
-				_objectVar[56 + otherNspAnimationType_maybe] = _objectVar[56 + otherNspAnimationType_maybe] == 0 ? 1 : 0;
+				_objectVar[56 + _otherNspAnimationType_maybe] = _objectVar[56 + _otherNspAnimationType_maybe] == 0 ? 1 : 0;
 			}
 			playSound(42, 5, -1);
 		}
@@ -2106,11 +2106,11 @@ void DarkseedEngine::updateAnimation() {
 	case 54 :
 	case 55 :
 	case 56 :
-		advanceAnimationFrame((otherNspAnimationType_maybe - 53) & 1);
+		advanceAnimationFrame((_otherNspAnimationType_maybe - 53) & 1);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
-			switch (otherNspAnimationType_maybe) {
+			switch (_otherNspAnimationType_maybe) {
 			case 53 :
 				_previousRoomNumber = _room->_roomNumber;
 				changeToRoom(6);
@@ -2135,17 +2135,17 @@ void DarkseedEngine::updateAnimation() {
 				break;
 			}
 		}
-		if (_FrameAdvanced && animIndexTbl[0] == 1) {
+		if (_FrameAdvanced && _animIndexTbl[0] == 1) {
 			// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
 			// PlaySound(1,5,-1);
 		}
 		break;
 	case 57:
 	case 58:
-		advanceAnimationFrame((otherNspAnimationType_maybe - 57) & 1);
+		advanceAnimationFrame((_otherNspAnimationType_maybe - 57) & 1);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]; //_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
-		} else if (otherNspAnimationType_maybe == 57) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]; //_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		} else if (_otherNspAnimationType_maybe == 57) {
 			_previousRoomNumber = _room->_roomNumber;
 			changeToRoom(_room->_roomNumber == 41 ? 44 : 41);
 		} else {
@@ -2155,7 +2155,7 @@ void DarkseedEngine::updateAnimation() {
 	case 59: // use shard on mirror
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			_player->_direction = 1;
 			_player->updateSprite();
@@ -2167,25 +2167,25 @@ void DarkseedEngine::updateAnimation() {
 	case 60: // turn on alien computer
 		_room->advanceFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
+			_player->_frameIdx = _room->_locationSprites.getAnimAt(0)._frameNo[_room->_locObjFrame[0]];
 		} else {
-			isPlayingAnimation_maybe = false;
+			_isPlayingAnimation_maybe = false;
 			_objectVar[187] = 1;
 		}
 		break;
 	case 61: // turn off alien computer
 		_room->advanceFrame(1);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _room->_locationSprites.getAnimAt(1).frameNo[_room->_locObjFrame[1]];
+			_player->_frameIdx = _room->_locationSprites.getAnimAt(1)._frameNo[_room->_locObjFrame[1]];
 		} else {
-			isPlayingAnimation_maybe = false;
+			_isPlayingAnimation_maybe = false;
 		}
 		_objectVar[187] = 0;
 		break;
 	case 62: // bang cup against bars
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			bool bVar5 = _objectVar.getMoveObjectRoom(18) == 250;
 			if (!bVar5) {
@@ -2194,11 +2194,11 @@ void DarkseedEngine::updateAnimation() {
 				}
 			}
 			if (bVar5) {
-				isPlayingAnimation_maybe = false;
+				_isPlayingAnimation_maybe = false;
 				_objectVar.setObjectRunningCode(53, 1);
 				_player->loadAnimations("copcard.nsp");
-				animIndexTbl[0] = 0;
-				spriteAnimCountdownTimer[0] = 3;
+				_animIndexTbl[0] = 0;
+				_spriteAnimCountdownTimer[0] = 3;
 				_objectVar[1] = 2000;
 			} else {
 				_console->addTextLine("The cops ignore your demands for attention.");
@@ -2208,40 +2208,40 @@ void DarkseedEngine::updateAnimation() {
 	case 65:
 		advanceAnimationFrame(0);
 		if (!_ObjRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			_player->updateSprite();
 		}
 		break;
 	default:
-		error("Unhandled animation type! %d", otherNspAnimationType_maybe);
+		error("Unhandled animation type! %d", _otherNspAnimationType_maybe);
 	}
 }
 
 void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
 	if (!_scaleSequence) {
-		scaledWalkSpeed_maybe = 1000;
+		_scaledWalkSpeed_maybe = 1000;
 	} else {
 		_room->calculateScaledSpriteDimensions(10, 10, _player->_position.y);
 	}
 	_ObjRestarted = false;
 	_FrameAdvanced = false;
 	const Obt &anim = _player->_animations.getAnimAt(nspAminIdx);
-	spriteAnimCountdownTimer[nspAminIdx] = spriteAnimCountdownTimer[nspAminIdx] - 1;
-	if (spriteAnimCountdownTimer[nspAminIdx] < 1) {
+	_spriteAnimCountdownTimer[nspAminIdx] = _spriteAnimCountdownTimer[nspAminIdx] - 1;
+	if (_spriteAnimCountdownTimer[nspAminIdx] < 1) {
 		_FrameAdvanced = true;
-		animIndexTbl[nspAminIdx] = animIndexTbl[nspAminIdx] + 1;
-		_player->_position.x += ((int16)anim.deltaX[animIndexTbl[nspAminIdx]] * scaledWalkSpeed_maybe) / 1000;
-		_player->_position.y += ((int16)anim.deltaY[animIndexTbl[nspAminIdx]] * scaledWalkSpeed_maybe) / 1000;
-		if (animIndexTbl[nspAminIdx] == anim.numFrames) {
-			animIndexTbl[nspAminIdx] = 0;
+		_animIndexTbl[nspAminIdx] = _animIndexTbl[nspAminIdx] + 1;
+		_player->_position.x += ((int16)anim._deltaX[_animIndexTbl[nspAminIdx]] * _scaledWalkSpeed_maybe) / 1000;
+		_player->_position.y += ((int16)anim._deltaY[_animIndexTbl[nspAminIdx]] * _scaledWalkSpeed_maybe) / 1000;
+		if (_animIndexTbl[nspAminIdx] == anim._numFrames) {
+			_animIndexTbl[nspAminIdx] = 0;
 			_ObjRestarted = true;
-			isPlayingAnimation_maybe = false;
+			_isPlayingAnimation_maybe = false;
 			_player->_walkTarget.x = _player->_position.x;
 			_player->_walkTarget.y = _player->_position.y;
 			_player->updateSprite();
 		}
-		spriteAnimCountdownTimer[nspAminIdx] = anim.frameDuration[animIndexTbl[nspAminIdx]];
+		_spriteAnimCountdownTimer[nspAminIdx] = anim._frameDuration[_animIndexTbl[nspAminIdx]];
 	}
 }
 
@@ -2381,8 +2381,8 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 		}
 	} else {
 		_player->loadAnimations("pownex.nsp");
-		animIndexTbl[0] = 0;
-		spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0).frameDuration[0];
+		_animIndexTbl[0] = 0;
+		_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
 		_ObjRestarted = false;
 		int16 frameIdx = 0;
 		int16 prevFrameIdx = 0;
@@ -2397,9 +2397,9 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			_console->draw();
 
 			advanceAnimationFrame(0);
-			frameIdx = _player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]];
+			frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 			const Sprite &sprite = _player->_animations.getSpriteAt(frameIdx);
-			_sprites.addSpriteToDrawList(152, 89, &sprite, 255, sprite.width, sprite.height, false);
+			_sprites.addSpriteToDrawList(152, 89, &sprite, 255, sprite._width, sprite._height, false);
 			_room->draw();
 			_sprites.drawSprites();
 
@@ -2419,11 +2419,11 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 
 			advanceAnimationFrame(1);
 
-			const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(1).frameNo[animIndexTbl[1]]);
-			_sprites.addSpriteToDrawList(152, 129, &sprite, 255, sprite.width, sprite.height, false);
+			const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]);
+			_sprites.addSpriteToDrawList(152, 129, &sprite, 255, sprite._width, sprite._height, false);
 
 			const Sprite &mikeSprite = _player->_animations.getSpriteAt(prevFrameIdx);
-			_sprites.addSpriteToDrawList(152, 89, &mikeSprite, 255, mikeSprite.width, mikeSprite.height, false);
+			_sprites.addSpriteToDrawList(152, 89, &mikeSprite, 255, mikeSprite._width, mikeSprite._height, false);
 
 			_room->draw();
 			_sprites.drawSprites();
@@ -2744,30 +2744,30 @@ void DarkseedEngine::playSound(int16 unk, uint8 unk1, int16 unk2) {
 
 void DarkseedEngine::nextFrame(int nspAminIdx) {
 	_ObjRestarted = false;
-	spriteAnimCountdownTimer[nspAminIdx]--;
+	_spriteAnimCountdownTimer[nspAminIdx]--;
 	_FrameAdvanced = false;
-	if (spriteAnimCountdownTimer[nspAminIdx] < 1) {
+	if (_spriteAnimCountdownTimer[nspAminIdx] < 1) {
 		const Obt &anim = _player->_animations.getAnimAt(nspAminIdx);
-		animIndexTbl[nspAminIdx]++;
+		_animIndexTbl[nspAminIdx]++;
 		_FrameAdvanced = true;
-		if (animIndexTbl[nspAminIdx] == anim.numFrames) {
-			animIndexTbl[nspAminIdx] = 0;
+		if (_animIndexTbl[nspAminIdx] == anim._numFrames) {
+			_animIndexTbl[nspAminIdx] = 0;
 			_ObjRestarted = true;
 		}
-		spriteAnimCountdownTimer[nspAminIdx] = anim.frameDuration[animIndexTbl[nspAminIdx]];
+		_spriteAnimCountdownTimer[nspAminIdx] = anim._frameDuration[_animIndexTbl[nspAminIdx]];
 	}
 }
 
 void DarkseedEngine::updateHeadache() {
-	headAcheMessageCounter++;
-	headAcheMessageCounter &= 63;
-	if (headAcheMessageCounter == 0) {
-		headacheMessageIdx++;
-		if (headacheMessageIdx > 4) {
-			headacheMessageIdx = 0;
+	_headAcheMessageCounter++;
+	_headAcheMessageCounter &= 63;
+	if (_headAcheMessageCounter == 0) {
+		_headacheMessageIdx++;
+		if (_headacheMessageIdx > 4) {
+			_headacheMessageIdx = 0;
 		}
 		if (_objectVar[112] == 0 && !_sound->isPlayingSpeech()) {
-			_console->printTosText(headacheMessageIdx + 9);
+			_console->printTosText(_headacheMessageIdx + 9);
 		}
 	}
 }
@@ -2825,7 +2825,7 @@ void DarkseedEngine::closeShops() {
 void DarkseedEngine::initDelbertAtSide() {
 	_objectVar[141] = 12;
 	_objectVar.setMoveObjectX(141, 563);
-	if (!isPlayingAnimation_maybe || otherNspAnimationType_maybe != 26) {
+	if (!_isPlayingAnimation_maybe || _otherNspAnimationType_maybe != 26) {
 		_player->_heroMoving = false;
 		_player->_walkTarget = _player->_position;
 		_player->_actionToPerform = false;
@@ -2838,7 +2838,7 @@ void DarkseedEngine::throwmikeinjail() {
 		playSound(0, 6, -1);
 	}
 	_player->_position = {250, 200};
-	isPlayingAnimation_maybe = false;
+	_isPlayingAnimation_maybe = false;
 	_player->_frameIdx = 26;
 	changeToRoom(30);
 	_objectVar.setMoveObjectRoom(28, 255);
@@ -2885,25 +2885,25 @@ void DarkseedEngine::runObjects() {
 			_objectVar[141] = 9;
 			_room->_locObjFrame[0] = 0;
 			_room->_locObjFrameTimer[0] = 2;
-			delbertSpriteIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
+			delbertSpriteIdx = _room->_locationSprites.getAnimAt(0)._frameNo[_room->_locObjFrame[0]];
 		} else {
-			delbertSpriteIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
+			delbertSpriteIdx = _room->_locationSprites.getAnimAt(0)._frameNo[_room->_locObjFrame[0]];
 			if (delbertSpriteIdx != 9) {
 				_room->advanceFrame(0);
-				delbertSpriteIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
+				delbertSpriteIdx = _room->_locationSprites.getAnimAt(0)._frameNo[_room->_locObjFrame[0]];
 				delthrowstick(delbertSpriteIdx);
 			}
 			if (_objectVar[141] == 8) {
 				const Sprite &sprite = _room->_locationSprites.getSpriteAt(delbertSpriteIdx);
 				delthrowstick(delbertSpriteIdx);
-				g_engine->_sprites.addSpriteToDrawList(145, 140, &sprite, 240 - (sprite.height + 140), sprite.width, sprite.height, false);
+				g_engine->_sprites.addSpriteToDrawList(145, 140, &sprite, 240 - (sprite._height + 140), sprite._width, sprite._height, false);
 			}
 		}
 	}
 	if (_objectVar[141] == 9) {
 		// delbert drinks scotch
 		_room->advanceFrame(0);
-		delbertSpriteIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
+		delbertSpriteIdx = _room->_locationSprites.getAnimAt(0)._frameNo[_room->_locObjFrame[0]];
 		if (_FrameAdvanced && delbertSpriteIdx == 5) {
 			playSound(32, 5, -1);
 		}
@@ -2916,13 +2916,13 @@ void DarkseedEngine::runObjects() {
 		_objectVar.setMoveObjectPosition(141, delbertPos);
 		if (_objectVar[141] == 9) {
 			const Sprite &sprite = _room->_locationSprites.getSpriteAt(delbertSpriteIdx);
-			g_engine->_sprites.addSpriteToDrawList(125, 140, &sprite, 240 - (sprite.height + 140), sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(125, 140, &sprite, 240 - (sprite._height + 140), sprite._width, sprite._height, false);
 		}
 	}
 	if (_objectVar[141] == 10 && _room->_roomNumber == 31) {
 		// delbert walks off screen.
 		_room->advanceFrame(1);
-		delbertSpriteIdx = _room->_locationSprites.getAnimAt(1).frameNo[_room->_locObjFrame[1]];
+		delbertSpriteIdx = _room->_locationSprites.getAnimAt(1)._frameNo[_room->_locObjFrame[1]];
 		Common::Point delbertPos = _objectVar.getMoveObjectPosition(141);
 		if (_FrameAdvanced) {
 			delbertPos.x += 10;
@@ -2930,8 +2930,8 @@ void DarkseedEngine::runObjects() {
 		}
 		if (delbertPos.x < 560) {
 			const Sprite &sprite = _room->_locationSprites.getSpriteAt(delbertSpriteIdx);
-			g_engine->_sprites.addSpriteToDrawList(delbertPos.x, 140, &sprite, 240 - (sprite.height + 140), sprite.width, sprite.height, false);
-			_room->updateRoomObj(141, delbertPos.x, sprite.width, 140, sprite.height);
+			g_engine->_sprites.addSpriteToDrawList(delbertPos.x, 140, &sprite, 240 - (sprite._height + 140), sprite._width, sprite._height, false);
+			_room->updateRoomObj(141, delbertPos.x, sprite._width, 140, sprite._height);
 		} else {
 			_objectVar[141] = 11;
 			_room->removeObjectFromRoom(141);
@@ -2940,11 +2940,11 @@ void DarkseedEngine::runObjects() {
 	}
 	if (_objectVar[141] == 7 && _room->_roomNumber == 31) {
 		_room->advanceFrame(0);
-		delbertSpriteIdx = _room->_locationSprites.getAnimAt(0).frameNo[_room->_locObjFrame[0]];
+		delbertSpriteIdx = _room->_locationSprites.getAnimAt(0)._frameNo[_room->_locObjFrame[0]];
 		const Sprite &sprite = _room->_locationSprites.getSpriteAt(delbertSpriteIdx);
 		delthrowstick(delbertSpriteIdx);
-		g_engine->_sprites.addSpriteToDrawList(145, 140, &sprite, 240 - (sprite.height + 140), sprite.width, sprite.height, false);
-		_room->updateRoomObj(141, 145, sprite.width, 140, sprite.height);
+		g_engine->_sprites.addSpriteToDrawList(145, 140, &sprite, 240 - (sprite._height + 140), sprite._width, sprite._height, false);
+		_room->updateRoomObj(141, 145, sprite._width, 140, sprite._height);
 	}
 	if ((_objectVar[141] == 7 || _objectVar[141] == 8) && _room->_roomNumber == 31) {
 		if (delbertSpriteIdx > 7 && _objectVar[45] == 0) {
@@ -2976,10 +2976,10 @@ void DarkseedEngine::runObjects() {
 			}
 			if (stickPosition.x < 1000) {
 				const Sprite &stickSprite = _baseSprites.getSpriteAt(19);
-				g_engine->_sprites.addSpriteToDrawList(stickPosition.x, stickPosition.y, &stickSprite, 255, stickSprite.width, stickSprite.height, false);
+				g_engine->_sprites.addSpriteToDrawList(stickPosition.x, stickPosition.y, &stickSprite, 255, stickSprite._width, stickSprite._height, false);
 			}
 			Common::Point fidoPosition = _objectVar.getMoveObjectPosition(45);
-			int16 fidoSpriteIdx = _room->_locationSprites.getAnimAt(_objectVar[45] + 1).frameNo[_room->_locObjFrame[_objectVar[45] + 1]];
+			int16 fidoSpriteIdx = _room->_locationSprites.getAnimAt(_objectVar[45] + 1)._frameNo[_room->_locObjFrame[_objectVar[45] + 1]];
 			if (_FrameAdvanced) {
 				if (_objectVar[45] == 2) {
 					fidoPosition.x += 30;
@@ -3012,7 +3012,7 @@ void DarkseedEngine::runObjects() {
 					_objectVar[45] = 2;
 				}
 				const Sprite &fidoSprite = _room->_locationSprites.getSpriteAt(fidoSpriteIdx);
-				g_engine->_sprites.addSpriteToDrawList(fidoPosition.x, 173, &fidoSprite, 240 - (fidoSprite.height + 173), fidoSprite.width, fidoSprite.height, flipFidoSprite);
+				g_engine->_sprites.addSpriteToDrawList(fidoPosition.x, 173, &fidoSprite, 240 - (fidoSprite._height + 173), fidoSprite._width, fidoSprite._height, flipFidoSprite);
 			}
 		}
 	}
@@ -3052,11 +3052,11 @@ void DarkseedEngine::runObjects() {
 				_sound->waitForSpeech();
 			} else if (_delbertspeech == 65) {
 				setupOtherNspAnimation(3, 20);
-				spriteAnimCountdownTimer[1] = 3;
+				_spriteAnimCountdownTimer[1] = 3;
 				_delbertspeech = 72;
 			}
 		}
-		const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(_objectVar[141] - 1).frameNo[animIndexTbl[_objectVar[141] - 1]]);
+		const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(_objectVar[141] - 1)._frameNo[_animIndexTbl[_objectVar[141] - 1]]);
 		Common::Point delbertPosition = _objectVar.getMoveObjectPosition(141);
 		if (_FrameAdvanced) {
 			if (_objectVar[141] == 1) {
@@ -3072,9 +3072,9 @@ void DarkseedEngine::runObjects() {
 		if (_objectVar[141] == 2) {
 			spriteX += 23;
 		}
-		int spriteY = delbertPosition.y - sprite.height;
+		int spriteY = delbertPosition.y - sprite._height;
 		if (_objectVar[141] < 4) {
-			g_engine->_sprites.addSpriteToDrawList(spriteX, spriteY, &sprite, 240 - delbertPosition.y, sprite.width, sprite.height, _objectVar[141] == 3 ? true : false);
+			g_engine->_sprites.addSpriteToDrawList(spriteX, spriteY, &sprite, 240 - delbertPosition.y, sprite._width, sprite._height, _objectVar[141] == 3 ? true : false);
 		}
 	}
 	if (_room->_roomNumber == 32 && _currentDay == 2 && _currentTimeInSeconds > 64799 && (_objectVar[141] == 5 || _objectVar[141] == 6)) {
@@ -3087,19 +3087,19 @@ void DarkseedEngine::runObjects() {
 			}
 		}
 		Common::Point delbertPosition = _objectVar.getMoveObjectPosition(141);
-		const Sprite &sprite = _room->_locationSprites.getSpriteAt(_room->_locationSprites.getAnimAt(_objectVar[141] - 4).frameNo[_room->_locObjFrame[_objectVar[141] - 4]]);
+		const Sprite &sprite = _room->_locationSprites.getSpriteAt(_room->_locationSprites.getAnimAt(_objectVar[141] - 4)._frameNo[_room->_locObjFrame[_objectVar[141] - 4]]);
 		if (_FrameAdvanced && _objectVar[141] > 5) {
 			delbertPosition.x += 8;
 			_objectVar.setMoveObjectX(141, delbertPosition.x);
 		}
 		if (_objectVar[141] != 7) {
-			g_engine->_sprites.addSpriteToDrawList(delbertPosition.x, 135, &sprite, 240 - (sprite.height + 132), sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(delbertPosition.x, 135, &sprite, 240 - (sprite._height + 132), sprite._width, sprite._height, false);
 		}
 	}
 	if (_room->_roomNumber == 32 && _currentDay == 2 && _currentTimeInSeconds > 64799 && _objectVar[141] == 4) {
 		_objectVar.setMoveObjectX(141, 395);
 		const Sprite &sprite = _room->_locationSprites.getSpriteAt(0);
-		g_engine->_sprites.addSpriteToDrawList(395, 132, &sprite, 240 - (sprite.height + 132), sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(395, 132, &sprite, 240 - (sprite._height + 132), sprite._width, sprite._height, false);
 		moveplayertodelbert();
 		if (!_player->_playerIsChangingDirection && !_player->_heroMoving) {
 			_console->printTosText(909);
@@ -3113,10 +3113,10 @@ void DarkseedEngine::runObjects() {
 			delbertPosition.x -= 8;
 			_objectVar.setMoveObjectX(141, delbertPosition.x);
 		}
-		const Sprite &sprite = _room->_locationSprites.getSpriteAt(_room->_locationSprites.getAnimAt(2).frameNo[_room->_locObjFrame[2]]);
-		g_engine->_sprites.addSpriteToDrawList(delbertPosition.x, 135, &sprite, 240 - (sprite.height + 135), sprite.width, sprite.height, true);
+		const Sprite &sprite = _room->_locationSprites.getSpriteAt(_room->_locationSprites.getAnimAt(2)._frameNo[_room->_locObjFrame[2]]);
+		g_engine->_sprites.addSpriteToDrawList(delbertPosition.x, 135, &sprite, 240 - (sprite._height + 135), sprite._width, sprite._height, true);
 		if (delbertPosition.x < 396) {
-			_room->_locObjFrameTimer[2] = _room->_locationSprites.getAnimAt(2).frameDuration[_room->_locObjFrame[2]];
+			_room->_locObjFrameTimer[2] = _room->_locationSprites.getAnimAt(2)._frameDuration[_room->_locObjFrame[2]];
 			_room->_locObjFrame[2] = 0;
 			_objectVar[141] = 4;
 		}
@@ -3129,21 +3129,21 @@ void DarkseedEngine::runObjects() {
 	}
 	// jail sargent
 	if (_room->_roomNumber == 30 && (_objectVar.getObjectRunningCode(53) == 1 || _objectVar.getObjectRunningCode(53) == 2)
-			  && (otherNspAnimationType_maybe != 40 || !isPlayingAnimation_maybe)) {
+			  && (_otherNspAnimationType_maybe != 40 || !_isPlayingAnimation_maybe)) {
 		if (_objectVar.getObjectRunningCode(53) == 1) {
-			int oldFrame = animIndexTbl[0];
+			int oldFrame = _animIndexTbl[0];
 			nextFrame(0);
 			if (_ObjRestarted) {
 				_objectVar.setObjectRunningCode(53, 2);
-				animIndexTbl[0] = oldFrame;
+				_animIndexTbl[0] = oldFrame;
 			}
 		}
 		_room->removeObjectFromRoom(189);
-		const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]);
-		g_engine->_sprites.addSpriteToDrawList(463, 99, &sprite, 255, sprite.width, sprite.height, false);
+		const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]);
+		g_engine->_sprites.addSpriteToDrawList(463, 99, &sprite, 255, sprite._width, sprite._height, false);
 		_room->updateRoomObj(64, 467, 200, 99, 200);
 	}
-	if ((((!isPlayingAnimation_maybe || otherNspAnimationType_maybe != 39) && _room->_roomNumber == 10) &&
+	if ((((!_isPlayingAnimation_maybe || _otherNspAnimationType_maybe != 39) && _room->_roomNumber == 10) &&
 		 _objectVar.getObjectRunningCode(72) != 0) &&
 		((_currentDay == 3 && _currentTimeInSeconds > 39600 && _objectVar[57] == 0) ||
 		  _objectVar[88] != 0)) {
@@ -3151,19 +3151,19 @@ void DarkseedEngine::runObjects() {
 			setupOtherNspAnimation(1, 39); // arrest mike.
 		} else {
 			const Sprite &sprite = _room->_locationSprites.getSpriteAt(4);
-			_room->calculateScaledSpriteDimensions(sprite.width, sprite.height, 224);
-			g_engine->_sprites.addSpriteToDrawList(348 - scaledSpriteWidth, 224 - scaledSpriteHeight, &sprite, 224, scaledSpriteWidth, scaledSpriteHeight, false);
+			_room->calculateScaledSpriteDimensions(sprite._width, sprite._height, 224);
+			g_engine->_sprites.addSpriteToDrawList(348 - _scaledSpriteWidth, 224 - _scaledSpriteHeight, &sprite, 224, _scaledSpriteWidth, _scaledSpriteHeight, false);
 			if (_player->_heroMoving && _player->_playerIsChangingDirection == 0 && _player->_direction != 1 &&
 				(_player->_position.x < 368 || _player->_position.y < 200) &&
-				   (!isPlayingAnimation_maybe || otherNspAnimationType_maybe == 53) && _player->_walkTarget.x != 322 &&
+				   (!_isPlayingAnimation_maybe || _otherNspAnimationType_maybe == 53) && _player->_walkTarget.x != 322 &&
 				  _player->_walkTarget.y != 226) {
 				_player->_heroMoving = false;
 			}
 			if (_player->_position.x < 369 && !_player->_heroMoving &&
-				 (!isPlayingAnimation_maybe || otherNspAnimationType_maybe == 53) &&
+				 (!_isPlayingAnimation_maybe || _otherNspAnimationType_maybe == 53) &&
 				(_player->_position.x != 322 || _player->_position.y != 226)) {
-				if (isPlayingAnimation_maybe && otherNspAnimationType_maybe == 53) {
-					isPlayingAnimation_maybe = false;
+				if (_isPlayingAnimation_maybe && _otherNspAnimationType_maybe == 53) {
+					_isPlayingAnimation_maybe = false;
 				}
 				if (!_player->_heroMoving) {
 					Common::Point oldCursor = g_engine->_cursor.getPosition();
@@ -3256,7 +3256,7 @@ void DarkseedEngine::runObjects() {
 }
 
 void DarkseedEngine::moveplayertodelbert() {
-	if (_room->_roomNumber == 32 && !isPlayingAnimation_maybe) {
+	if (_room->_roomNumber == 32 && !_isPlayingAnimation_maybe) {
 		_player->_herowaiting = true;
 		if (!_player->_heroMoving && _player->_position.x != 364 && _player->_position.y != 198) {
 			Common::Point oldCursor = g_engine->_cursor.getPosition();
@@ -3338,7 +3338,7 @@ void DarkseedEngine::libanim(bool pickingUpReservedBook) {
 
 	_console->printTosText(pickingUpReservedBook ? 928 : 924);
 
-	spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0).frameDuration[0];
+	_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
 	uint8 lipsIdx = 0;
 	while (_sound->isPlayingSpeech()) {
 		_sprites.clearSpriteDrawList();
@@ -3349,12 +3349,12 @@ void DarkseedEngine::libanim(bool pickingUpReservedBook) {
 		_console->draw();
 
 		advanceAnimationFrame(0);
-		const Sprite &eyesSprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]);
-		g_engine->_sprites.addSpriteToDrawList(255, 114, &eyesSprite, 255, eyesSprite.width, eyesSprite.height, false);
+		const Sprite &eyesSprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]);
+		g_engine->_sprites.addSpriteToDrawList(255, 114, &eyesSprite, 255, eyesSprite._width, eyesSprite._height, false);
 		advanceAnimationFrame(1);
 
 		const Sprite &mouthSprite = _player->_animations.getSpriteAt(libList[lipsIdx]);
-		g_engine->_sprites.addSpriteToDrawList(255, 154, &mouthSprite, 255, mouthSprite.width, mouthSprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(255, 154, &mouthSprite, 255, mouthSprite._width, mouthSprite._height, false);
 
 		_sprites.drawSprites();
 
@@ -3411,8 +3411,8 @@ static constexpr uint8 dcopList[100] = {
 void DarkseedEngine::dcopanim() {
 	_player->loadAnimations("dcopb.nsp");
 	showFullscreenPic("dcopb.pic");
-	animIndexTbl[0] = 0;
-	spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0).frameDuration[0];
+	_animIndexTbl[0] = 0;
+	_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
 
 	_sprites.clearSpriteDrawList();
 	_console->printTosText(923);
@@ -3426,7 +3426,7 @@ void DarkseedEngine::dcopanim() {
 		}
 		advanceAnimationFrame(0);
 		const Sprite &dcopSprite = _player->_animations.getSpriteAt(dcopList[lipsIdx]);
-		g_engine->_sprites.addSpriteToDrawList(310, 180, &dcopSprite, 255, dcopSprite.width, dcopSprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(310, 180, &dcopSprite, 255, dcopSprite._width, dcopSprite._height, false);
 		_sprites.drawSprites();
 
 		_console->draw();
@@ -3515,8 +3515,8 @@ void DarkseedEngine::keeperanim() {
 	_cursor.showCursor(false);
 	_player->loadAnimations("keeper.nsp");
 	showFullscreenPic("keeper.pic");
-	animIndexTbl[0] = 0;
-	spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0).frameDuration[0];
+	_animIndexTbl[0] = 0;
+	_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
 
 	_console->printTosText(913);
 
@@ -3530,7 +3530,7 @@ void DarkseedEngine::keeperanim() {
 		}
 		advanceAnimationFrame(0);
 		const Sprite &keeperSprite = _player->_animations.getSpriteAt(keeperList[lipsIdx]);
-		g_engine->_sprites.addSpriteToDrawList(254, 117, &keeperSprite, 255, keeperSprite.width, keeperSprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(254, 117, &keeperSprite, 255, keeperSprite._width, keeperSprite._height, false);
 		_sprites.drawSprites();
 
 		_console->draw();
@@ -3571,8 +3571,8 @@ void DarkseedEngine::stuffPlayer() {
 			_fullscreenPic->draw(0x45, 0x28);
 		}
 		const Sprite &mikeSprite = _player->_animations.getSpriteAt(counter);
-		g_engine->_sprites.addSpriteToDrawList(103, 93, &mikeSprite, 255, mikeSprite.width, mikeSprite.height, false);
-		g_engine->_sprites.addSpriteToDrawList(226, 100, &alienSprite, 255, alienSprite.width, alienSprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(103, 93, &mikeSprite, 255, mikeSprite._width, mikeSprite._height, false);
+		g_engine->_sprites.addSpriteToDrawList(226, 100, &alienSprite, 255, alienSprite._width, alienSprite._height, false);
 
 		_sprites.drawSprites();
 
@@ -3625,8 +3625,8 @@ void DarkseedEngine::sargoanim() {
 	_cursor.showCursor(false);
 	_player->loadAnimations("sargo.nsp");
 	showFullscreenPic("sargo.pic");
-	animIndexTbl[0] = 0;
-	spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0).frameDuration[0];
+	_animIndexTbl[0] = 0;
+	_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
 
 	_console->printTosText(916);
 
@@ -3640,7 +3640,7 @@ void DarkseedEngine::sargoanim() {
 		}
 		advanceAnimationFrame(0);
 		const Sprite &sargoSprite = _player->_animations.getSpriteAt(sargoList[lipsIdx]);
-		g_engine->_sprites.addSpriteToDrawList(334, 160, &sargoSprite, 255, sargoSprite.width, sargoSprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(334, 160, &sargoSprite, 255, sargoSprite._width, sargoSprite._height, false);
 		_sprites.drawSprites();
 
 		_console->draw();
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index cc95663338e..cb9487e3f6d 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -113,37 +113,36 @@ public:
 	int _fttime = 0;
 
 	uint8 _previousRoomNumber = 0;
-	uint16 targetRoomNumber = 0;
+	uint16 _targetRoomNumber = 0;
 
-	bool isPlayingAnimation_maybe = false;
-	uint16 otherNspAnimationType_maybe = 0;
-	uint16 headAcheMessageCounter = 0;
-	uint8 headacheMessageIdx = 0;
+	bool _isPlayingAnimation_maybe = false;
+	uint16 _otherNspAnimationType_maybe = 0;
+	uint16 _headAcheMessageCounter = 0;
+	uint8 _headacheMessageIdx = 0;
 
-	int sprite_y_scaling_threshold_maybe = 0xf0;
-	int scaledWalkSpeed_maybe = 0;
-	uint16 scaledSpriteWidth = 0;
-	uint16 scaledSpriteHeight = 0;
+	int _sprite_y_scaling_threshold_maybe = 0xf0;
+	int _scaledWalkSpeed_maybe = 0;
+	uint16 _scaledSpriteWidth = 0;
+	uint16 _scaledSpriteHeight = 0;
 
-	int nsp_sprite_scaling_y_position = 0;
+	int _nsp_sprite_scaling_y_position = 0;
 
-	bool player_sprite_related_2c85_82f3 = false;
+	bool _player_sprite_related_2c85_82f3 = false;
 	int _frameBottom = 0;
 	bool _ObjRestarted = false;
-	char prefsCutsceneId = 'I';
-	int animIndexTbl[30];
-	int spriteAnimCountdownTimer[30];
+	int _animIndexTbl[30];
+	int _spriteAnimCountdownTimer[30];
 
 	// Unknown variables
 	bool _doorEnabled = false;
 	bool _scaleSequence = false;
-	bool useDoorTarget = false;
+	bool _useDoorTarget = false;
 
-	int16 counter_2c85_888b = 0;
+	int16 _counter_2c85_888b = 0;
 
-	uint8 targetPlayerDirection = 0; // related to changing rooms.
+	uint8 _targetPlayerDirection = 0; // related to changing rooms.
 
-	uint8 systemTimerCounter = 0;
+	uint8 _systemTimerCounter = 0;
 
 	bool _debugShowWalkPath = false;
 	int _phoneStatus = 0;
@@ -182,11 +181,11 @@ public:
 	};
 
 	bool canLoadGameStateCurrently(Common::U32String *msg) override {
-		return !isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting;
+		return !_isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting;
 	}
 
 	bool canSaveGameStateCurrently(Common::U32String *msg) override {
-		return !isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting;
+		return !_isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting;
 	}
 
 	/**
diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
index 308a8d4f0fd..cdef24c0911 100644
--- a/engines/darkseed/debugconsole.cpp
+++ b/engines/darkseed/debugconsole.cpp
@@ -24,7 +24,7 @@
 
 namespace Darkseed {
 
-DebugConsole::DebugConsole(TosText *tosText) : GUI::Debugger(), tosText(tosText) {
+DebugConsole::DebugConsole(TosText *tosText) : GUI::Debugger(), _tosText(tosText) {
 	registerCmd("tostext",   WRAP_METHOD(DebugConsole, Cmd_tostext));
 	registerCmd("dt",   WRAP_METHOD(DebugConsole, Cmd_dt));
 	registerCmd("getvar",   WRAP_METHOD(DebugConsole, Cmd_getvar));
@@ -47,8 +47,8 @@ bool DebugConsole::Cmd_tostext(int argc, const char **argv) {
 	}
 
 	uint16 textIdx = atoi(argv[1]);
-	if (textIdx < tosText->getNumEntries()) {
-		debugPrintf("%s\n", tosText->getText(textIdx).c_str());
+	if (textIdx < _tosText->getNumEntries()) {
+		debugPrintf("%s\n", _tosText->getText(textIdx).c_str());
 	} else {
 		debugPrintf("index too large!\n");
 	}
diff --git a/engines/darkseed/debugconsole.h b/engines/darkseed/debugconsole.h
index 514100ea847..23e0b4a6cef 100644
--- a/engines/darkseed/debugconsole.h
+++ b/engines/darkseed/debugconsole.h
@@ -30,7 +30,7 @@ namespace Darkseed {
 
 class DebugConsole : public GUI::Debugger {
 private:
-	TosText *tosText;
+	TosText *_tosText;
 private:
 	bool Cmd_tostext(int argc, const char **argv);
 	bool Cmd_dt(int argc, const char **argv);
diff --git a/engines/darkseed/gamefont.cpp b/engines/darkseed/gamefont.cpp
index 2c270ded91e..de1c8cf4a6a 100644
--- a/engines/darkseed/gamefont.cpp
+++ b/engines/darkseed/gamefont.cpp
@@ -29,7 +29,7 @@ Darkseed::GameFont::GameFont() {
 }
 
 bool GameFont::load() {
-	return letters.load("tosfont.nsp");
+	return _letters.load("tosfont.nsp");
 }
 
 void GameFont::displayString(uint16 x, uint16 y, const Common::String &text) {
@@ -37,7 +37,7 @@ void GameFont::displayString(uint16 x, uint16 y, const Common::String &text) {
 		auto letter = getCharacterSprite(text[i]);
 		if (letter) {
 			letter->draw(x, y);
-			x += letter->width + 1;
+			x += letter->_width + 1;
 		}
 	}
 }
@@ -47,7 +47,7 @@ int GameFont::stringLength(const Common::String &text) {
 	for (unsigned int i = 0; i < text.size(); i++) {
 		const Sprite *sprite = getCharacterSprite(text[i]);
 		if (sprite) {
-			width += sprite->width + 1;
+			width += sprite->_width + 1;
 		}
 	}
 	return width;
@@ -113,7 +113,7 @@ const Sprite *GameFont::getCharacterSprite(char c) {
 	}
 
 	if (letterIdx != 1000) {
-		return &letters.getSpriteAt(letterIdx);
+		return &_letters.getSpriteAt(letterIdx);
 	}
 
 	return nullptr;
diff --git a/engines/darkseed/gamefont.h b/engines/darkseed/gamefont.h
index 18bd9af8f66..62f4370e64b 100644
--- a/engines/darkseed/gamefont.h
+++ b/engines/darkseed/gamefont.h
@@ -27,7 +27,7 @@ namespace Darkseed {
 
 class GameFont {
 private:
-	Nsp letters;
+	Nsp _letters;
 
 public:
 	GameFont();
diff --git a/engines/darkseed/img.cpp b/engines/darkseed/img.cpp
index 13957027f57..f00c1a1aae9 100644
--- a/engines/darkseed/img.cpp
+++ b/engines/darkseed/img.cpp
@@ -34,7 +34,7 @@ bool Img::load(const Common::Path &filename) {
 	bool ret = load(file);
 	file.close();
 	if (ret) {
-		debug("Loaded %s (%d,%d) (%d,%d) %x", filename.toString().c_str(), x, y, width, height, mode);
+		debug("Loaded %s (%d,%d) (%d,%d) %x", filename.toString().c_str(), _x, _y, _width, _height, _mode);
 	}
 	return ret;
 }
@@ -42,8 +42,8 @@ bool Img::load(const Common::Path &filename) {
 bool Img::load(Common::SeekableReadStream &readStream) {
 	Common::Array<uint8> unpackedData;
 	unpackRLE(readStream, unpackedData);
-	x = READ_UINT16(&unpackedData.data()[0]);
-	y = READ_UINT16(&unpackedData.data()[2]);
+	_x = READ_UINT16(&unpackedData.data()[0]);
+	_y = READ_UINT16(&unpackedData.data()[2]);
 	unpackPlanarData(unpackedData, 4);
 	return true;
 }
@@ -51,8 +51,8 @@ bool Img::load(Common::SeekableReadStream &readStream) {
 bool Img::loadWithoutPosition(Common::SeekableReadStream &readStream) {
 	Common::Array<uint8> unpackedData;
 	unpackRLE(readStream, unpackedData);
-	x = 0;
-	y = 0;
+	_x = 0;
+	_y = 0;
 	unpackPlanarData(unpackedData, 0);
 	return false;
 }
@@ -86,36 +86,36 @@ bool Img::unpackRLE(Common::SeekableReadStream &readStream, Common::Array<byte>
 }
 
 void Img::unpackPlanarData(Common::Array<uint8> &planarData, uint16 headerOffset) {
-	height = READ_UINT16(&planarData.data()[headerOffset]);
-	width = READ_UINT16(&planarData.data()[headerOffset + 2]) * 8;
-	mode = planarData.data()[headerOffset + 4];
+	_height = READ_UINT16(&planarData.data()[headerOffset]);
+	_width = READ_UINT16(&planarData.data()[headerOffset + 2]) * 8;
+	_mode = planarData.data()[headerOffset + 4];
 //	assert(mode == 0xff);
-	pixels.resize(width * height, 0);
-	for (int py = 0; py < height; py++) {
+	_pixels.resize(_width * _height, 0);
+	for (int py = 0; py < _height; py++) {
 		for (int plane = 0; plane < 4; plane++) {
-			for (int px = 0; px < width; px++) {
+			for (int px = 0; px < _width; px++) {
 				int bitPos = (7 - (px % 8));
-				int planeBit = (planarData[(headerOffset + 5) + (px / 8) + (width / 8) * plane + py * (width / 8) * 4] & (1 << bitPos)) >> bitPos;
-				pixels[px + py * width] |= planeBit << (3 - plane);
+				int planeBit = (planarData[(headerOffset + 5) + (px / 8) + (_width / 8) * plane + py * (_width / 8) * 4] & (1 << bitPos)) >> bitPos;
+				_pixels[px + py * _width] |= planeBit << (3 - plane);
 			}
 		}
 	}
 }
 
 Common::Array<uint8> &Img::getPixels() {
-	return pixels;
+	return _pixels;
 }
 
 void Img::draw(int drawMode) {
-	drawAt(x, y, drawMode);
+	drawAt(_x, _y, drawMode);
 }
 
 void Img::drawAt(uint16 xPos, uint16 yPos, int drawMode, int drawWidth) {
 	if (drawMode != 0) {
 		uint8 *screen = (uint8 *)g_engine->_screen->getBasePtr(xPos, yPos);
-		uint8 *imgPixels = pixels.data();
-		for (int sy = 0; sy < height; sy++) {
-			int w = drawWidth != 0 ? drawWidth : width;
+		uint8 *imgPixels = _pixels.data();
+		for (int sy = 0; sy < _height; sy++) {
+			int w = drawWidth != 0 ? drawWidth : _width;
 			for (int sx = 0; sx < w; sx++) {
 				if (drawMode == 1 && imgPixels[sx] != 0) {
 					screen[sx] ^= imgPixels[sx];
@@ -125,13 +125,13 @@ void Img::drawAt(uint16 xPos, uint16 yPos, int drawMode, int drawWidth) {
 					screen[sx] |= imgPixels[sx];
 				}
 			}
-			imgPixels += width;
+			imgPixels += _width;
 			screen += g_engine->_screen->pitch;
 		}
 	} else {
-		g_engine->_screen->copyRectToSurface(pixels.data(), width, xPos, yPos, width, height);
+		g_engine->_screen->copyRectToSurface(_pixels.data(), _width, xPos, yPos, _width, _height);
 	}
-	g_engine->_screen->addDirtyRect({{(int16)xPos, (int16)yPos}, (int16)width, (int16)height});
+	g_engine->_screen->addDirtyRect({{(int16)xPos, (int16)yPos}, (int16)_width, (int16)_height});
 }
 
 } // namespace Darkseed
diff --git a/engines/darkseed/img.h b/engines/darkseed/img.h
index 4de6b68acf4..2545f58d07d 100644
--- a/engines/darkseed/img.h
+++ b/engines/darkseed/img.h
@@ -30,12 +30,12 @@ namespace Darkseed {
 
 class Img {
 private:
-	uint16 x;
-	uint16 y;
-	uint16 width;
-	uint16 height;
-	byte mode;
-	Common::Array<uint8> pixels;
+	uint16 _x;
+	uint16 _y;
+	uint16 _width;
+	uint16 _height;
+	byte _mode;
+	Common::Array<uint8> _pixels;
 public:
 	bool load(const Common::Path &filename);
 	bool load(Common::SeekableReadStream &readStream);
@@ -45,16 +45,16 @@ public:
 
 	Common::Array<uint8> &getPixels();
 	uint16 getX() const {
-		return x;
+		return _x;
 	}
 	uint16 getY() const {
-		return y;
+		return _y;
 	}
 	uint16 getWidth() const {
-		return width;
+		return _width;
 	}
 	uint16 getHeight() const {
-		return height;
+		return _height;
 	}
 
 private:
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 64e01f66d21..d883577adc2 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -86,7 +86,7 @@ void Darkseed::Inventory::update() {
 		}
 	}
 	_numIcons = MIN(_inventoryLength + 1, 9);
-	redraw = true;
+	_redraw = true;
 }
 
 void Darkseed::Inventory::restoreFrame() {
@@ -95,20 +95,20 @@ void Darkseed::Inventory::restoreFrame() {
 }
 
 void Darkseed::Inventory::draw() {
-	if ((g_engine->_actionMode <= 4 && g_engine->_cursor.getY() > 40) || g_engine->isPlayingAnimation_maybe || (g_engine->_objectVar[141] >= 1 && g_engine->_objectVar[141] <= 3)) {
-		if (isVisible) {
+	if ((g_engine->_actionMode <= 4 && g_engine->_cursor.getY() > 40) || g_engine->_isPlayingAnimation_maybe || (g_engine->_objectVar[141] >= 1 && g_engine->_objectVar[141] <= 3)) {
+		if (_isVisible) {
 			restoreFrame();
-			isVisible = false;
+			_isVisible = false;
 		}
 		return;
 	}
 
-	if (redraw) {
+	if (_redraw) {
 		restoreFrame();
-		redraw = false;
+		_redraw = false;
 	}
 
-	isVisible = true;
+	_isVisible = true;
 	for (int i = 0; i < _numIcons; i++) {
 		int icon = _iconList[i];
 		if (icon != 42 && icon != 43) {
@@ -117,10 +117,10 @@ void Darkseed::Inventory::draw() {
 
 		if (g_engine->_actionMode == _iconList[i] && g_engine->_actionMode > 4) {
 			const Sprite &selectedSprite = g_engine->_baseSprites.getSpriteAt(95);
-			g_engine->_sprites.addSpriteToDrawList(139 + i * 37, 20 - selectedSprite.height / 2, &selectedSprite, 255, selectedSprite.width, selectedSprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(139 + i * 37, 20 - selectedSprite._height / 2, &selectedSprite, 255, selectedSprite._width, selectedSprite._height, false);
 		}
 		const Sprite &iconSprite = g_engine->_baseSprites.getSpriteAt(icon);
-		g_engine->_sprites.addSpriteToDrawList(140 + i * 37, 20 - iconSprite.height / 2, &iconSprite, 255, iconSprite.width, iconSprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(140 + i * 37, 20 - iconSprite._height / 2, &iconSprite, 255, iconSprite._width, iconSprite._height, false);
 	}
 	g_engine->_screen->addDirtyRect(drawArea);
 }
diff --git a/engines/darkseed/inventory.h b/engines/darkseed/inventory.h
index f6a9ae4171d..77c9614203b 100644
--- a/engines/darkseed/inventory.h
+++ b/engines/darkseed/inventory.h
@@ -32,8 +32,8 @@ private:
 	Common::Array<uint8> _iconList;
 	int _viewOffset = 0;
 	int _numIcons = 0;
-	bool isVisible = false;
-	bool redraw = false;
+	bool _isVisible = false;
+	bool _redraw = false;
 
 public:
 	Inventory();
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index fafc632e4b6..0e7ae918fb7 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -23,18 +23,18 @@
 #include "darkseed/nsp.h"
 #include "common/debug.h"
 
-Darkseed::Sprite::Sprite(uint16 width, uint16 height, uint16 pitch) : width(width), height(height), pitch(pitch) {
-	pixels.resize(pitch * height, 0);
+Darkseed::Sprite::Sprite(uint16 width, uint16 height, uint16 pitch) : _width(width), _height(height), _pitch(pitch) {
+	_pixels.resize(pitch * height, 0);
 }
 
 bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
-	if (width == 1 && height == 1) {
+	if (_width == 1 && _height == 1) {
 		byte b = readStream.readByte();
-		pixels[0] = b >> 4;
+		_pixels[0] = b >> 4;
 	} else {
 		bool hasReadByte = false;
 		int currentDataByte = 0;
-		for (int i = 0; i < pitch * height; i++) {
+		for (int i = 0; i < _pitch * _height; i++) {
 			if (!hasReadByte) {
 				currentDataByte = readStream.readByte();
 				if (readStream.eos()) {
@@ -42,10 +42,10 @@ bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
 					return false;
 				}
 				hasReadByte = true;
-				pixels[i] = currentDataByte >> 4;
+				_pixels[i] = currentDataByte >> 4;
 			} else {
 				hasReadByte = false;
-				pixels[i] =  currentDataByte & 0xf;
+				_pixels[i] =  currentDataByte & 0xf;
 			}
 		}
 	}
@@ -53,18 +53,18 @@ bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
 }
 
 void Darkseed::Sprite::draw(int x, int y, uint16 frameBottom) const {
-	uint16 clippedWidth = width;
-	uint16 clippedHeight = height;
-	if (x + width > g_engine->_screen->w) {
+	uint16 clippedWidth = _width;
+	uint16 clippedHeight = _height;
+	if (x + _width > g_engine->_screen->w) {
 		clippedWidth = g_engine->_screen->w - x;
 	}
-	if (frameBottom != 0 && y + height > g_engine->_frameBottom) {
+	if (frameBottom != 0 && y + _height > g_engine->_frameBottom) {
 		if (y >= frameBottom) {
 			return;
 		}
 		clippedHeight = frameBottom - y;
 	}
-	g_engine->_screen->copyRectToSurfaceWithKey(pixels.data(), pitch, x, y, clippedWidth, clippedHeight, 0xf);
+	g_engine->_screen->copyRectToSurfaceWithKey(_pixels.data(), _pitch, x, y, clippedWidth, clippedHeight, 0xf);
 }
 
 void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destHeight, bool flipX) const {
@@ -75,9 +75,9 @@ void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destH
 	if (destWidth == 0 || destHeight == 0) {
 		return;
 	}
-	const byte *source = pixels.data();
-	const int xs = ((width - 1) << 16) / destWidth;
-	const int ys = ((height - 1) << 16) / destHeight;
+	const byte *source = _pixels.data();
+	const int xs = ((_width - 1) << 16) / destWidth;
+	const int ys = ((_height - 1) << 16) / destHeight;
 	int clipX = 0, clipY = 0;
 	const int destPitch = destSurface->pitch;
 	if (destX < 0) {
@@ -98,7 +98,7 @@ void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destH
 		return;
 	byte *dst = (byte *)destSurface->getBasePtr(destX, destY);
 	int yi = ys * clipY;
-	const byte *hsrc = source + pitch * ((yi + 0x8000) >> 16);
+	const byte *hsrc = source + _pitch * ((yi + 0x8000) >> 16);
 	int16 currY = destY;
 	for (int yc = 0; yc < destHeight && currY < g_engine->_frameBottom; ++yc) {
 		byte *wdst = flipX ? dst + (destWidth - 1) : dst;
@@ -127,7 +127,7 @@ void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destH
 		}
 		dst += destPitch;
 		yi += ys;
-		hsrc = source + pitch * ((yi + 0x8000) >> 16);
+		hsrc = source + _pitch * ((yi + 0x8000) >> 16);
 		currY++;
 	}
 }
@@ -150,16 +150,16 @@ bool Darkseed::Nsp::load(const Common::Path &filename) {
 }
 
 bool Darkseed::Nsp::load(Common::SeekableReadStream &readStream) {
-	frames.clear();
+	_frames.clear();
 	for (int i = 0; i < 96; i++) {
 		int w = readStream.readByte();
 		int h = readStream.readByte();
 		int p = w + (w & 1);
-		frames.push_back(Sprite(w, h, p));
+		_frames.push_back(Sprite(w, h, p));
 	}
 
 	for (int i = 0; i < 96; i++) {
-		if (!frames[i].loadData(readStream)) {
+		if (!_frames[i].loadData(readStream)) {
 			return false;
 		}
 	}
@@ -168,10 +168,10 @@ bool Darkseed::Nsp::load(Common::SeekableReadStream &readStream) {
 }
 
 const Darkseed::Sprite &Darkseed::Nsp::getSpriteAt(int index) {
-	if (index >= (int) frames.size()) {
+	if (index >= (int)_frames.size()) {
 		error("getSpriteAt: Invalid sprite index. %d", index);
 	}
-	return frames[index];
+	return _frames[index];
 }
 
 bool Darkseed::Nsp::loadObt(const Common::Path &filename) {
@@ -180,24 +180,24 @@ bool Darkseed::Nsp::loadObt(const Common::Path &filename) {
 		return false;
 	}
 
-	animations.clear();
-	animations.resize(20);
+	_animations.clear();
+	_animations.resize(20);
 	for (int i = 0; i < 20; i++) {
-		animations[i].numFrames = file.readByte();
+		_animations[i]._numFrames = file.readByte();
 
 		for (int j = 0; j < 20; j++) {
 			if (file.readByte()) {
-				animations[i].deltaX.push_back(-(file.readUint16LE() / 100));
+				_animations[i]._deltaX.push_back(-(file.readUint16LE() / 100));
 			} else {
-				animations[i].deltaX.push_back(file.readUint16LE() / 100);
+				_animations[i]._deltaX.push_back(file.readUint16LE() / 100);
 			}
 			if (file.readByte()) {
-				animations[i].deltaY.push_back(-(file.readUint16LE() / 100));
+				_animations[i]._deltaY.push_back(-(file.readUint16LE() / 100));
 			} else {
-				animations[i].deltaY.push_back(file.readUint16LE() / 100);
+				_animations[i]._deltaY.push_back(file.readUint16LE() / 100);
 			}
-			animations[i].frameNo.push_back(file.readByte());
-			animations[i].frameDuration.push_back(file.readByte());
+			_animations[i]._frameNo.push_back(file.readByte());
+			_animations[i]._frameDuration.push_back(file.readByte());
 		}
 	}
 
@@ -208,20 +208,20 @@ bool Darkseed::Nsp::loadObt(const Common::Path &filename) {
 }
 
 const Darkseed::Obt &Darkseed::Nsp::getAnimAt(int index) {
-	return animations[index];
+	return _animations[index];
 }
 
 Darkseed::Obt::Obt() {
-	numFrames = 0;
-	deltaX.reserve(20);
-	deltaY.reserve(20);
-	frameNo.reserve(20);
-	frameDuration.reserve(20);
+	_numFrames = 0;
+	_deltaX.reserve(20);
+	_deltaY.reserve(20);
+	_frameNo.reserve(20);
+	_frameDuration.reserve(20);
 }
 
 Darkseed::Obt::~Obt() {
-	deltaX.clear();
-	deltaY.clear();
-	frameNo.clear();
-	frameDuration.clear();
+	_deltaX.clear();
+	_deltaY.clear();
+	_frameNo.clear();
+	_frameDuration.clear();
 }
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
index 670271dad80..ca1777fe9ef 100644
--- a/engines/darkseed/nsp.h
+++ b/engines/darkseed/nsp.h
@@ -30,10 +30,10 @@ namespace Darkseed {
 
 class Sprite {
 public:
-	uint16 width;
-	uint16 height;
-	uint16 pitch;
-	Common::Array<uint8> pixels;
+	uint16 _width;
+	uint16 _height;
+	uint16 _pitch;
+	Common::Array<uint8> _pixels;
 
 public:
 	Sprite(uint16 width, uint16 height, uint16 pitch);
@@ -44,29 +44,29 @@ public:
 
 class Obt {
 public:
-	uint8 numFrames;
-	Common::Array<int32> deltaX;
-	Common::Array<int32> deltaY;
-	Common::Array<uint8> frameNo;
-	Common::Array<uint8> frameDuration;
+	uint8 _numFrames;
+	Common::Array<int32> _deltaX;
+	Common::Array<int32> _deltaY;
+	Common::Array<uint8> _frameNo;
+	Common::Array<uint8> _frameDuration;
 	Obt();
 	virtual ~Obt();
 };
 
 class Nsp {
 private:
-	Common::Array<Sprite> frames;
-	Common::Array<Obt> animations;
+	Common::Array<Sprite> _frames;
+	Common::Array<Obt> _animations;
 
 public:
 	bool load(const Common::Path &filename);
 	bool containsSpriteAt(int index) {
-		return (int)frames.size() > index;
+		return (int)_frames.size() > index;
 	}
 	const Sprite &getSpriteAt(int index);
 	const Obt &getAnimAt(int index);
 	int16 getTotalAnim() {
-		return (int16)animations.size();
+		return (int16)_animations.size();
 	}
 
 private:
diff --git a/engines/darkseed/pal.cpp b/engines/darkseed/pal.cpp
index 505b5f3cfce..eeea797affe 100644
--- a/engines/darkseed/pal.cpp
+++ b/engines/darkseed/pal.cpp
@@ -33,7 +33,7 @@ Pal::Pal(const Pal &pal) {
 }
 
 void Pal::load(const Pal &pal) {
-	memcpy(palData, pal.palData, DARKSEED_PAL_SIZE);
+	memcpy(_palData, pal._palData, DARKSEED_PAL_SIZE);
 }
 
 bool Pal::load(const Common::Path &filename, bool shouldInstallPalette) {
@@ -41,11 +41,11 @@ bool Pal::load(const Common::Path &filename, bool shouldInstallPalette) {
 	if (!file.open(filename)) {
 		return false;
 	}
-	uint32 bytesRead = file.read(palData, DARKSEED_PAL_SIZE);
+	uint32 bytesRead = file.read(_palData, DARKSEED_PAL_SIZE);
 	assert(bytesRead == DARKSEED_PAL_SIZE);
 
 	for (int i = 0; i < DARKSEED_PAL_SIZE; i++) {
-		palData[i] = palData[i] << 2;
+		_palData[i] = _palData[i] << 2;
 	}
 	if (shouldInstallPalette) {
 		installPalette();
@@ -54,22 +54,22 @@ bool Pal::load(const Common::Path &filename, bool shouldInstallPalette) {
 }
 
 void Pal::loadFromScreen() {
-	g_system->getPaletteManager()->grabPalette(palData, 0, DARKSEED_NUM_PAL_ENTRIES);
+	g_system->getPaletteManager()->grabPalette(_palData, 0, DARKSEED_NUM_PAL_ENTRIES);
 }
 
 void Pal::clear() {
-	memset(palData, 0, DARKSEED_PAL_SIZE);
+	memset(_palData, 0, DARKSEED_PAL_SIZE);
 }
 
 void Pal::updatePalette(int delta, const Pal &targetPal, bool shouldInstallPalette) {
 	for (int i = 0; i < DARKSEED_PAL_SIZE; i++) {
-		int c = palData[i] + delta;
+		int c = _palData[i] + delta;
 		if (c < 0) {
 			c = 0;
-		} else if (delta > 0 && c > targetPal.palData[i]) {
-			c = targetPal.palData[i];
+		} else if (delta > 0 && c > targetPal._palData[i]) {
+			c = targetPal._palData[i];
 		}
-		palData[i] = (uint8)c;
+		_palData[i] = (uint8)c;
 	}
 	if (shouldInstallPalette) {
 		installPalette();
@@ -77,7 +77,7 @@ void Pal::updatePalette(int delta, const Pal &targetPal, bool shouldInstallPalet
 }
 
 void Pal::installPalette() {
-	g_system->getPaletteManager()->setPalette(palData, 0, DARKSEED_NUM_PAL_ENTRIES);
+	g_system->getPaletteManager()->setPalette(_palData, 0, DARKSEED_NUM_PAL_ENTRIES);
 }
 
 } // namespace Darkseed
diff --git a/engines/darkseed/pal.h b/engines/darkseed/pal.h
index 039614f6cbb..ec85194a188 100644
--- a/engines/darkseed/pal.h
+++ b/engines/darkseed/pal.h
@@ -32,7 +32,7 @@ namespace Darkseed {
 
 class Pal {
 public:
-	byte palData[DARKSEED_PAL_SIZE];
+	byte _palData[DARKSEED_PAL_SIZE];
 
 public:
 	Pal() {};
diff --git a/engines/darkseed/pic.cpp b/engines/darkseed/pic.cpp
index d43c1d3ce94..3e6d9bb5950 100644
--- a/engines/darkseed/pic.cpp
+++ b/engines/darkseed/pic.cpp
@@ -33,28 +33,28 @@ bool Darkseed::Pic::load(const Common::Path &filename) {
 	bool ret = load(file);
 	file.close();
 	if (ret) {
-		debug("Loaded %s (%d,%d)", fullPath.toString().c_str(), width, height);
+		debug("Loaded %s (%d,%d)", fullPath.toString().c_str(), _width, _height);
 	}
 	return ret;
 }
 
 bool Darkseed::Pic::load(Common::SeekableReadStream &readStream) {
-	width = readStream.readUint16BE();
-	height = readStream.readUint16BE();
-	pixels.resize(width * (height + 1), 0);
+	_width = readStream.readUint16BE();
+	_height = readStream.readUint16BE();
+	_pixels.resize(_width * (_height + 1), 0);
 
 	int curX = 0;
 	int curY = 0;
-	while (curY < height) {
+	while (curY < _height) {
 		int rleCommand = readNextNibble(readStream);
 
 		if (rleCommand < 8) {
 			// read nibble count of nibbles pixels
 			for (int i = 0; i < rleCommand + 1; i++) {
 				byte pixel = readNextNibble(readStream);
-				pixels[curX + curY * width] = pixel;
+				_pixels[curX + curY * _width] = pixel;
 				curX++;
-				if (curX == width) {
+				if (curX == _width) {
 					curX = 0;
 					curY++;
 				}
@@ -63,9 +63,9 @@ bool Darkseed::Pic::load(Common::SeekableReadStream &readStream) {
 			// fetch next nibble and repeat if n times.
 			byte pixel = readNextNibble(readStream);
 			for (int i = 16; i >= rleCommand; i--) {
-				pixels[curX + curY * width] = pixel;
+				_pixels[curX + curY * _width] = pixel;
 				curX++;
-				if (curX == width) {
+				if (curX == _width) {
 					curX = 0;
 					curY++;
 				}
@@ -76,16 +76,16 @@ bool Darkseed::Pic::load(Common::SeekableReadStream &readStream) {
 }
 
 byte Darkseed::Pic::readNextNibble(Common::SeekableReadStream &readStream) {
-	if (!hasReadByte) {
-		currentDataByte = readStream.readByte();
+	if (!_hasReadByte) {
+		_currentDataByte = readStream.readByte();
 		if (readStream.eos()) {
 			debug("Argh!");
 		}
-		hasReadByte = true;
-		return currentDataByte >> 4;
+		_hasReadByte = true;
+		return _currentDataByte >> 4;
 	} else {
-		hasReadByte = false;
-		return currentDataByte & 0xf;
+		_hasReadByte = false;
+		return _currentDataByte & 0xf;
 	}
 }
 
diff --git a/engines/darkseed/pic.h b/engines/darkseed/pic.h
index c284d8f6dc7..097b2716271 100644
--- a/engines/darkseed/pic.h
+++ b/engines/darkseed/pic.h
@@ -31,24 +31,24 @@ namespace Darkseed {
 
 class Pic {
 private:
-	uint16 width;
-	uint16 height;
-	Common::Array<uint8> pixels;
+	uint16 _width;
+	uint16 _height;
+	Common::Array<uint8> _pixels;
 
-	bool hasReadByte = false;
-	byte currentDataByte = 0;
+	bool _hasReadByte = false;
+	byte _currentDataByte = 0;
 
 public:
 	bool load(const Common::Path &filename);
 	Common::Array<uint8> &getPixels() {
-		return pixels;
+		return _pixels;
 	}
 
 	uint16 getWidth() const {
-		return width;
+		return _width;
 	}
 	uint16 getHeight() const {
-		return height;
+		return _height;
 	}
 
 	void draw();
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index eb0b22a197c..0317a6865b9 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -48,33 +48,33 @@ uint16 walkFrameOffsetTbl[] = { 0,   8,  16,   8 };
 void Darkseed::Player::updateSprite() {
 	if (!_playerIsChangingDirection) {
 		if ((_direction == 3) || (_direction == 1)) {
-			g_engine->player_sprite_related_2c85_82f3 = BYTE_ARRAY_2c85_41eb[_direction];
+			g_engine->_player_sprite_related_2c85_82f3 = BYTE_ARRAY_2c85_41eb[_direction];
 		}
 		if (_position.x == _walkTarget.x && _position.y == _walkTarget.y && !_heroMoving) {
 			_frameIdx = playerSpriteIndexDirectionTbl[_direction];
 		} else {
-			_frameIdx = playerWalkFrameIdx + walkFrameOffsetTbl[_direction];
+			_frameIdx = _playerWalkFrameIdx + walkFrameOffsetTbl[_direction];
 		}
 		if (_direction == 2) {
 			if (_position.x < _walkTarget.x) {
-				g_engine->player_sprite_related_2c85_82f3 = true;
+				g_engine->_player_sprite_related_2c85_82f3 = true;
 			} else if (_walkTarget.x < _position.x) {
-				g_engine->player_sprite_related_2c85_82f3 = false;
+				g_engine->_player_sprite_related_2c85_82f3 = false;
 			}
 		}
 		if (_direction == 0) {
 			if (_walkTarget.x < _position.x) {
-				g_engine->player_sprite_related_2c85_82f3 = true;
+				g_engine->_player_sprite_related_2c85_82f3 = true;
 			} else if (_position.x < _walkTarget.x) {
-				g_engine->player_sprite_related_2c85_82f3 = false;
+				g_engine->_player_sprite_related_2c85_82f3 = false;
 			}
 		}
 	} else {
-		g_engine->player_sprite_related_2c85_82f3 = 4 < playerSpriteWalkIndex_maybe;
-		if (g_engine->player_sprite_related_2c85_82f3) {
-			_frameIdx = 0x20 - playerSpriteWalkIndex_maybe;
+		g_engine->_player_sprite_related_2c85_82f3 = 4 < _playerSpriteWalkIndex_maybe;
+		if (g_engine->_player_sprite_related_2c85_82f3) {
+			_frameIdx = 0x20 - _playerSpriteWalkIndex_maybe;
 		} else {
-			_frameIdx = playerSpriteWalkIndex_maybe + 0x18;
+			_frameIdx = _playerSpriteWalkIndex_maybe + 0x18;
 		}
 	}
 }
@@ -89,29 +89,29 @@ bool Darkseed::Player::isAtWalkTarget() const {
 void Darkseed::Player::changeDirection(int16 oldDir, int16 newDir) {
 	if (oldDir != newDir) {
 		_playerIsChangingDirection = true;
-		playerSpriteWalkIndex_maybe = (int16)(oldDir * 2);
-		playerNewFacingDirection_maybe = (int16)(newDir * 2);
-		playerWalkFrameDeltaOffset = 1;
+		_playerSpriteWalkIndex_maybe = (int16)(oldDir * 2);
+		_playerNewFacingDirection_maybe = (int16)(newDir * 2);
+		_playerWalkFrameDeltaOffset = 1;
 		if (oldDir < 4) {
 			switch (oldDir) {
 			case 0 :
 				if (newDir == 3) {
-					playerWalkFrameDeltaOffset = -1;
+					_playerWalkFrameDeltaOffset = -1;
 				}
 				break;
 			case 1 :
 				if (newDir == 0) {
-					playerWalkFrameDeltaOffset = -1;
+					_playerWalkFrameDeltaOffset = -1;
 				}
 				break;
 			case 2 :
 				if (newDir == 1) {
-					playerWalkFrameDeltaOffset = -1;
+					_playerWalkFrameDeltaOffset = -1;
 				}
 				break;
 			case 3 :
 				if (newDir == 2) {
-					playerWalkFrameDeltaOffset = -1;
+					_playerWalkFrameDeltaOffset = -1;
 				}
 				break;
 			}
@@ -153,9 +153,9 @@ void Darkseed::Player::playerFaceWalkTarget() {
 
 void Darkseed::Player::calculateWalkTarget() {
 	_heroMoving = true;
-	playerWalkFrameIdx = 0;
-	walkPathIndex = -1;
-	numConnectorsInWalkPath = 0;
+	_playerWalkFrameIdx = 0;
+	_walkPathIndex = -1;
+	_numConnectorsInWalkPath = 0;
 	int selectedObjNum = 0;
 	if (g_engine->_actionMode == PointerAction) {
 		selectedObjNum = g_engine->_room->getRoomExitAtCursor();
@@ -210,9 +210,9 @@ void Darkseed::Player::calculateWalkTarget() {
 			} else {
 				Common::Point tmpDest = _walkTarget;
 				_walkTarget = connector;
-				if (numConnectorsInWalkPath > 0 && numConnectorsInWalkPath < Room::MAX_CONNECTORS - 1 && _connectorList[numConnectorsInWalkPath - 1] != connector) {
-					_connectorList[numConnectorsInWalkPath] = connector;
-					numConnectorsInWalkPath++;
+				if (_numConnectorsInWalkPath > 0 && _numConnectorsInWalkPath < Room::MAX_CONNECTORS - 1 && _connectorList[_numConnectorsInWalkPath - 1] != connector) {
+					_connectorList[_numConnectorsInWalkPath] = connector;
+					_numConnectorsInWalkPath++;
 				}
 				_finalTarget = tmpDest;
 			}
@@ -223,11 +223,11 @@ void Darkseed::Player::calculateWalkTarget() {
 }
 
 int Darkseed::Player::getWidth() {
-	return getSprite(_frameIdx).width;
+	return getSprite(_frameIdx)._width;
 }
 
 int Darkseed::Player::getHeight() {
-	return getSprite(_frameIdx).height;
+	return getSprite(_frameIdx)._height;
 }
 
 void Darkseed::Player::updatePlayerPositionAfterRoomChange() {
@@ -249,11 +249,11 @@ void Darkseed::Player::updatePlayerPositionAfterRoomChange() {
 		}
 	} else if (_direction == 3) {
 		if (currentRoomNumber == 0x20 || currentRoomNumber == 0x1a) {
-			g_engine->scaledSpriteHeight = 5;
+			g_engine->_scaledSpriteHeight = 5;
 		} else {
-			g_engine->_room->calculateScaledSpriteDimensions(getWidth(), getHeight(), _position.y + g_engine->scaledSpriteHeight);
+			g_engine->_room->calculateScaledSpriteDimensions(getWidth(), getHeight(), _position.y + g_engine->_scaledSpriteHeight);
 		}
-		_position.y += g_engine->scaledSpriteHeight;
+		_position.y += g_engine->_scaledSpriteHeight;
 		if (_position.y > 0xee) {
 			_position.y = 0xee;
 		}
@@ -275,8 +275,8 @@ void Darkseed::Player::updatePlayerPositionAfterRoomChange() {
 			_position.y = yDown;
 		}
 	} else {
-		g_engine->_room->calculateScaledSpriteDimensions(getWidth(), getHeight(), _position.y + g_engine->scaledSpriteHeight);
-		_position.y += g_engine->scaledSpriteHeight;
+		g_engine->_room->calculateScaledSpriteDimensions(getWidth(), getHeight(), _position.y + g_engine->_scaledSpriteHeight);
+		_position.y += g_engine->_scaledSpriteHeight;
 		if (_position.y > 0xee) {
 			_position.y = 0xee;
 		}
@@ -305,7 +305,7 @@ void Darkseed::Player::createConnectorPathToDest() {
 		startPoint = _walkTarget;
 		_walkTarget = _position;
 	}
-	numConnectorsInWalkPath = 0;
+	_numConnectorsInWalkPath = 0;
 	Common::Point connector;
 	if (!g_engine->_room->canWalkAtLocation(startPoint.x, startPoint.y)) {
 		connector = getClosestUnusedConnector(startPoint.x, startPoint.y);
@@ -319,11 +319,11 @@ void Darkseed::Player::createConnectorPathToDest() {
 		return;
 	}
 
-	walkPathIndex = 0;
-	_connectorList[numConnectorsInWalkPath] = connector;
-	numConnectorsInWalkPath++;
+	_walkPathIndex = 0;
+	_connectorList[_numConnectorsInWalkPath] = connector;
+	_numConnectorsInWalkPath++;
 
-	while (numConnectorsInWalkPath < Room::MAX_CONNECTORS && connector != noConnectorFound) {
+	while (_numConnectorsInWalkPath < Room::MAX_CONNECTORS && connector != noConnectorFound) {
 		if (g_engine->_room->canWalkInLineToTarget(connector.x, connector.y, _walkTarget.x, _walkTarget.y)) {
 			break;
 		}
@@ -332,8 +332,8 @@ void Darkseed::Player::createConnectorPathToDest() {
 			break;
 		}
 		if (connector != noConnectorFound) {
-			_connectorList[numConnectorsInWalkPath] = connector;
-			numConnectorsInWalkPath++;
+			_connectorList[_numConnectorsInWalkPath] = connector;
+			_numConnectorsInWalkPath++;
 		}
 	}
 
@@ -355,7 +355,7 @@ Common::Point Darkseed::Player::getClosestUnusedConnector(int16 x, int16 y, bool
 	int closestDist = 5000;
 	for (auto &roomConnector : g_engine->_room->_connectors) {
 		bool containsPoint = false;
-		for (int i = 0; i < numConnectorsInWalkPath; i++) {
+		for (int i = 0; i < _numConnectorsInWalkPath; i++) {
 			if (_connectorList[i] == roomConnector) {
 				containsPoint = true;
 			}
@@ -374,52 +374,52 @@ Common::Point Darkseed::Player::getClosestUnusedConnector(int16 x, int16 y, bool
 }
 
 void Darkseed::Player::walkToNextConnector() {
-	if (walkPathIndex == -1) {
+	if (_walkPathIndex == -1) {
 		return;
 	}
-	if (walkPathIndex + 1 < numConnectorsInWalkPath) {
-		walkPathIndex++;
-		_walkTarget = _connectorList[walkPathIndex];
+	if (_walkPathIndex + 1 < _numConnectorsInWalkPath) {
+		_walkPathIndex++;
+		_walkTarget = _connectorList[_walkPathIndex];
 	} else {
 		_walkTarget = _finalTarget;
-		walkPathIndex = -1;
+		_walkPathIndex = -1;
 	}
 	playerFaceWalkTarget();
 }
 
 void Darkseed::Player::draw() {
 	if (g_engine->_debugShowWalkPath) {
-		if (walkPathIndex != -1) {
-			for (int i = walkPathIndex; i < numConnectorsInWalkPath; i++) {
-				if (i == walkPathIndex) {
+		if (_walkPathIndex != -1) {
+			for (int i = _walkPathIndex; i < _numConnectorsInWalkPath; i++) {
+				if (i == _walkPathIndex) {
 					g_engine->_screen->drawLine(_position.x, _position.y, _connectorList[i].x, _connectorList[i].y, 2);
 				} else {
 					g_engine->_screen->drawLine(_connectorList[i].x, _connectorList[i].y, _connectorList[i - 1].x, _connectorList[i - 1].y, 2);
 				}
 			}
-			g_engine->_screen->drawLine(_connectorList[numConnectorsInWalkPath - 1].x, _connectorList[numConnectorsInWalkPath - 1].y, _finalTarget.x, _finalTarget.y, 2);
+			g_engine->_screen->drawLine(_connectorList[_numConnectorsInWalkPath - 1].x, _connectorList[_numConnectorsInWalkPath - 1].y, _finalTarget.x, _finalTarget.y, 2);
 		}
 	}
 }
 
 void Darkseed::Player::reverseConnectorList() {
 	Common::Array<Common::Point> tempList;
-	tempList.resize(numConnectorsInWalkPath);
+	tempList.resize(_numConnectorsInWalkPath);
 
-	for (int i = 0; i < numConnectorsInWalkPath; i++) {
-		tempList[i] = _connectorList[numConnectorsInWalkPath - 1 - i];
+	for (int i = 0; i < _numConnectorsInWalkPath; i++) {
+		tempList[i] = _connectorList[_numConnectorsInWalkPath - 1 - i];
 	}
 
-	for (int i = 0; i < numConnectorsInWalkPath; i++) {
+	for (int i = 0; i < _numConnectorsInWalkPath; i++) {
 		_connectorList[i] = tempList[i];
 	}
 }
 
 void Darkseed::Player::OptimisePath() {
 	if (g_engine->_room->_roomNumber != 7 && g_engine->_room->_roomNumber != 32) {
-		while (numConnectorsInWalkPath > 1) {
-			if (g_engine->_room->canWalkInLineToTarget(_connectorList[numConnectorsInWalkPath - 2].x, _connectorList[numConnectorsInWalkPath - 2].y, _walkTarget.x, _walkTarget.y)) {
-				numConnectorsInWalkPath--;
+		while (_numConnectorsInWalkPath > 1) {
+			if (g_engine->_room->canWalkInLineToTarget(_connectorList[_numConnectorsInWalkPath - 2].x, _connectorList[_numConnectorsInWalkPath - 2].y, _walkTarget.x, _walkTarget.y)) {
+				_numConnectorsInWalkPath--;
 			} else {
 				break;
 			}
@@ -434,7 +434,7 @@ static constexpr uint8 _closerroom[10] = {
 };
 
 void Darkseed::Player::setplayertowardsbedroom() {
-	if (g_engine->isPlayingAnimation_maybe) {
+	if (g_engine->_isPlayingAnimation_maybe) {
 		return;
 	}
 	Common::Point currentCursor = g_engine->_cursor.getPosition();
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index 2ab06652944..b81ee889872 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -41,17 +41,17 @@ public:
 	Common::Point _walkTarget;
 	Common::Point _finalTarget;
 
-	int16 playerSpriteWalkIndex_maybe = 0;
-	int16 playerWalkFrameDeltaOffset = 0;
-	int16 playerNewFacingDirection_maybe = 0;
-	uint16 playerWalkFrameIdx = 0;
+	int16 _playerSpriteWalkIndex_maybe = 0;
+	int16 _playerWalkFrameDeltaOffset = 0;
+	int16 _playerNewFacingDirection_maybe = 0;
+	uint16 _playerWalkFrameIdx = 0;
 	bool _actionToPerform = false; // player is pathfinding to some destination?
 	bool _playerIsChangingDirection = false; // AKA _Rotating
 	bool _isAutoWalkingToBed = false;
 	bool _heroMoving = false; // maybe set to true while player is walking around the room.
 	bool _herowaiting = false;
-	int walkPathIndex = -1;
-	uint16 numConnectorsInWalkPath = 0;
+	int _walkPathIndex = -1;
+	uint16 _numConnectorsInWalkPath = 0;
 	Common::Array<Common::Point> _connectorList;
 	int16 _sequenceRotation = -1;
 	bool _walkToSequence = false;
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 2fe9f781d10..1ad82838168 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -44,8 +44,8 @@ const static int roomDescriptionTextTbl[] = {
 };
 
 Darkseed::Room::Room(int roomNumber) : _roomNumber(roomNumber) {
-	room1.resize(8);
-	walkableLocationsMap.resize(16);
+	_room1.resize(8);
+	_walkableLocationsMap.resize(16);
 	_roomObj.resize(30);
 
 	_locObjFrame.resize(30);
@@ -59,7 +59,7 @@ Darkseed::Room::Room(int roomNumber) : _roomNumber(roomNumber) {
 void Darkseed::Room::initRoom() {
 	for (int iVar1 = 0; iVar1 < 30; iVar1 = iVar1 + 1) {
 		_locObjFrame[iVar1] = 0;
-		g_engine->animIndexTbl[iVar1] = 0;
+		g_engine->_animIndexTbl[iVar1] = 0;
 	}
 	if (g_engine->_objectVar[141] == 10) {
 		g_engine->_objectVar[141] = 11;
@@ -94,19 +94,19 @@ bool Darkseed::Room::load() {
 	file.seek(0x27);
 
 	for (int i = 0; i < 8; i++) {
-		room1[i].x = file.readUint16BE();
-		room1[i].y = file.readUint16BE();
-		if (room1[i].y > 233) {
-			room1[i].y = 233;
+		_room1[i].x = file.readUint16BE();
+		_room1[i].y = file.readUint16BE();
+		if (_room1[i].y > 233) {
+			_room1[i].y = 233;
 		}
-		room1[i].width = file.readUint16BE();
-		room1[i].height = file.readUint16BE();
-		room1[i].roomNumber = file.readUint16BE();
-		room1[i].direction = file.readByte();
+		_room1[i].width = file.readUint16BE();
+		_room1[i].height = file.readUint16BE();
+		_room1[i].roomNumber = file.readUint16BE();
+		_room1[i].direction = file.readByte();
 	}
 
 	for (int i = 0; i < 16; i++) {
-		file.read(walkableLocationsMap[i].strip, 40);
+		file.read(_walkableLocationsMap[i].strip, 40);
 	}
 
 	for (int i = 0; i < 30; i++) {
@@ -155,7 +155,7 @@ bool Darkseed::Room::load() {
 	file.close();
 
 	_collisionType = 0;
-	if (!pic.load(picFilename)) {
+	if (!_pic.load(picFilename)) {
 		return false;
 	}
 
@@ -209,16 +209,16 @@ Common::String Darkseed::Room::stripSpaces(Common::String source) {
 }
 
 void Darkseed::Room::draw() {
-	if (!palLoaded) {
+	if (!_palLoaded) {
 		_pal.installPalette();
-		palLoaded = true;
+		_palLoaded = true;
 	}
-	pic.draw(0x45, 0x28);
+	_pic.draw(0x45, 0x28);
 
 	// print walkable area map.
 	if (g_engine->_debugShowWalkPath) {
-		for (int y = 0x28; y < pic.getHeight() + 0x28; y++) {
-			for (int x = 0x45; x < pic.getWidth() + 0x45; x++) {
+		for (int y = 0x28; y < _pic.getHeight() + 0x28; y++) {
+			for (int x = 0x45; x < _pic.getWidth() + 0x45; x++) {
 				if (canWalkAtLocation(x, y)) {
 					g_engine->_screen->drawLine(x, y, x, y, 14);
 				}
@@ -241,9 +241,9 @@ int Darkseed::Room::checkCursorAndMoveableObjects() {
 	_collisionType = 0;
 	for (uint i = 0; i < _roomObj.size(); i++) {
 		if ((_roomObj[i].type == 1 || _roomObj[i].type == 3)
-			&& _roomObj[i].xOffset <= cursorSprite.width + g_engine->_cursor.getX()
+			&& _roomObj[i].xOffset <= cursorSprite._width + g_engine->_cursor.getX()
 			&& g_engine->_cursor.getX() <= _roomObj[i].width + _roomObj[i].xOffset
-			&& _roomObj[i].yOffset <= cursorSprite.height + g_engine->_cursor.getY()
+			&& _roomObj[i].yOffset <= cursorSprite._height + g_engine->_cursor.getY()
 			&& g_engine->_cursor.getY() <= _roomObj[i].height + _roomObj[i].yOffset
 		) {
 			hasObject = true;
@@ -276,9 +276,9 @@ int Darkseed::Room::checkCursorAndStaticObjects(int x, int y) {
 	_collisionType = 0;
 	for (uint i = 0; i < _roomObj.size(); i++) {
 		if (_roomObj[i].type == 0
-			&& _roomObj[i].xOffset <= cursorSprite.width + g_engine->_cursor.getX()
+			&& _roomObj[i].xOffset <= cursorSprite._width + g_engine->_cursor.getX()
 			&& g_engine->_cursor.getX() <= _roomObj[i].width + _roomObj[i].xOffset
-			&& _roomObj[i].yOffset <= cursorSprite.height + g_engine->_cursor.getY()
+			&& _roomObj[i].yOffset <= cursorSprite._height + g_engine->_cursor.getY()
 			&& g_engine->_cursor.getY() <= _roomObj[i].height + _roomObj[i].yOffset
 		) {
 			if (actionMode != PointerAction && _roomObj[i].objNum >= 5) {
@@ -331,19 +331,19 @@ int Darkseed::Room::CheckCursorAndMovedObjects() {
 			if (i == 22) {
 				uint8 spriteIdx = g_engine->_objectVar.getVar(5) != 0 ? 1 : 0;
 				const Sprite &sprite = _locationSprites.getSpriteAt(spriteIdx);
-				spriteWidth = sprite.width;
-				spriteHeight = sprite.height;
+				spriteWidth = sprite._width;
+				spriteHeight = sprite._height;
 			} else {
 				const Sprite &sprite = g_engine->_baseSprites.getSpriteAt(i);
-				spriteWidth = sprite.width;
-				spriteHeight = sprite.height;
+				spriteWidth = sprite._width;
+				spriteHeight = sprite._height;
 			}
 			calculateScaledSpriteDimensions(spriteWidth, spriteHeight, movedObjPos.y);
 
 			if (
-				((spriteWidth / 2 + movedObjPos.x) - g_engine->scaledSpriteWidth / 2 <= cursorSprite.width + g_engine->_cursor.getX()) &&
-				(g_engine->_cursor.getX() <= ((spriteWidth / 2 + movedObjPos.x) - g_engine->scaledSpriteWidth / 2) + g_engine->scaledSpriteWidth) &&
-				((movedObjPos.y + spriteHeight) - g_engine->scaledSpriteHeight <= cursorSprite.height + g_engine->_cursor.getY()) &&
+				((spriteWidth / 2 + movedObjPos.x) - g_engine->_scaledSpriteWidth / 2 <= cursorSprite._width + g_engine->_cursor.getX()) &&
+				(g_engine->_cursor.getX() <= ((spriteWidth / 2 + movedObjPos.x) - g_engine->_scaledSpriteWidth / 2) + g_engine->_scaledSpriteWidth) &&
+				((movedObjPos.y + spriteHeight) - g_engine->_scaledSpriteHeight <= cursorSprite._height + g_engine->_cursor.getY()) &&
 				g_engine->_cursor.getY() <= movedObjPos.y + spriteHeight) {
 				return i;
 			}
@@ -422,15 +422,15 @@ bool Darkseed::Room::exitRoom() {
 }
 int Darkseed::Room::getExitRoomNumberAtPoint(int x, int y) {
 	int obj = checkCursorAndStaticObjects(x, y);
-	for (uint i = 0; i < room1.size(); i++) {
+	for (uint i = 0; i < _room1.size(); i++) {
 		if (
-			room1[i].roomNumber != 0xff
-			&& _roomObj[obj].xOffset <= room1[i].x
-			&& room1[i].x <= _roomObj[obj].width + _roomObj[obj].xOffset
-			&& _roomObj[obj].yOffset <= room1[i].y
-			&& room1[i].y <= _roomObj[obj].yOffset + _roomObj[obj].height
+			_room1[i].roomNumber != 0xff
+			&& _roomObj[obj].xOffset <= _room1[i].x
+			&& _room1[i].x <= _roomObj[obj].width + _roomObj[obj].xOffset
+			&& _roomObj[obj].yOffset <= _room1[i].y
+			&& _room1[i].y <= _roomObj[obj].yOffset + _roomObj[obj].height
 			) {
-			return room1[i].roomNumber;
+			return _room1[i].roomNumber;
 		}
 	}
 	return -1;
@@ -449,7 +449,7 @@ bool Darkseed::Room::canWalkAtLocation(int x, int y) {
 
 	int t = (x - 69) / 5;
 
-	return (walkableLocationsMap[t / 8].strip[(y - 40) / 5] >> (7 - (t % 8) & 0x1f) & 1);
+	return (_walkableLocationsMap[t / 8].strip[(y - 40) / 5] >> (7 - (t % 8) & 0x1f) & 1);
 }
 
 bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int destY) {
@@ -632,7 +632,7 @@ int Darkseed::Room::getRoomExitAtCursor() {
 	for (uint i = 0; i < _roomObj.size(); i++) {
 		Common::Rect roomRect(_roomObj[i].xOffset, _roomObj[i].yOffset, _roomObj[i].xOffset + _roomObj[i].width, _roomObj[i].yOffset + _roomObj[i].height);
 		if (_roomObj[i].type == 0 && _roomObj[i].objNum < 6 && roomRect.contains(g_engine->_cursor.getPosition())) {
-			selectedObjIndex = i;
+			_selectedObjIndex = i;
 			return _roomObj[i].objNum;
 		}
 	}
@@ -644,18 +644,18 @@ void Darkseed::Room::getWalkTargetForObjectType_maybe(int objId) {
 		if (_roomObj[i].objNum == objId && _roomObj[i].type == 4) {
 			g_engine->_player->_walkTarget.x = _roomObj[i].xOffset;
 			g_engine->_player->_walkTarget.y = _roomObj[i].yOffset;
-			for (uint j = 0; j < room1.size(); j++) {
-				if (room1[j].roomNumber != 0xff
-					&& _roomObj[selectedObjIndex].xOffset < room1[j].x
-					&& room1[j].x < _roomObj[selectedObjIndex].xOffset + _roomObj[selectedObjIndex].width
-					&& _roomObj[selectedObjIndex].yOffset < room1[j].y
-					&& room1[j].y < _roomObj[selectedObjIndex].yOffset + _roomObj[selectedObjIndex].height
+			for (uint j = 0; j < _room1.size(); j++) {
+				if (_room1[j].roomNumber != 0xff
+					&& _roomObj[_selectedObjIndex].xOffset < _room1[j].x
+					&& _room1[j].x < _roomObj[_selectedObjIndex].xOffset + _roomObj[_selectedObjIndex].width
+					&& _roomObj[_selectedObjIndex].yOffset < _room1[j].y
+					&& _room1[j].y < _roomObj[_selectedObjIndex].yOffset + _roomObj[_selectedObjIndex].height
 					) {
-					if (_roomNumber != 61 || room1[j].roomNumber == 5 || g_engine->_objectVar[22] > 2) {
-						g_engine->useDoorTarget = true;
+					if (_roomNumber != 61 || _room1[j].roomNumber == 5 || g_engine->_objectVar[22] > 2) {
+						g_engine->_useDoorTarget = true;
 					}
-					g_engine->targetRoomNumber = room1[j].roomNumber;
-					g_engine->targetPlayerDirection = room1[j].direction;
+					g_engine->_targetRoomNumber = _room1[j].roomNumber;
+					g_engine->_targetPlayerDirection = _room1[j].direction;
 					break;
 				}
 			}
@@ -709,31 +709,31 @@ static const uint8 room_sprite_related_2c85_4303[] = {
 };
 
 void Darkseed::Room::calculateScaledSpriteDimensions(int width, int height, int curYPosition) {
-	int local_6 = (g_engine->sprite_y_scaling_threshold_maybe - 2) - curYPosition;
+	int local_6 = (g_engine->_sprite_y_scaling_threshold_maybe - 2) - curYPosition;
 	if (local_6 <= 0) {
 		local_6 = 0;
 	}
-	g_engine->scaledWalkSpeed_maybe = scaleTbl[_roomNumber] - ((room_sprite_related_2c85_4303[_roomNumber] * local_6) / 5);
-	g_engine->scaledSpriteWidth = (width * g_engine->scaledWalkSpeed_maybe) / 1000;
-	g_engine->scaledSpriteHeight = (height * g_engine->scaledWalkSpeed_maybe) / 1000;
+	g_engine->_scaledWalkSpeed_maybe = scaleTbl[_roomNumber] - ((room_sprite_related_2c85_4303[_roomNumber] * local_6) / 5);
+	g_engine->_scaledSpriteWidth = (width * g_engine->_scaledWalkSpeed_maybe) / 1000;
+	g_engine->_scaledSpriteHeight = (height * g_engine->_scaledWalkSpeed_maybe) / 1000;
 }
 
 uint16 Darkseed::Room::getDoorTargetRoom(int objId) {
 	for (uint i = 0; i < _roomObj.size(); i++) {
 		if (_roomObj[i].objNum == objId && _roomObj[i].type == 4) {
-			for (uint j = 0; j < room1.size(); j++) {
-				if (room1[j].roomNumber != 0xff
-					&& _roomObj[selectedObjIndex].xOffset < room1[j].x
-					&& room1[j].x < _roomObj[selectedObjIndex].xOffset + _roomObj[selectedObjIndex].width
-					&& _roomObj[selectedObjIndex].yOffset < room1[j].y
-					&& room1[j].y < _roomObj[selectedObjIndex].yOffset + _roomObj[selectedObjIndex].height
+			for (uint j = 0; j < _room1.size(); j++) {
+				if (_room1[j].roomNumber != 0xff
+					&& _roomObj[_selectedObjIndex].xOffset < _room1[j].x
+					&& _room1[j].x < _roomObj[_selectedObjIndex].xOffset + _roomObj[_selectedObjIndex].width
+					&& _roomObj[_selectedObjIndex].yOffset < _room1[j].y
+					&& _room1[j].y < _roomObj[_selectedObjIndex].yOffset + _roomObj[_selectedObjIndex].height
 				) {
-					return room1[j].roomNumber;
+					return _room1[j].roomNumber;
 				}
 			}
 		}
 	}
-	return g_engine->targetRoomNumber; //TODO is this a safe fallback if no door exists?
+	return g_engine->_targetRoomNumber; //TODO is this a safe fallback if no door exists?
 }
 
 int Darkseed::Room::getObjectUnderCursor() {
@@ -785,46 +785,46 @@ void Darkseed::Room::runRoomObjects() {
 			//			debug("roomObj.objNum: %d", roomObj.objNum);
 			const Sprite &sprite = g_engine->_baseSprites.getSpriteAt(roomObj.spriteNum);
 			if (_roomNumber == 15 || _roomNumber == 16) {
-				g_engine->scaledSpriteWidth = sprite.width;
-				g_engine->scaledSpriteHeight = sprite.height;
+				g_engine->_scaledSpriteWidth = sprite._width;
+				g_engine->_scaledSpriteHeight = sprite._height;
 			} else {
-				calculateScaledSpriteDimensions(sprite.width, sprite.height, roomObj.yOffset + sprite.height);
+				calculateScaledSpriteDimensions(sprite._width, sprite._height, roomObj.yOffset + sprite._height);
 			}
 			if (((roomObj.spriteNum != 7) && (roomObj.spriteNum != 36)) && ((roomObj.spriteNum != 37 && (((roomObj.spriteNum != 38 && (roomObj.spriteNum != 39)) && (roomObj.spriteNum != 40)))))) {
-				xPos = (sprite.width / 2 + xPos) - g_engine->scaledSpriteWidth / 2;
+				xPos = (sprite._width / 2 + xPos) - g_engine->_scaledSpriteWidth / 2;
 			}
 			if (roomObj.spriteNum == 14) { // gloves
 				if (g_engine->_objectVar[86] != 0) {
 					g_engine->_sprites.addSpriteToDrawList(
 						xPos,
-						(yPos + sprite.height) - g_engine->scaledSpriteHeight,
+						(yPos + sprite._height) - g_engine->_scaledSpriteHeight,
 						&sprite,
-						240 - (yPos + sprite.height),
-						g_engine->scaledSpriteWidth,
-						g_engine->scaledSpriteHeight,
+						240 - (yPos + sprite._height),
+						g_engine->_scaledSpriteWidth,
+						g_engine->_scaledSpriteHeight,
 						false);
 				}
 			} else {
 				g_engine->_sprites.addSpriteToDrawList(
 					xPos,
-					(yPos + sprite.height) - g_engine->scaledSpriteHeight,
+					(yPos + sprite._height) - g_engine->_scaledSpriteHeight,
 					&sprite,
 					255,
-					sprite.width,
-					sprite.height,
+					sprite._width,
+					sprite._height,
 					false);
 			}
 			break;
 		}
 		case 2: {
 			int spriteNum = 0;
-			if (_roomNumber == 17 && g_engine->isPlayingAnimation_maybe && g_engine->otherNspAnimationType_maybe == 19 && _locObjFrame[roomObjIdx] == 4) {
+			if (_roomNumber == 17 && g_engine->_isPlayingAnimation_maybe && g_engine->_otherNspAnimationType_maybe == 19 && _locObjFrame[roomObjIdx] == 4) {
 				advanceLocAnimFrame(roomObjIdx + 1);
-				spriteNum = _locationSprites.getAnimAt(1).frameNo[_locObjFrame[roomObjIdx + 1]];
-			} else if (_roomNumber == 16 && g_engine->isPlayingAnimation_maybe && g_engine->otherNspAnimationType_maybe == 35) {
+				spriteNum = _locationSprites.getAnimAt(1)._frameNo[_locObjFrame[roomObjIdx + 1]];
+			} else if (_roomNumber == 16 && g_engine->_isPlayingAnimation_maybe && g_engine->_otherNspAnimationType_maybe == 35) {
 				// shop
 				g_engine->nextFrame(5);
-				spriteNum = g_engine->_player->_animations.getAnimAt(5).frameNo[g_engine->animIndexTbl[5]];
+				spriteNum = g_engine->_player->_animations.getAnimAt(5)._frameNo[g_engine->_animIndexTbl[5]];
 			} else if (_roomNumber == 53) {
 				if (g_engine->_objectVar[79] == 4) {
 					g_engine->_objectVar[79] = 2;
@@ -832,10 +832,10 @@ void Darkseed::Room::runRoomObjects() {
 				bool frameAdvanced = advanceFrame(g_engine->_objectVar[79]);
 				const Obt &anim = _locationSprites.getAnimAt(g_engine->_objectVar[79]);
 				if (frameAdvanced) {
-					roomObj.xOffset += anim.deltaX[_locObjFrame[g_engine->_objectVar[79]]];
-					roomObj.yOffset += anim.deltaY[_locObjFrame[g_engine->_objectVar[79]]];
+					roomObj.xOffset += anim._deltaX[_locObjFrame[g_engine->_objectVar[79]]];
+					roomObj.yOffset += anim._deltaY[_locObjFrame[g_engine->_objectVar[79]]];
 				}
-				spriteNum = _locationSprites.getAnimAt(g_engine->_objectVar[79]).frameNo[_locObjFrame[g_engine->_objectVar[79]]];
+				spriteNum = _locationSprites.getAnimAt(g_engine->_objectVar[79])._frameNo[_locObjFrame[g_engine->_objectVar[79]]];
 				if (g_engine->_ObjRestarted) {
 					if (g_engine->_objectVar[79] == 1) {
 						g_engine->_objectVar[79] = 3;
@@ -848,18 +848,18 @@ void Darkseed::Room::runRoomObjects() {
 				if (_roomNumber != 64 || g_engine->_currentTimeInSeconds < 64800) {
 					advanceLocAnimFrame(roomObjIdx);
 				}
-				spriteNum = _locationSprites.getAnimAt(_roomObj[roomObjIdx].spriteNum).frameNo[_locObjFrame[roomObjIdx]];
+				spriteNum = _locationSprites.getAnimAt(_roomObj[roomObjIdx].spriteNum)._frameNo[_locObjFrame[roomObjIdx]];
 			}
 
-			if (_roomNumber == 16 && g_engine->isPlayingAnimation_maybe && g_engine->otherNspAnimationType_maybe == 35) {
+			if (_roomNumber == 16 && g_engine->_isPlayingAnimation_maybe && g_engine->_otherNspAnimationType_maybe == 35) {
 				const Sprite &sprite = g_engine->_player->_animations.getSpriteAt(spriteNum);
 				g_engine->_sprites.addSpriteToDrawList(
 					xPos,
 					yPos,
 					&sprite,
 					255,
-					sprite.width,
-					sprite.height,
+					sprite._width,
+					sprite._height,
 					false);
 			} else if (_roomNumber == 15) {
 				if (g_engine->_objectVar[28] == 2) {
@@ -868,9 +868,9 @@ void Darkseed::Room::runRoomObjects() {
 						xPos,
 						yPos,
 						&sprite,
-						240 - (yPos + sprite.height),
-						sprite.width,
-						sprite.height,
+						240 - (yPos + sprite._height),
+						sprite._width,
+						sprite._height,
 						false);
 				}
 			} else if (_roomNumber == 57 && spriteNum < 6) {
@@ -881,8 +881,8 @@ void Darkseed::Room::runRoomObjects() {
 						yPos,
 						&sprite,
 						255,
-						sprite.width,
-						sprite.height,
+						sprite._width,
+						sprite._height,
 						false);
 				}
 			} else if (_roomNumber == 58) {
@@ -892,21 +892,21 @@ void Darkseed::Room::runRoomObjects() {
 						xPos,
 						yPos,
 						&sprite,
-						240 - (yPos + sprite.height),
-						sprite.width,
-						sprite.height,
+						240 - (yPos + sprite._height),
+						sprite._width,
+						sprite._height,
 						false);
 				}
-				updateRoomObj(48, xPos, sprite.width, yPos, sprite.height);
-			} else if (_roomNumber == 5 && g_engine->isPlayingAnimation_maybe && g_engine->otherNspAnimationType_maybe == 7) {
+				updateRoomObj(48, xPos, sprite._width, yPos, sprite._height);
+			} else if (_roomNumber == 5 && g_engine->_isPlayingAnimation_maybe && g_engine->_otherNspAnimationType_maybe == 7) {
 				const Sprite &sprite = _locationSprites.getSpriteAt(spriteNum);
 				g_engine->_sprites.addSpriteToDrawList(
 					xPos,
 					yPos,
 					&sprite,
 					1,
-					sprite.width,
-					sprite.height,
+					sprite._width,
+					sprite._height,
 					false);
 			} else if (_roomNumber == 53) {
 				if (g_engine->_objectVar[79] != 3) {
@@ -916,8 +916,8 @@ void Darkseed::Room::runRoomObjects() {
 						yPos,
 						&sprite,
 						255,
-						sprite.width,
-						sprite.height,
+						sprite._width,
+						sprite._height,
 						false);
 				}
 			} else if (((((((_roomNumber == 6) || (_roomNumber == 5)) || (_roomNumber == 7)) ||
@@ -941,14 +941,14 @@ void Darkseed::Room::runRoomObjects() {
 						yPos,
 						&sprite,
 						1,
-						sprite.width,
-						sprite.height,
+						sprite._width,
+						sprite._height,
 						false);
 				} else if ((_roomNumber != 64 || g_engine->_currentTimeInSeconds < 64801 || spriteNum == 3 || spriteNum > 13) &&
 						      (
-							   g_engine->isPlayingAnimation_maybe ||
-							   _locationSprites.getAnimAt(roomObj.spriteNum).numFrames > 1 ||
-							   (playerLeftXPos <= xPos + sprite.width && xPos <= playerRightXPos && g_engine->_player->_position.x <= xPos + sprite.width) ||
+							   g_engine->_isPlayingAnimation_maybe ||
+							   _locationSprites.getAnimAt(roomObj.spriteNum)._numFrames > 1 ||
+							   (playerLeftXPos <= xPos + sprite._width && xPos <= playerRightXPos && g_engine->_player->_position.x <= xPos + sprite._width) ||
 							   g_engine->_objectVar[141] == 6 ||
 							   g_engine->_objectVar[141] == 12
 							  )
@@ -957,9 +957,9 @@ void Darkseed::Room::runRoomObjects() {
 						xPos,
 						yPos,
 						&sprite,
-						240 - (yPos + sprite.height),
-						sprite.width,
-						sprite.height,
+						240 - (yPos + sprite._height),
+						sprite._width,
+						sprite._height,
 						false);
 				}
 			} else {
@@ -969,8 +969,8 @@ void Darkseed::Room::runRoomObjects() {
 					yPos,
 					&sprite,
 					255,
-					sprite.width,
-					sprite.height,
+					sprite._width,
+					sprite._height,
 					false);
 			}
 			if (_roomNumber == 57 && g_engine->_previousRoomNumber == 54 && spriteNum < 6) {
@@ -993,175 +993,175 @@ void Darkseed::Room::runRoomObjects() {
 		if (g_engine->_objectVar.getMoveObjectRoom(i) == _roomNumber) {
 			const Sprite &sprite = g_engine->_baseSprites.getSpriteAt(i);
 			Common::Point pos = g_engine->_objectVar.getMoveObjectPosition(i);
-			calculateScaledSpriteDimensions(sprite.width, sprite.height, pos.y + sprite.height);
-			g_engine->_sprites.addSpriteToDrawList((pos.x + sprite.width / 2) - g_engine->scaledSpriteWidth / 2, pos.y, &sprite, 255, sprite.width, sprite.height, false);
+			calculateScaledSpriteDimensions(sprite._width, sprite._height, pos.y + sprite._height);
+			g_engine->_sprites.addSpriteToDrawList((pos.x + sprite._width / 2) - g_engine->_scaledSpriteWidth / 2, pos.y, &sprite, 255, sprite._width, sprite._height, false);
 		}
 	}
 
 	if (_roomNumber == 59 && g_engine->_objectVar[190] > 1) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
-		g_engine->_sprites.addSpriteToDrawList(490, 70, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(490, 70, &sprite, 255, sprite._width, sprite._height, false);
 	}
 	if (_roomNumber == 56 && g_engine->_objectVar[187] == 1) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(3);
-		g_engine->_sprites.addSpriteToDrawList(431, 66, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(431, 66, &sprite, 255, sprite._width, sprite._height, false);
 	}
 	if (_roomNumber == 30 && g_engine->_objectVar[29] == 2) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
-		g_engine->_sprites.addSpriteToDrawList(201, 140, &sprite, 255, sprite.width, sprite.height, false);
-		updateRoomObj(113, 201, sprite.width, 140, sprite.height);
+		g_engine->_sprites.addSpriteToDrawList(201, 140, &sprite, 255, sprite._width, sprite._height, false);
+		updateRoomObj(113, 201, sprite._width, 140, sprite._height);
 	}
 	if (_roomNumber == 18 && (g_engine->_objectVar[80] == 0 || g_engine->_objectVar[80] == 2)) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
-		g_engine->_sprites.addSpriteToDrawList(361, 127, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(361, 127, &sprite, 255, sprite._width, sprite._height, false);
 	}
 	if (_roomNumber == 0 && g_engine->_objectVar[78] == 2) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
-		g_engine->_sprites.addSpriteToDrawList(519, 80, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(519, 80, &sprite, 255, sprite._width, sprite._height, false);
 	}
-	if (_roomNumber == 0 && g_engine->isPlayingAnimation_maybe) {
+	if (_roomNumber == 0 && g_engine->_isPlayingAnimation_maybe) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(1);
-		g_engine->_sprites.addSpriteToDrawList(111, 136, &sprite, 1, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(111, 136, &sprite, 1, sprite._width, sprite._height, false);
 	}
 	if (_roomNumber == 2 && g_engine->_player->_isAutoWalkingToBed && g_engine->_player->_position.x < 150) {
 		g_engine->_objectVar[78] = 2; // open door for player.
 	}
 	if (_roomNumber == 2 && g_engine->_objectVar[78] == 2) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
-		g_engine->_sprites.addSpriteToDrawList(69, 104, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(69, 104, &sprite, 255, sprite._width, sprite._height, false);
 	}
 	if (_roomNumber == 9 && g_engine->_objectVar[59] == 2) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
-		g_engine->_sprites.addSpriteToDrawList(519, 77, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(519, 77, &sprite, 255, sprite._width, sprite._height, false);
 	}
 	if (g_engine->_player->_isAutoWalkingToBed && g_engine->_player->_position.x < 150 && _roomNumber == 3) {
 		g_engine->_objectVar[59] = 2;
 	}
 	if (_roomNumber == 3 && g_engine->_objectVar[59] == 2) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
-		g_engine->_sprites.addSpriteToDrawList(69, 105, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(69, 105, &sprite, 255, sprite._width, sprite._height, false);
 	}
 	if (_roomNumber == 17) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(21);
-		g_engine->_sprites.addSpriteToDrawList(69, 91, &sprite, 240 - (91 + sprite.height), sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(69, 91, &sprite, 240 - (91 + sprite._height), sprite._width, sprite._height, false);
 	}
 	if (_roomNumber == 32 && g_engine->_objectVar[23] != 0) { // rope garden room
 		const Sprite &sprite = _locationSprites.getSpriteAt(15);
-		g_engine->_sprites.addSpriteToDrawList(338, 46, &sprite, 255, sprite.width, sprite.height, false);
-		updateRoomObj(102, 338, sprite.width, 46, sprite.height);
+		g_engine->_sprites.addSpriteToDrawList(338, 46, &sprite, 255, sprite._width, sprite._height, false);
+		updateRoomObj(102, 338, sprite._width, 46, sprite._height);
 	}
 	if (_roomNumber == 13 && g_engine->_objectVar[23] != 0) { // rope balcony
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
-		g_engine->_sprites.addSpriteToDrawList(473, 116, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(473, 116, &sprite, 255, sprite._width, sprite._height, false);
 	}
 	if (_roomNumber == 14) { // tuttle tome
 		if (g_engine->_objectVar[99] == 0) {
-			if (!g_engine->isPlayingAnimation_maybe || g_engine->otherNspAnimationType_maybe != 23) {
+			if (!g_engine->_isPlayingAnimation_maybe || g_engine->_otherNspAnimationType_maybe != 23) {
 				const Sprite &sprite = _locationSprites.getSpriteAt(g_engine->_objectVar[66] != 0 ? 1 : 0);
-				g_engine->_sprites.addSpriteToDrawList(245, 140, &sprite, 255, sprite.width, sprite.height, false);
+				g_engine->_sprites.addSpriteToDrawList(245, 140, &sprite, 255, sprite._width, sprite._height, false);
 				const Sprite &sprite1 = _locationSprites.getSpriteAt(g_engine->_objectVar[67] == 0 ? 2 : 3);
-				g_engine->_sprites.addSpriteToDrawList(295, 93, &sprite1, 255, sprite1.width, sprite1.height, false);
+				g_engine->_sprites.addSpriteToDrawList(295, 93, &sprite1, 255, sprite1._width, sprite1._height, false);
 				const Sprite &sprite2 = _locationSprites.getSpriteAt(g_engine->_objectVar[68] == 0 ? 4 : 5);
-				g_engine->_sprites.addSpriteToDrawList(334, 153, &sprite2, 255, sprite2.width, sprite2.height, false);
+				g_engine->_sprites.addSpriteToDrawList(334, 153, &sprite2, 255, sprite2._width, sprite2._height, false);
 			} else {
 				advanceLocAnimFrame(0);
 				if (!g_engine->_ObjRestarted) {
-					const Sprite &sprite = _locationSprites.getSpriteAt(_locationSprites.getAnimAt(0).frameNo[_locObjFrame[0]]);
-					g_engine->_sprites.addSpriteToDrawList(245, 93, &sprite, 255, sprite.width, sprite.height, false);
+					const Sprite &sprite = _locationSprites.getSpriteAt(_locationSprites.getAnimAt(0)._frameNo[_locObjFrame[0]]);
+					g_engine->_sprites.addSpriteToDrawList(245, 93, &sprite, 255, sprite._width, sprite._height, false);
 				} else {
 					const Sprite &sprite = _locationSprites.getSpriteAt(9);
-					g_engine->_sprites.addSpriteToDrawList(245, 93, &sprite, 255, sprite.width, sprite.height, false);
+					g_engine->_sprites.addSpriteToDrawList(245, 93, &sprite, 255, sprite._width, sprite._height, false);
 				}
 			}
 		} else {
 			const Sprite &sprite = _locationSprites.getSpriteAt(9);
-			g_engine->_sprites.addSpriteToDrawList(245, 93, &sprite, 255, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(245, 93, &sprite, 255, sprite._width, sprite._height, false);
 		}
 	}
 	if (_roomNumber == 34) { // in car
 		if (g_engine->_objectVar[86] != 0) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(0);
-			g_engine->_sprites.addSpriteToDrawList(470, 124, &sprite, 255, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(470, 124, &sprite, 255, sprite._width, sprite._height, false);
 		}
 		if (g_engine->_objectVar[71] != 0) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(26);
-			g_engine->_sprites.addSpriteToDrawList(261, 165, &sprite, 255, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(261, 165, &sprite, 255, sprite._width, sprite._height, false);
 		}
 	}
 	if (_roomNumber == 33) { // in garage
-		if (g_engine->isPlayingAnimation_maybe && g_engine->otherNspAnimationType_maybe == 25) {
+		if (g_engine->_isPlayingAnimation_maybe && g_engine->_otherNspAnimationType_maybe == 25) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(0);
-			g_engine->_sprites.addSpriteToDrawList(370, 128, &sprite, 255, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(370, 128, &sprite, 255, sprite._width, sprite._height, false);
 		}
 		if (g_engine->_objectVar[101] >= 1 && g_engine->_objectVar[101] <= 3) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(1);
-			g_engine->_sprites.addSpriteToDrawList(488, 127, &sprite, 255, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(488, 127, &sprite, 255, sprite._width, sprite._height, false);
 		}
 	}
 	if (_roomNumber == 9) { // study
 		int moveObj = g_engine->_objectVar.getMoveObjectRoom(34);
 		if (moveObj == 100 || (moveObj >= 252 && moveObj <= 254)) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(2);
-			g_engine->_sprites.addSpriteToDrawList(322, 147, &sprite, 255, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(322, 147, &sprite, 255, sprite._width, sprite._height, false);
 		}
 	}
 	if (_roomNumber == 7 && g_engine->_objectVar[137] == 0) { // mirror
 		const Sprite &sprite = _locationSprites.getSpriteAt(8);
-		g_engine->_sprites.addSpriteToDrawList(455, 149, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(455, 149, &sprite, 255, sprite._width, sprite._height, false);
 	}
 	if (_roomNumber == 62 && g_engine->_objectVar[25] != 0) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
-		g_engine->_sprites.addSpriteToDrawList(291, 185, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(291, 185, &sprite, 255, sprite._width, sprite._height, false);
 	}
 	if (_roomNumber == 11 && g_engine->_currentTimeInSeconds > 64800) { // street
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
-		g_engine->_sprites.addSpriteToDrawList(424, 182, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(424, 182, &sprite, 255, sprite._width, sprite._height, false);
 	}
 	if (_roomNumber == 64 && g_engine->_currentTimeInSeconds > 64800) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
-		g_engine->_sprites.addSpriteToDrawList(212, 124, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(212, 124, &sprite, 255, sprite._width, sprite._height, false);
 		const Sprite &sprite2 = _locationSprites.getSpriteAt(1);
-		g_engine->_sprites.addSpriteToDrawList(305, 124, &sprite2, 255, sprite2.width, sprite2.height, false);
+		g_engine->_sprites.addSpriteToDrawList(305, 124, &sprite2, 255, sprite2._width, sprite2._height, false);
 		const Sprite &sprite3 = _locationSprites.getSpriteAt(2);
-		g_engine->_sprites.addSpriteToDrawList(322, 138, &sprite3, 255, sprite3.width, sprite3.height, false);
+		g_engine->_sprites.addSpriteToDrawList(322, 138, &sprite3, 255, sprite3._width, sprite3._height, false);
 	}
 	if (_roomNumber == 39 && g_engine->_objectVar[117] != 0) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(12);
-		g_engine->_sprites.addSpriteToDrawList(190, 68, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(190, 68, &sprite, 255, sprite._width, sprite._height, false);
 	}
 	if (_roomNumber == 8) { // kitchen
 		if (g_engine->_objectVar[104] != 0) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(0);
-			g_engine->_sprites.addSpriteToDrawList(194, 162, &sprite, 255, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(194, 162, &sprite, 255, sprite._width, sprite._height, false);
 		}
 		if (g_engine->_objectVar[105] != 0) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(1);
-			g_engine->_sprites.addSpriteToDrawList(230, 162, &sprite, 255, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(230, 162, &sprite, 255, sprite._width, sprite._height, false);
 		}
 		if (g_engine->_objectVar[106] != 0) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(2);
-			g_engine->_sprites.addSpriteToDrawList(266, 162, &sprite, 255, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(266, 162, &sprite, 255, sprite._width, sprite._height, false);
 		}
 		if (g_engine->_objectVar[107] != 0) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(3);
-			g_engine->_sprites.addSpriteToDrawList(302, 162, &sprite, 255, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(302, 162, &sprite, 255, sprite._width, sprite._height, false);
 		}
 		if (g_engine->_objectVar[108] != 0) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(4);
-			g_engine->_sprites.addSpriteToDrawList(452, 158, &sprite, 255, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(452, 158, &sprite, 255, sprite._width, sprite._height, false);
 		}
 		if (g_engine->_objectVar[109] != 0) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(5);
-			g_engine->_sprites.addSpriteToDrawList(300, 151, &sprite, 254, sprite.width, sprite.height, false);
+			g_engine->_sprites.addSpriteToDrawList(300, 151, &sprite, 254, sprite._width, sprite._height, false);
 		}
 		if (g_engine->_objectVar[110] != 0) { // tap drip
-			const Sprite &sprite = _locationSprites.getSpriteAt((g_engine->counter_2c85_888b & 1) + 6); // TODO double check counter_2c85_888b is actually _ConstantTick
-			g_engine->_sprites.addSpriteToDrawList(266, 141, &sprite, 255, sprite.width, sprite.height, false);
+			const Sprite &sprite = _locationSprites.getSpriteAt((g_engine->_counter_2c85_888b & 1) + 6); // TODO double check counter_2c85_888b is actually _ConstantTick
+			g_engine->_sprites.addSpriteToDrawList(266, 141, &sprite, 255, sprite._width, sprite._height, false);
 		}
 	}
 	if (_roomNumber == 7 && g_engine->_objectVar[137] == 2) {
 		const Sprite &sprite = g_engine->_player->_animations.getSpriteAt(12);
-		g_engine->_sprites.addSpriteToDrawList(428, 78, &sprite, 255, sprite.width, sprite.height, false);
+		g_engine->_sprites.addSpriteToDrawList(428, 78, &sprite, 255, sprite._width, sprite._height, false);
 	}
 }
 
@@ -1233,18 +1233,18 @@ void Darkseed::Room::drawTrunk() {
 	}
 
 	const Sprite &sprite = _locationSprites.getSpriteAt(spriteIdx);
-	g_engine->sprite_y_scaling_threshold_maybe = 211;
-	calculateScaledSpriteDimensions(sprite.width, sprite.height, trunkYPos + sprite.height);
-	g_engine->sprite_y_scaling_threshold_maybe = 240;
+	g_engine->_sprite_y_scaling_threshold_maybe = 211;
+	calculateScaledSpriteDimensions(sprite._width, sprite._height, trunkYPos + sprite._height);
+	g_engine->_sprite_y_scaling_threshold_maybe = 240;
 	updateRoomObj(42, trunkXPos + 20, 6, trunkYPos + 34, 8);
 	updateRoomObj(22, trunkXPos + 60, 12, trunkYPos + 46, 8);
 	g_engine->_sprites.addSpriteToDrawList(
 		trunkXPos,
-		trunkYPos + sprite.height - g_engine->scaledSpriteHeight,
+		trunkYPos + sprite._height - g_engine->_scaledSpriteHeight,
 		&sprite,
 		254,
-		g_engine->scaledSpriteWidth,
-		g_engine->scaledSpriteHeight,
+		g_engine->_scaledSpriteWidth,
+		g_engine->_scaledSpriteHeight,
 		false);
 	return;
 }
@@ -1255,11 +1255,11 @@ void Darkseed::Room::advanceLocAnimFrame(int roomObjIdx) {
 	_locObjFrameTimer[roomObjIdx]--;
 	if (_locObjFrameTimer[roomObjIdx] < 1) {
 		_locObjFrame[roomObjIdx]++;
-		if (_locObjFrame[roomObjIdx] == anim.numFrames) {
+		if (_locObjFrame[roomObjIdx] == anim._numFrames) {
 			_locObjFrame[roomObjIdx] = 0;
 			g_engine->_ObjRestarted = true;
 		}
-		_locObjFrameTimer[roomObjIdx] = anim.frameDuration[_locObjFrame[roomObjIdx]];
+		_locObjFrameTimer[roomObjIdx] = anim._frameDuration[_locObjFrame[roomObjIdx]];
 	}
 }
 
@@ -1271,11 +1271,11 @@ bool Darkseed::Room::advanceFrame(int animIdx) {
 	if (_locObjFrameTimer[animIdx] < 1) {
 		g_engine->_FrameAdvanced = true;
 		_locObjFrame[animIdx]++;
-		if (_locObjFrame[animIdx] == anim.numFrames) {
+		if (_locObjFrame[animIdx] == anim._numFrames) {
 			_locObjFrame[animIdx] = 0;
 			g_engine->_ObjRestarted = true;
 		}
-		_locObjFrameTimer[animIdx] = anim.frameDuration[_locObjFrame[animIdx]];
+		_locObjFrameTimer[animIdx] = anim._frameDuration[_locObjFrame[animIdx]];
 	}
 	return g_engine->_FrameAdvanced;
 }
@@ -1283,10 +1283,10 @@ bool Darkseed::Room::advanceFrame(int animIdx) {
 void Darkseed::Room::mikeStickThrowAnim() {
 	advanceFrame(2);
 	if (!g_engine->_ObjRestarted) {
-		g_engine->_player->_frameIdx = _locationSprites.getAnimAt(2).frameNo[_locObjFrame[2]];
+		g_engine->_player->_frameIdx = _locationSprites.getAnimAt(2)._frameNo[_locObjFrame[2]];
 	} else {
 		g_engine->_objectVar[79] = 1;
-		g_engine->isPlayingAnimation_maybe = false;
+		g_engine->_isPlayingAnimation_maybe = false;
 		g_engine->_inventory.removeItem(19);
 		g_engine->_objectVar.setMoveObjectRoom(19, 100);
 	}
@@ -1302,12 +1302,12 @@ void Darkseed::Room::loadRoom61AWalkableLocations() {
 	file.seek(0x7f);
 
 	for (int i = 0; i < 16; i++) {
-		file.read(walkableLocationsMap[i].strip, 40);
+		file.read(_walkableLocationsMap[i].strip, 40);
 	}
 }
 
 void Darkseed::Room::restorePalette() {
-	palLoaded = false;
+	_palLoaded = false;
 }
 
 void Darkseed::Room::darkenSky() {
@@ -1318,11 +1318,11 @@ void Darkseed::Room::darkenSky() {
 			timeOffset = 1;
 		}
 		for (int i = 0; i < DARKSEED_PAL_SIZE; i++) {
-			uint8 p = workPal.palData[i];
+			uint8 p = workPal._palData[i];
 			if (p == 0) {
 				p = 1;
 			}
-			workPal.palData[i] = p - (p / (26 - timeOffset / 750));
+			workPal._palData[i] = p - (p / (26 - timeOffset / 750));
 		}
 		workPal.installPalette();
 	}
@@ -1331,14 +1331,14 @@ void Darkseed::Room::darkenSky() {
 void Darkseed::Room::loadLocationSprites(const Common::Path &path) {
 	_locationSprites.load(path);
 	for (int i = 0; i < _locationSprites.getTotalAnim(); i++) {
-		_locObjFrameTimer[i] = _locationSprites.getAnimAt(i).frameDuration[0];
+		_locObjFrameTimer[i] = _locationSprites.getAnimAt(i)._frameDuration[0];
 	}
 }
 
 Common::Point Darkseed::Room::getExitPointForRoom(uint8 roomNumber) {
-	for (unsigned int i = 0; i < room1.size(); i++) {
-		if (room1[i].roomNumber == roomNumber) {
-			return Common::Point(room1[i].x, room1[i].y);
+	for (unsigned int i = 0; i < _room1.size(); i++) {
+		if (_room1[i].roomNumber == roomNumber) {
+			return Common::Point(_room1[i].x, _room1[i].y);
 		}
 	}
 	return Common::Point();
diff --git a/engines/darkseed/room.h b/engines/darkseed/room.h
index ad4468a8763..73125e393d9 100644
--- a/engines/darkseed/room.h
+++ b/engines/darkseed/room.h
@@ -55,22 +55,22 @@ struct RoomObjElement {
 
 class Room {
 private:
-	bool palLoaded = false;
+	bool _palLoaded = false;
 public:
 	static constexpr int MAX_CONNECTORS = 12;
 	uint8 _roomNumber;
-	Pic pic;
+	Pic _pic;
 	Pal _pal;
 	Nsp _locationSprites;
 	Common::Array<int16> _locObjFrame;
 	Common::Array<int16> _locObjFrameTimer;
 
-	Common::Array<RoomExit> room1;
-	Common::Array<RoomStruct2> walkableLocationsMap;
+	Common::Array<RoomExit> _room1;
+	Common::Array<RoomStruct2> _walkableLocationsMap;
 	Common::Array<RoomObjElement> _roomObj;
 	Common::Array<Common::Point> _connectors;
 
-	uint16 selectedObjIndex = 0;
+	uint16 _selectedObjIndex = 0;
 	int16 _collisionType = 0;
 
 public:
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
index 2c23cc2682a..8bc97d0eb8f 100644
--- a/engines/darkseed/sprites.cpp
+++ b/engines/darkseed/sprites.cpp
@@ -25,11 +25,11 @@
 #define DARKSEED_MAX_SPRITES_ON_SCREEN 30
 
 Darkseed::Sprites::Sprites() {
-	spriteDrawList.reserve(DARKSEED_MAX_SPRITES_ON_SCREEN);
+	_spriteDrawList.reserve(DARKSEED_MAX_SPRITES_ON_SCREEN);
 }
 
 void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Darkseed::Sprite *sprite, uint8 order, uint16 destW, uint16 destH, bool flip) {
-	if (spriteDrawList.size() == DARKSEED_MAX_SPRITES_ON_SCREEN || destX >= 570) {
+	if (_spriteDrawList.size() == DARKSEED_MAX_SPRITES_ON_SCREEN || destX >= 570) {
 		return;
 	}
 
@@ -42,30 +42,30 @@ void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Da
 	drawInstruction.destH = destH;
 	drawInstruction.flip = flip;
 
-	if (!spriteDrawList.empty()) {
+	if (!_spriteDrawList.empty()) {
 		uint insertLocation = 0;
-		for (; insertLocation < spriteDrawList.size(); insertLocation++) {
-			if (order < spriteDrawList[insertLocation].order) {
+		for (; insertLocation < _spriteDrawList.size(); insertLocation++) {
+			if (order < _spriteDrawList[insertLocation].order) {
 				break;
 			}
 		}
-		spriteDrawList.insert_at(insertLocation, drawInstruction);
+		_spriteDrawList.insert_at(insertLocation, drawInstruction);
 	} else {
-		spriteDrawList.push_back(drawInstruction);
+		_spriteDrawList.push_back(drawInstruction);
 	}
 }
 
 void Darkseed::Sprites::clearSpriteDrawList() {
 	// not using clear() here to avoid freeing array storage memory.
-	while (!spriteDrawList.empty()) {
-		spriteDrawList.pop_back();
+	while (!_spriteDrawList.empty()) {
+		_spriteDrawList.pop_back();
 	}
 }
 
 void Darkseed::Sprites::drawSprites() {
-	for (int i = spriteDrawList.size() - 1; i >= 0; i--) {
-		SpriteDrawInstruction &drawInstruction = spriteDrawList[i];
-		if (drawInstruction.sprite->width == drawInstruction.destW && drawInstruction.sprite->height == drawInstruction.destH && !drawInstruction.flip) {
+	for (int i = _spriteDrawList.size() - 1; i >= 0; i--) {
+		SpriteDrawInstruction &drawInstruction = _spriteDrawList[i];
+		if (drawInstruction.sprite->_width == drawInstruction.destW && drawInstruction.sprite->_height == drawInstruction.destH && !drawInstruction.flip) {
 			drawInstruction.sprite->draw(drawInstruction.destX, drawInstruction.destY, g_engine->_frameBottom); // TODO add support for flipping sprite.
 		} else {
 			drawInstruction.sprite->drawScaled(drawInstruction.destX, drawInstruction.destY, drawInstruction.destW, drawInstruction.destH, drawInstruction.flip);
diff --git a/engines/darkseed/sprites.h b/engines/darkseed/sprites.h
index 4526154fff8..0e9aa00bac8 100644
--- a/engines/darkseed/sprites.h
+++ b/engines/darkseed/sprites.h
@@ -41,7 +41,7 @@ struct SpriteDrawInstruction {
 
 class Sprites {
 private:
-	Common::Array<SpriteDrawInstruction> spriteDrawList;
+	Common::Array<SpriteDrawInstruction> _spriteDrawList;
 public:
 	Sprites();
 	void addSpriteToDrawList(uint16 destX, uint16 destY, const Sprite *sprite, uint8 order, uint16 destW, uint16 destH, bool flip);
diff --git a/engines/darkseed/titlefont.cpp b/engines/darkseed/titlefont.cpp
index 060de5bebf4..b5f99c72e22 100644
--- a/engines/darkseed/titlefont.cpp
+++ b/engines/darkseed/titlefont.cpp
@@ -27,7 +27,7 @@ namespace Darkseed {
 extern DarkseedEngine *g_engine;
 
 TitleFont::TitleFont() {
-	letters.load("art/letters.anm");
+	_letters.load("art/letters.anm");
 }
 
 uint8 letterIndexLookupTbl[] = {
@@ -64,8 +64,8 @@ void TitleFont::displayString(uint16 x, uint16 y, const Common::String &text) {
 		Img letterShadow;
 		Img letter;
 		int letterId = letterIndexLookupTbl[text[i] - 45];
-		letters.getImg(letterId, letterShadow, false);
-		letters.getImg(letterId + 1, letter, false);
+		_letters.getImg(letterId, letterShadow, false);
+		_letters.getImg(letterId + 1, letter, false);
 
 		int w = letterWidthLookupTbl[letterId / 2];
 		letterShadow.drawAt(x, y, 2, w - 1); // TODO the original doesn't seem to need to override the width here.
diff --git a/engines/darkseed/titlefont.h b/engines/darkseed/titlefont.h
index 6a065137464..66147d5fb31 100644
--- a/engines/darkseed/titlefont.h
+++ b/engines/darkseed/titlefont.h
@@ -27,7 +27,7 @@ namespace Darkseed {
 
 class TitleFont {
 private:
-	Anm letters;
+	Anm _letters;
 
 public:
 	TitleFont();
diff --git a/engines/darkseed/tostext.cpp b/engines/darkseed/tostext.cpp
index 6a7309e08c2..d95d996a249 100644
--- a/engines/darkseed/tostext.cpp
+++ b/engines/darkseed/tostext.cpp
@@ -30,25 +30,25 @@ bool TosText::load() {
 	if (!tostextFile.open("tostext.bin")) {
 		return false;
 	}
-	numEntries = tostextFile.readUint16LE() / 2;
-	textArray.resize(numEntries);
+	_numEntries = tostextFile.readUint16LE() / 2;
+	_textArray.resize(_numEntries);
 
-	for (int i = 0; i < numEntries; i++) {
-		textArray[i] = loadString(tostextFile, i);
+	for (int i = 0; i < _numEntries; i++) {
+		_textArray[i] = loadString(tostextFile, i);
 	}
 	return true;
 }
 
 const Common::String &TosText::getText(uint16 textIndex) {
-	assert(textIndex < numEntries);
-	return textArray[textIndex];
+	assert(textIndex < _numEntries);
+	return _textArray[textIndex];
 }
 
 Common::String TosText::loadString(Common::File &file, uint16 index) const {
 	Common::String str;
 	file.seek(index * 2, SEEK_SET);
 	auto startOffset = file.readUint16LE();
-	uint16 strLen = index == numEntries - 1
+	uint16 strLen = index == _numEntries - 1
 						? file.size() - startOffset
 						: file.readUint16LE() - startOffset;
 	file.seek(startOffset, SEEK_SET);
@@ -59,7 +59,7 @@ Common::String TosText::loadString(Common::File &file, uint16 index) const {
 }
 
 uint16 TosText::getNumEntries() const {
-	return numEntries;
+	return _numEntries;
 }
 
 } // namespace Darkseed
diff --git a/engines/darkseed/tostext.h b/engines/darkseed/tostext.h
index 17f31a2e835..36fe3154ca8 100644
--- a/engines/darkseed/tostext.h
+++ b/engines/darkseed/tostext.h
@@ -31,8 +31,8 @@ namespace Darkseed {
 
 class TosText {
 private:
-	Common::Array<Common::String> textArray;
-	uint16 numEntries = 0;
+	Common::Array<Common::String> _textArray;
+	uint16 _numEntries = 0;
 
 public:
 	bool load();


Commit: 6383e97ae0fcfb4591b1ed386ee3fd19822d4572
    https://github.com/scummvm/scummvm/commit/6383e97ae0fcfb4591b1ed386ee3fd19822d4572
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Use Common::StringArray

Changed paths:
    engines/darkseed/console.cpp
    engines/darkseed/console.h
    engines/darkseed/tostext.h


diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index 54f4e20edeb..e5770ca5c90 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -72,8 +72,8 @@ void Console::draw() {
 	g_engine->_screen->addDirtyRect(consoleArea);
 }
 
-Common::Array<Common::String> Console::wrapText(const Common::String &text) {
-	Common::Array<Common::String> lines;
+Common::StringArray Console::wrapText(const Common::String &text) {
+	Common::StringArray lines;
 	Common::String line;
 	Common::String word;
 	int lineLength = 0;
diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
index c3cb129df25..e37d7ede8ba 100644
--- a/engines/darkseed/console.h
+++ b/engines/darkseed/console.h
@@ -36,7 +36,7 @@ private:
 	GameFont _font;
 	Sound *_sound;
 
-	Common::Array<Common::String> _text;
+	Common::StringArray _text;
 	int _startIdx = 0;
 	bool _redrawRequired = false;
 
@@ -50,7 +50,7 @@ public:
 	void draw();
 
 private:
-	Common::Array<Common::String> wrapText(const Common::String &text);
+	Common::StringArray wrapText(const Common::String &text);
 	void addLine(const Common::String &line);
 };
 
diff --git a/engines/darkseed/tostext.h b/engines/darkseed/tostext.h
index 36fe3154ca8..4726e1f0af7 100644
--- a/engines/darkseed/tostext.h
+++ b/engines/darkseed/tostext.h
@@ -31,7 +31,7 @@ namespace Darkseed {
 
 class TosText {
 private:
-	Common::Array<Common::String> _textArray;
+	Common::StringArray _textArray;
 	uint16 _numEntries = 0;
 
 public:


Commit: fd18088186bba383c3d776e53c5c299391efd4ca
    https://github.com/scummvm/scummvm/commit/fd18088186bba383c3d776e53c5c299391efd4ca
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix capitalisation on class variable names

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


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 3ac12cd9334..1d08a2bc574 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1451,7 +1451,7 @@ void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 	_otherNspAnimationType_maybe = animId;
 
 	_player_sprite_related_2c85_82f3 = 0;
-	_ObjRestarted = false;
+	_objRestarted = false;
 
 	if (_otherNspAnimationType_maybe < 2) {
 		return;
@@ -1569,7 +1569,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 1 : // sleep wake anim
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			_player->_position.x = 0xdf;
@@ -1581,7 +1581,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 2:
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			_player->_position.x = 218;
@@ -1596,7 +1596,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 3:
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			if (_room->isGiger()) {
@@ -1618,7 +1618,7 @@ void DarkseedEngine::updateAnimation() {
 			_player->_animations.getAnimAt(0)._frameDuration[_animIndexTbl[0]] == _spriteAnimCountdownTimer[0]) {
 			playSound(14, 5, -1);
 		}
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			_isPlayingAnimation_maybe = false;
@@ -1642,7 +1642,7 @@ void DarkseedEngine::updateAnimation() {
 		_player->_position.x = 135;
 		_player->_position.y = 91;
 		advanceAnimationFrame(1);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]];
 		} else {
 			gotonextmorning(); // TODO there might be some extra logic required from original function
@@ -1659,10 +1659,10 @@ void DarkseedEngine::updateAnimation() {
 		} else {
 			advanceAnimationFrame(2);
 		}
-		if (_FrameAdvanced && ((currentRoomNumber == 6 && _animIndexTbl[1] == 1) || (currentRoomNumber == 5 && _animIndexTbl[2] == 1))) {
+		if (_frameAdvanced && ((currentRoomNumber == 6 && _animIndexTbl[1] == 1) || (currentRoomNumber == 5 && _animIndexTbl[2] == 1))) {
 //			FUN_1208_0dac_sound_related(0xd,CONCAT11(uVar4,5));
 		}
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			if (currentRoomNumber == 6) {
 				_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]];
 			} else {
@@ -1681,10 +1681,10 @@ void DarkseedEngine::updateAnimation() {
 	case 7: // stairs down
 		if (currentRoomNumber == 5) {
 			advanceAnimationFrame(3);
-			if (_FrameAdvanced && _animIndexTbl[3] == 1) {
+			if (_frameAdvanced && _animIndexTbl[3] == 1) {
 				// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
 			}
-			if (!_ObjRestarted) {
+			if (!_objRestarted) {
 				_player->_frameIdx = _player->_animations.getAnimAt(3)._frameNo[_player->_animations.getAnimAt(3)._frameNo[_animIndexTbl[3]]];
 			} else {
 				_previousRoomNumber = 5;
@@ -1692,10 +1692,10 @@ void DarkseedEngine::updateAnimation() {
 			}
 		} else {
 			advanceAnimationFrame(0);
-			if (_FrameAdvanced && _animIndexTbl[0] == 1) {
+			if (_frameAdvanced && _animIndexTbl[0] == 1) {
 				// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
 			}
-			if (!_ObjRestarted) {
+			if (!_objRestarted) {
 				_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 			}
 		}
@@ -1710,7 +1710,7 @@ void DarkseedEngine::updateAnimation() {
 				_phoneStatus = 2;
 			}
 		}
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			if (_otherNspAnimationType_maybe == 8) {
 				_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 			} else {
@@ -1739,7 +1739,7 @@ void DarkseedEngine::updateAnimation() {
 	case 9: // hang up phone
 	case 64:
 		advanceAnimationFrame(1);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]];
 		} else {
 			_player->_position.x = 300;
@@ -1752,7 +1752,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 11:
 		advanceAnimationFrame(1);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
 		} else {
 			_player->_position.x = 175;
@@ -1767,7 +1767,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 12:
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			_player->_position.x = 360;
@@ -1780,7 +1780,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 13:
 		advanceAnimationFrame(1);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
 		} else {
 			_player->_position.x = 450;
@@ -1793,7 +1793,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 16: // climb down rope
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			_player->_position.x = 336;
@@ -1806,10 +1806,10 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 17: // open trunk with crowbar
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		}
-		if (_animIndexTbl[0] == 5 && _FrameAdvanced) {
+		if (_animIndexTbl[0] == 5 && _frameAdvanced) {
 			playSound(31, 5, -1);
 			_console->printTosText(666);
 			if (_objectVar[42] == 0) {
@@ -1821,10 +1821,10 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 18: // push trunk
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		}
-		if (_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]] == 3 && _FrameAdvanced) {
+		if (_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]] == 3 && _frameAdvanced) {
 			_console->printTosText(_objectVar[22] + 662);
 			_objectVar[22] = _objectVar[22] + 1;
 			if (_objectVar[22] == 3) {
@@ -1834,7 +1834,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 19: // pickup book from library
 		_player->_frameIdx = 24;
-		if (_ObjRestarted) {
+		if (_objRestarted) {
 			_isPlayingAnimation_maybe = true;
 			_objectVar[46] = 2;
 			libanim(true);
@@ -1842,7 +1842,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 20: // receive card from delbert
 		advanceAnimationFrame(3);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(3)._frameNo[_animIndexTbl[3]];
 		} else {
 			_inventory.addItem(18);
@@ -1850,7 +1850,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 23:
 		_player->_frameIdx = 24;
-		if (_ObjRestarted != 0) {
+		if (_objRestarted != 0) {
 			_isPlayingAnimation_maybe = false;
 			_objectVar[99] = 1;
 			_console->printTosText(468);
@@ -1858,7 +1858,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 10:
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
@@ -1871,7 +1871,7 @@ void DarkseedEngine::updateAnimation() {
 	case 25:
 		// Open doors
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			_player->updateSprite();
@@ -1910,7 +1910,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 26: // climb up rope.
 		advanceAnimationFrame(1);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
@@ -1919,7 +1919,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 27:
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]]; // TODO check if this is correct.
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
@@ -1928,7 +1928,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 28: // step out of mirror normal world
 		advanceAnimationFrame(1);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
 		} else {
 			_player->_position.x = 418;
@@ -1945,7 +1945,7 @@ void DarkseedEngine::updateAnimation() {
 		if (_isPlayingAnimation_maybe) {
 			_player->_frameIdx = _player->_animations.getAnimAt(animIdx)._frameNo[_animIndexTbl[animIdx]];
 		}
-		if (_ObjRestarted && _otherNspAnimationType_maybe == 30) {
+		if (_objRestarted && _otherNspAnimationType_maybe == 30) {
 			setupOtherNspAnimation(1, 31);
 		}
 		break;
@@ -1960,14 +1960,14 @@ void DarkseedEngine::updateAnimation() {
 		if (_isPlayingAnimation_maybe) {
 			_player->_frameIdx = _player->_animations.getAnimAt(animIdx)._frameNo[_animIndexTbl[animIdx]];
 		}
-		if (_ObjRestarted && (_otherNspAnimationType_maybe == 32 || _otherNspAnimationType_maybe == 33)) {
+		if (_objRestarted && (_otherNspAnimationType_maybe == 32 || _otherNspAnimationType_maybe == 33)) {
 			setupOtherNspAnimation(_otherNspAnimationType_maybe - 29, _otherNspAnimationType_maybe + 1);
 		}
 		break;
 	}
 	case 35: // pay shopkeeper
 		advanceAnimationFrame(6);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(6)._frameNo[_animIndexTbl[6]];
 		} else {
 			_objectVar[8]++;
@@ -1982,10 +1982,10 @@ void DarkseedEngine::updateAnimation() {
 	case 37: // smash mirror
 		advanceAnimationFrame(_otherNspAnimationType_maybe - 36);
 		_player->_frameIdx = _player->_animations.getAnimAt(_otherNspAnimationType_maybe - 36)._frameNo[_animIndexTbl[_otherNspAnimationType_maybe - 36]];
-		if (_FrameAdvanced && _otherNspAnimationType_maybe == 36 && _player->_frameIdx == 4) {
+		if (_frameAdvanced && _otherNspAnimationType_maybe == 36 && _player->_frameIdx == 4) {
 			playSound(28, 5, -1);
 		}
-		if (_ObjRestarted) {
+		if (_objRestarted) {
 			if (_otherNspAnimationType_maybe == 36) {
 				setupOtherNspAnimation(1, 37);
 			} else {
@@ -1997,7 +1997,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 38:
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			stuffPlayer();
@@ -2005,7 +2005,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 39: // Arrest Mike.
 		_room->advanceFrame(1);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _room->_locationSprites.getAnimAt(1)._frameNo[_room->_locObjFrame[1]];
 		} else {
 			throwmikeinjail();
@@ -2013,7 +2013,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 40: // give Delbert's card to cop.
 		advanceAnimationFrame(1);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
 		} else {
 			_console->printTosText(61);
@@ -2033,7 +2033,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 41:
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			_previousRoomNumber = _room->_roomNumber;
@@ -2042,7 +2042,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 42: // step out of mirror giger world
 		advanceAnimationFrame(1);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
 		} else {
 			_player->_position.x = 456;
@@ -2063,10 +2063,10 @@ void DarkseedEngine::updateAnimation() {
 		advanceAnimationFrame(iVar4);
 		_player->_frameIdx = _player->_animations.getAnimAt(iVar4)._frameNo[_player->_animations.getAnimAt(iVar4)._frameNo[_animIndexTbl[iVar4]]];
 //		_HeroSpr = (uint) * (byte *)((int)&DAT_1060_7eb8 + *(int *)((int)&_ObjFrame + iVar4 * 2) + iVar4 * 202);
-		if (!_ObjRestarted || (_otherNspAnimationType_maybe != 46 && _otherNspAnimationType_maybe != 44)) {
+		if (!_objRestarted || (_otherNspAnimationType_maybe != 46 && _otherNspAnimationType_maybe != 44)) {
 			if (_otherNspAnimationType_maybe == 45) {
 				_objectVar[117] = 1;
-			} else if (_ObjRestarted) {
+			} else if (_objRestarted) {
 				if ((_objectVar[71] == 2) && (_objectVar[44] != 0)) {
 					_console->printTosText(896);
 					_objectVar[57] = 1;
@@ -2091,7 +2091,7 @@ void DarkseedEngine::updateAnimation() {
 	case 52:
 		// open/close cupboards, oven
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			if (_otherNspAnimationType_maybe == 52) {
@@ -2107,7 +2107,7 @@ void DarkseedEngine::updateAnimation() {
 	case 55 :
 	case 56 :
 		advanceAnimationFrame((_otherNspAnimationType_maybe - 53) & 1);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			switch (_otherNspAnimationType_maybe) {
@@ -2135,7 +2135,7 @@ void DarkseedEngine::updateAnimation() {
 				break;
 			}
 		}
-		if (_FrameAdvanced && _animIndexTbl[0] == 1) {
+		if (_frameAdvanced && _animIndexTbl[0] == 1) {
 			// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
 			// PlaySound(1,5,-1);
 		}
@@ -2143,7 +2143,7 @@ void DarkseedEngine::updateAnimation() {
 	case 57:
 	case 58:
 		advanceAnimationFrame((_otherNspAnimationType_maybe - 57) & 1);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]; //_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
 		} else if (_otherNspAnimationType_maybe == 57) {
 			_previousRoomNumber = _room->_roomNumber;
@@ -2154,19 +2154,19 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 59: // use shard on mirror
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			_player->_direction = 1;
 			_player->updateSprite();
 		}
-		if (_FrameAdvanced && _player->_frameIdx == 3) {
+		if (_frameAdvanced && _player->_frameIdx == 3) {
 			playSound(26, 5, -1);
 		}
 		break;
 	case 60: // turn on alien computer
 		_room->advanceFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _room->_locationSprites.getAnimAt(0)._frameNo[_room->_locObjFrame[0]];
 		} else {
 			_isPlayingAnimation_maybe = false;
@@ -2175,7 +2175,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 61: // turn off alien computer
 		_room->advanceFrame(1);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _room->_locationSprites.getAnimAt(1)._frameNo[_room->_locObjFrame[1]];
 		} else {
 			_isPlayingAnimation_maybe = false;
@@ -2184,7 +2184,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 62: // bang cup against bars
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			bool bVar5 = _objectVar.getMoveObjectRoom(18) == 250;
@@ -2207,7 +2207,7 @@ void DarkseedEngine::updateAnimation() {
 		break;
 	case 65:
 		advanceAnimationFrame(0);
-		if (!_ObjRestarted) {
+		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			_player->updateSprite();
@@ -2224,18 +2224,18 @@ void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
 	} else {
 		_room->calculateScaledSpriteDimensions(10, 10, _player->_position.y);
 	}
-	_ObjRestarted = false;
-	_FrameAdvanced = false;
+	_objRestarted = false;
+	_frameAdvanced = false;
 	const Obt &anim = _player->_animations.getAnimAt(nspAminIdx);
 	_spriteAnimCountdownTimer[nspAminIdx] = _spriteAnimCountdownTimer[nspAminIdx] - 1;
 	if (_spriteAnimCountdownTimer[nspAminIdx] < 1) {
-		_FrameAdvanced = true;
+		_frameAdvanced = true;
 		_animIndexTbl[nspAminIdx] = _animIndexTbl[nspAminIdx] + 1;
 		_player->_position.x += ((int16)anim._deltaX[_animIndexTbl[nspAminIdx]] * _scaledWalkSpeed_maybe) / 1000;
 		_player->_position.y += ((int16)anim._deltaY[_animIndexTbl[nspAminIdx]] * _scaledWalkSpeed_maybe) / 1000;
 		if (_animIndexTbl[nspAminIdx] == anim._numFrames) {
 			_animIndexTbl[nspAminIdx] = 0;
-			_ObjRestarted = true;
+			_objRestarted = true;
 			_isPlayingAnimation_maybe = false;
 			_player->_walkTarget.x = _player->_position.x;
 			_player->_walkTarget.y = _player->_position.y;
@@ -2383,10 +2383,10 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 		_player->loadAnimations("pownex.nsp");
 		_animIndexTbl[0] = 0;
 		_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
-		_ObjRestarted = false;
+		_objRestarted = false;
 		int16 frameIdx = 0;
 		int16 prevFrameIdx = 0;
-		while (!_ObjRestarted) {
+		while (!_objRestarted) {
 			prevFrameIdx = frameIdx;
 			for (int i = 0; i < 6; i++) {
 				wait();
@@ -2408,8 +2408,8 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 
 		}
 
-		_ObjRestarted = false;
-		while (!_ObjRestarted) {
+		_objRestarted = false;
+		while (!_objRestarted) {
 			for (int i = 0; i < 6; i++) {
 				wait();
 			}
@@ -2743,16 +2743,16 @@ void DarkseedEngine::playSound(int16 unk, uint8 unk1, int16 unk2) {
 }
 
 void DarkseedEngine::nextFrame(int nspAminIdx) {
-	_ObjRestarted = false;
+	_objRestarted = false;
 	_spriteAnimCountdownTimer[nspAminIdx]--;
-	_FrameAdvanced = false;
+	_frameAdvanced = false;
 	if (_spriteAnimCountdownTimer[nspAminIdx] < 1) {
 		const Obt &anim = _player->_animations.getAnimAt(nspAminIdx);
 		_animIndexTbl[nspAminIdx]++;
-		_FrameAdvanced = true;
+		_frameAdvanced = true;
 		if (_animIndexTbl[nspAminIdx] == anim._numFrames) {
 			_animIndexTbl[nspAminIdx] = 0;
-			_ObjRestarted = true;
+			_objRestarted = true;
 		}
 		_spriteAnimCountdownTimer[nspAminIdx] = anim._frameDuration[_animIndexTbl[nspAminIdx]];
 	}
@@ -2860,19 +2860,19 @@ void DarkseedEngine::runObjects() {
 		g_engine->_objectVar[35]--;
 	}
 	if (((_room->_roomNumber == 46) || (_room->_roomNumber == 60)) &&
-		(((_SoundTimer & 15) == 0 && (g_engine->_objectVar[57] == 1)))) {
+		(((_soundTimer & 15) == 0 && (g_engine->_objectVar[57] == 1)))) {
 		playSound(9, 5, -1);
 	}
-	if ((_room->_roomNumber == 12) && (_SoundTimer > 5)) {
-		_SoundTimer = 0;
+	if ((_room->_roomNumber == 12) && (_soundTimer > 5)) {
+		_soundTimer = 0;
 	}
-	if (((_room->_roomNumber == 8) && (_SoundTimer > 5)) && (g_engine->_objectVar[110] != 0)) {
-		_SoundTimer = 0;
+	if (((_room->_roomNumber == 8) && (_soundTimer > 5)) && (g_engine->_objectVar[110] != 0)) {
+		_soundTimer = 0;
 	}
-	if ((_room->_roomNumber == 38) && ((_SoundTimer & 31) == 0)) {
+	if ((_room->_roomNumber == 38) && ((_soundTimer & 31) == 0)) {
 		playSound(23, 5, -1);
 	}
-	if ((_room->_roomNumber == 45) && ((_SoundTimer & 63) == 0)) {
+	if ((_room->_roomNumber == 45) && ((_soundTimer & 63) == 0)) {
 		playSound(10, 5, -1);
 	}
 
@@ -2904,10 +2904,10 @@ void DarkseedEngine::runObjects() {
 		// delbert drinks scotch
 		_room->advanceFrame(0);
 		delbertSpriteIdx = _room->_locationSprites.getAnimAt(0)._frameNo[_room->_locObjFrame[0]];
-		if (_FrameAdvanced && delbertSpriteIdx == 5) {
+		if (_frameAdvanced && delbertSpriteIdx == 5) {
 			playSound(32, 5, -1);
 		}
-		if (_ObjRestarted) {
+		if (_objRestarted) {
 			_objectVar[141] = 10;
 			_console->printTosText(910);
 			_inventory.removeItem(7);
@@ -2924,7 +2924,7 @@ void DarkseedEngine::runObjects() {
 		_room->advanceFrame(1);
 		delbertSpriteIdx = _room->_locationSprites.getAnimAt(1)._frameNo[_room->_locObjFrame[1]];
 		Common::Point delbertPos = _objectVar.getMoveObjectPosition(141);
-		if (_FrameAdvanced) {
+		if (_frameAdvanced) {
 			delbertPos.x += 10;
 			_objectVar.setMoveObjectPosition(141, delbertPos);
 		}
@@ -2965,7 +2965,7 @@ void DarkseedEngine::runObjects() {
 			_objectVar.setMoveObjectRoom(19, 100);
 			_room->advanceFrame(_objectVar[45] + 1);
 			Common::Point stickPosition = _objectVar.getMoveObjectPosition(19);
-			if (_ObjRestarted && _objectVar[45] < 2) {
+			if (_objRestarted && _objectVar[45] < 2) {
 				_objectVar[45] = (_objectVar[45] == 0) ? 1 : 0;
 				if (_objectVar[45] == 0) {
 					stickPosition = {230, 205};
@@ -2980,7 +2980,7 @@ void DarkseedEngine::runObjects() {
 			}
 			Common::Point fidoPosition = _objectVar.getMoveObjectPosition(45);
 			int16 fidoSpriteIdx = _room->_locationSprites.getAnimAt(_objectVar[45] + 1)._frameNo[_room->_locObjFrame[_objectVar[45] + 1]];
-			if (_FrameAdvanced) {
+			if (_frameAdvanced) {
 				if (_objectVar[45] == 2) {
 					fidoPosition.x += 30;
 					_objectVar.setMoveObjectPosition(45, fidoPosition);
@@ -3026,11 +3026,11 @@ void DarkseedEngine::runObjects() {
 		if (_player->_position.x == 290 && _player->_position.y == 209 && !_player->_playerIsChangingDirection && _player->_direction != 3) {
 			_player->changeDirection(_player->_direction, 3);
 		}
-		_ObjRestarted = false;
+		_objRestarted = false;
 		if (!_sound->isPlayingSpeech() && (_objectVar[141] != 2 || _delbertspeech > 64)) {
 			nextFrame(_objectVar[141] - 1);
 		}
-		if (_ObjRestarted) {
+		if (_objRestarted) {
 			_objectVar[141]++;
 			if (_objectVar[141] == 2) {
 				_delbertspeech = 63;
@@ -3041,7 +3041,7 @@ void DarkseedEngine::runObjects() {
 			} else if (_objectVar[141] == 4) {
 				_player->_herowaiting = false;
 			}
-			_ObjRestarted = false;
+			_objRestarted = false;
 		}
 		if (!_sound->isPlayingSpeech() && _objectVar[141] == 2) {
 			if (_delbertspeech < 65) {
@@ -3058,7 +3058,7 @@ void DarkseedEngine::runObjects() {
 		}
 		const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(_objectVar[141] - 1)._frameNo[_animIndexTbl[_objectVar[141] - 1]]);
 		Common::Point delbertPosition = _objectVar.getMoveObjectPosition(141);
-		if (_FrameAdvanced) {
+		if (_frameAdvanced) {
 			if (_objectVar[141] == 1) {
 				delbertPosition.x += 15;
 				delbertPosition.y -= 1;
@@ -3080,7 +3080,7 @@ void DarkseedEngine::runObjects() {
 	if (_room->_roomNumber == 32 && _currentDay == 2 && _currentTimeInSeconds > 64799 && (_objectVar[141] == 5 || _objectVar[141] == 6)) {
 		// walk delbert off into garden.
 		_room->advanceFrame(_objectVar[141] - 4);
-		if (_ObjRestarted) {
+		if (_objRestarted) {
 			_objectVar[141]++;
 			if (_objectVar[141] == 7) {
 				_player->_herowaiting = false;
@@ -3088,7 +3088,7 @@ void DarkseedEngine::runObjects() {
 		}
 		Common::Point delbertPosition = _objectVar.getMoveObjectPosition(141);
 		const Sprite &sprite = _room->_locationSprites.getSpriteAt(_room->_locationSprites.getAnimAt(_objectVar[141] - 4)._frameNo[_room->_locObjFrame[_objectVar[141] - 4]]);
-		if (_FrameAdvanced && _objectVar[141] > 5) {
+		if (_frameAdvanced && _objectVar[141] > 5) {
 			delbertPosition.x += 8;
 			_objectVar.setMoveObjectX(141, delbertPosition.x);
 		}
@@ -3133,7 +3133,7 @@ void DarkseedEngine::runObjects() {
 		if (_objectVar.getObjectRunningCode(53) == 1) {
 			int oldFrame = _animIndexTbl[0];
 			nextFrame(0);
-			if (_ObjRestarted) {
+			if (_objRestarted) {
 				_objectVar.setObjectRunningCode(53, 2);
 				_animIndexTbl[0] = oldFrame;
 			}
@@ -3279,7 +3279,7 @@ void DarkseedEngine::rundrekethsequence() {
 }
 
 void DarkseedEngine::delthrowstick(int16 spriteNum) {
-	if (_FrameAdvanced && spriteNum == 8) {
+	if (_frameAdvanced && spriteNum == 8) {
 		Common::Point stickPos = {265, 150};
 		_objectVar.setMoveObjectPosition(19, stickPos);
 		_yvec = -6;
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index cb9487e3f6d..fb5ced445fb 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -88,7 +88,7 @@ protected:
 	Common::Error run() override;
 public:
 	Pic _frame;
-	bool _FrameAdvanced = false;
+	bool _frameAdvanced = false;
 	bool _ct_voice_status = false;
 	bool _isRightMouseClicked = false;
 	bool _isLeftMouseClicked = false;
@@ -129,7 +129,7 @@ public:
 
 	bool _player_sprite_related_2c85_82f3 = false;
 	int _frameBottom = 0;
-	bool _ObjRestarted = false;
+	bool _objRestarted = false;
 	int _animIndexTbl[30];
 	int _spriteAnimCountdownTimer[30];
 
@@ -147,7 +147,7 @@ public:
 	bool _debugShowWalkPath = false;
 	int _phoneStatus = 0;
 
-	int16 _SoundTimer = 0;
+	int16 _soundTimer = 0;
 	bool _printedcomeheredawson = false;
 	void zeromousebuttons();
 
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 1ad82838168..0acd716ae05 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -836,7 +836,7 @@ void Darkseed::Room::runRoomObjects() {
 					roomObj.yOffset += anim._deltaY[_locObjFrame[g_engine->_objectVar[79]]];
 				}
 				spriteNum = _locationSprites.getAnimAt(g_engine->_objectVar[79])._frameNo[_locObjFrame[g_engine->_objectVar[79]]];
-				if (g_engine->_ObjRestarted) {
+				if (g_engine->_objRestarted) {
 					if (g_engine->_objectVar[79] == 1) {
 						g_engine->_objectVar[79] = 3;
 					}
@@ -975,7 +975,7 @@ void Darkseed::Room::runRoomObjects() {
 			}
 			if (_roomNumber == 57 && g_engine->_previousRoomNumber == 54 && spriteNum < 6) {
 				g_engine->_objectVar[56] = spriteNum;
-				if (g_engine->_ObjRestarted) {
+				if (g_engine->_objRestarted) {
 					g_engine->_objectVar[56] = 6;
 				}
 			}
@@ -1065,7 +1065,7 @@ void Darkseed::Room::runRoomObjects() {
 				g_engine->_sprites.addSpriteToDrawList(334, 153, &sprite2, 255, sprite2._width, sprite2._height, false);
 			} else {
 				advanceLocAnimFrame(0);
-				if (!g_engine->_ObjRestarted) {
+				if (!g_engine->_objRestarted) {
 					const Sprite &sprite = _locationSprites.getSpriteAt(_locationSprites.getAnimAt(0)._frameNo[_locObjFrame[0]]);
 					g_engine->_sprites.addSpriteToDrawList(245, 93, &sprite, 255, sprite._width, sprite._height, false);
 				} else {
@@ -1251,38 +1251,38 @@ void Darkseed::Room::drawTrunk() {
 
 void Darkseed::Room::advanceLocAnimFrame(int roomObjIdx) {
 	const Obt &anim = _locationSprites.getAnimAt(_roomObj[roomObjIdx].spriteNum);
-	g_engine->_ObjRestarted = false;
+	g_engine->_objRestarted = false;
 	_locObjFrameTimer[roomObjIdx]--;
 	if (_locObjFrameTimer[roomObjIdx] < 1) {
 		_locObjFrame[roomObjIdx]++;
 		if (_locObjFrame[roomObjIdx] == anim._numFrames) {
 			_locObjFrame[roomObjIdx] = 0;
-			g_engine->_ObjRestarted = true;
+			g_engine->_objRestarted = true;
 		}
 		_locObjFrameTimer[roomObjIdx] = anim._frameDuration[_locObjFrame[roomObjIdx]];
 	}
 }
 
 bool Darkseed::Room::advanceFrame(int animIdx) {
-	g_engine->_FrameAdvanced = false;
+	g_engine->_frameAdvanced = false;
 	const Obt &anim = _locationSprites.getAnimAt(animIdx);
-	g_engine->_ObjRestarted = false;
+	g_engine->_objRestarted = false;
 	_locObjFrameTimer[animIdx]--;
 	if (_locObjFrameTimer[animIdx] < 1) {
-		g_engine->_FrameAdvanced = true;
+		g_engine->_frameAdvanced = true;
 		_locObjFrame[animIdx]++;
 		if (_locObjFrame[animIdx] == anim._numFrames) {
 			_locObjFrame[animIdx] = 0;
-			g_engine->_ObjRestarted = true;
+			g_engine->_objRestarted = true;
 		}
 		_locObjFrameTimer[animIdx] = anim._frameDuration[_locObjFrame[animIdx]];
 	}
-	return g_engine->_FrameAdvanced;
+	return g_engine->_frameAdvanced;
 }
 
 void Darkseed::Room::mikeStickThrowAnim() {
 	advanceFrame(2);
-	if (!g_engine->_ObjRestarted) {
+	if (!g_engine->_objRestarted) {
 		g_engine->_player->_frameIdx = _locationSprites.getAnimAt(2)._frameNo[_locObjFrame[2]];
 	} else {
 		g_engine->_objectVar[79] = 1;


Commit: 0b6ce225a1c351084586d6258139c8719e7cf8e6
    https://github.com/scummvm/scummvm/commit/0b6ce225a1c351084586d6258139c8719e7cf8e6
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix compiler warnings

Changed paths:
    engines/darkseed/room.cpp
    engines/darkseed/usecode.cpp


diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 0acd716ae05..0aac3918fa6 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -81,7 +81,7 @@ bool Darkseed::Room::load() {
 	Common::String filenameBase = getRoomFilenameBase(_roomNumber);
 	Common::Path romFilename;
 	Common::File file;
-	romFilename = g_engine->getRoomFilePath(Common::Path(Common::String::format("%s.rom", filenameBase.c_str(), _roomNumber)));
+	romFilename = g_engine->getRoomFilePath(Common::Path(Common::String::format("%s.rom", filenameBase.c_str())));
 	if (!file.open(romFilename)) {
 		return false;
 	}
@@ -449,7 +449,7 @@ bool Darkseed::Room::canWalkAtLocation(int x, int y) {
 
 	int t = (x - 69) / 5;
 
-	return (_walkableLocationsMap[t / 8].strip[(y - 40) / 5] >> (7 - (t % 8) & 0x1f) & 1);
+	return (_walkableLocationsMap[t / 8].strip[(y - 40) / 5] >> ((7 - (t % 8)) & 0x1f) & 1);
 }
 
 bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int destY) {
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 6419ad2f699..3f723c69b79 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -839,9 +839,9 @@ void Darkseed::UseCode::useCodeShopItems(int16 actionObjNum, int16 targetObjNum)
 		return;
 	}
 	if (actionObjNum == 38 &&
-		(((((targetObjNum == 126 || targetObjNum == 126) || targetObjNum == 197) ||
-		   ((targetObjNum == 131 || (targetObjNum == 89)))) ||
-		  targetObjNum == 171))) {
+		(targetObjNum == 126 || targetObjNum == 197 ||
+		  targetObjNum == 131 || targetObjNum == 89 ||
+		  targetObjNum == 171)) {
 		_console->printTosText(89);
 		return;
 	}
@@ -1015,7 +1015,8 @@ void Darkseed::UseCode::useCrowBar(int16 targetObjNum) {
 // All this code is unused as you cannot add the newspaper to your inventory. :( I wonder why they didn't add it. It is also missing the inventory icon image.
 void UseCode::useCodeNewspaper(int16 targetObjNum) {
 	if (targetObjNum == 124) {
-		_console->printTosText(26);
+		_console->printTosText(26); // The original logic also had this if statement repeated further down the chain
+									        // but calling _console->printTosText(268);
 	} else if (targetObjNum == 126) {
 		_console->printTosText(82);
 	} else if (targetObjNum == 127) {
@@ -1028,8 +1029,6 @@ void UseCode::useCodeNewspaper(int16 targetObjNum) {
 		_console->printTosText(207);
 	} else if (targetObjNum == 145) {
 		_console->printTosText(222);
-	} else if (targetObjNum == 124) { // Bug in the original engine. This code is never reachable
-		_console->printTosText(268); // this is a duplicate of tosId: 26
 	} else if (targetObjNum == 137) {
 		_console->printTosText(299);
 	} else if (targetObjNum == 147) {
@@ -1398,7 +1397,7 @@ void UseCode::useCodeGun(int16 targetObjNum) {
 void UseCode::useCodeMoversNote(int16 targetObjNum) {
 	if (targetObjNum == 47) {
 		_console->printTosText(57);
-	} else if (targetObjNum == 172) {
+	} else if (targetObjNum == 172) { // original logic also duplicated this if statement and called a generic response
 		_console->printTosText(93);
 	} else if (targetObjNum == 129) {
 		genericresponse(30, 129, 998);
@@ -1424,8 +1423,6 @@ void UseCode::useCodeMoversNote(int16 targetObjNum) {
 		genericresponse(30, 121, 990);
 	} else if (targetObjNum == 194) {
 		genericresponse(30, 194, 989);
-	} else if (targetObjNum == 172) {
-		genericresponse(30, 172, 988);
 	} else if (targetObjNum == 71) {
 		genericresponse(30, 71, 987);
 	} else if (targetObjNum == 101) {


Commit: 9e4e320412cf5c226865a10f113c6172018a8497
    https://github.com/scummvm/scummvm/commit/9e4e320412cf5c226865a10f113c6172018a8497
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Mark engine as highres

Changed paths:
    engines/darkseed/configure.engine


diff --git a/engines/darkseed/configure.engine b/engines/darkseed/configure.engine
index eb577f095c0..245c0907ceb 100644
--- a/engines/darkseed/configure.engine
+++ b/engines/darkseed/configure.engine
@@ -1,3 +1,3 @@
 # This file is included from the main "configure" script
 # add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
-add_engine darkseed "Darkseed" no "" "" ""
+add_engine darkseed "Darkseed" no "" "" "highres"


Commit: 9eb352867c224b094b87e9905f165022f3d62cef
    https://github.com/scummvm/scummvm/commit/9eb352867c224b094b87e9905f165022f3d62cef
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix namespace scope for cpp files

Changed paths:
    engines/darkseed/cursor.cpp
    engines/darkseed/cutscene.cpp
    engines/darkseed/inventory.cpp
    engines/darkseed/nsp.cpp
    engines/darkseed/objects.cpp
    engines/darkseed/pic.cpp
    engines/darkseed/player.cpp
    engines/darkseed/room.cpp
    engines/darkseed/sound.cpp
    engines/darkseed/sprites.cpp


diff --git a/engines/darkseed/cursor.cpp b/engines/darkseed/cursor.cpp
index 2f4559dcf89..aff01768268 100644
--- a/engines/darkseed/cursor.cpp
+++ b/engines/darkseed/cursor.cpp
@@ -23,7 +23,9 @@
 #include "darkseed/cursor.h"
 #include "darkseed/darkseed.h"
 
-void Darkseed::Cursor::setCursorType(enum CursorType newType) {
+namespace Darkseed {
+
+void Cursor::setCursorType(enum CursorType newType) {
 	bool loadCursor = !_hasLoadedCursor || _currentCursorType != newType;
 	_currentCursorType = newType;
 
@@ -36,28 +38,30 @@ void Darkseed::Cursor::setCursorType(enum CursorType newType) {
 	}
 }
 
-void Darkseed::Cursor::updatePosition(int16 x, int16 y) {
+void Cursor::updatePosition(int16 x, int16 y) {
 	_position.x = x;
 	_position.y = y;
-//	debug("mouse at (%d,%d)", _x, _y);
+	//	debug("mouse at (%d,%d)", _x, _y);
 }
 
-int Darkseed::Cursor::getWidth() {
+int Cursor::getWidth() {
 	return g_engine->_baseSprites.getSpriteAt(_currentCursorType)._width;
 }
 
-int Darkseed::Cursor::getHeight() {
+int Cursor::getHeight() {
 	return g_engine->_baseSprites.getSpriteAt(_currentCursorType)._height;
 }
 
-const Darkseed::Sprite &Darkseed::Cursor::getSprite() {
+const Sprite &Darkseed::Cursor::getSprite() {
 	return g_engine->_baseSprites.getSpriteAt(_currentCursorType);
 }
 
-const Darkseed::Sprite &Darkseed::Cursor::getSpriteForType(Darkseed::CursorType cursorType) {
+const Sprite &Darkseed::Cursor::getSpriteForType(Darkseed::CursorType cursorType) {
 	return g_engine->_baseSprites.getSpriteAt(cursorType);
 }
 
-void Darkseed::Cursor::showCursor(bool showCursor) {
+void Cursor::showCursor(bool showCursor) {
 	CursorMan.showMouse(showCursor);
 }
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index 4ac44b2ef2c..c967fb1fdae 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -22,11 +22,13 @@
 #include "darkseed/cutscene.h"
 #include "darkseed/darkseed.h"
 
-Darkseed::Cutscene::~Cutscene() {
+namespace Darkseed {
+
+Cutscene::~Cutscene() {
 	delete _titleFont;
 }
 
-void Darkseed::Cutscene::play(char cutsceneId) {
+void Cutscene::play(char cutsceneId) {
 	_cutsceneId = cutsceneId;
 	_movieStep = 1;
 	g_engine->_sound->waitForSpeech();
@@ -35,7 +37,7 @@ void Darkseed::Cutscene::play(char cutsceneId) {
 }
 
 
-void Darkseed::Cutscene::update() {
+void Cutscene::update() {
 	switch (_cutsceneId) {
 	case 'B' :
 		_movieStep = 9999;
@@ -89,7 +91,7 @@ void Darkseed::Cutscene::update() {
 
 static constexpr int _CREDITS_DELAY = 25;
 
-bool Darkseed::Cutscene::introScene() {
+bool Cutscene::introScene() {
 	switch (_movieStep) {
 	case 1:
 		g_engine->fadeOut();
@@ -412,7 +414,7 @@ bool Darkseed::Cutscene::introScene() {
 	return true;
 }
 
-bool Darkseed::Cutscene::embryoInsertedScene() {
+bool Cutscene::embryoInsertedScene() {
 	switch (_movieStep) {
 	case 1:
 	case 2:
@@ -524,7 +526,7 @@ bool Darkseed::Cutscene::embryoInsertedScene() {
 	return true;
 }
 
-bool Darkseed::Cutscene::shipLaunchScene() {
+bool Cutscene::shipLaunchScene() {
 	switch (_movieStep) {
 	case 1: {
 		_palette.load("art/ship.pal");
@@ -611,7 +613,7 @@ bool Darkseed::Cutscene::shipLaunchScene() {
 	return true;
 }
 
-bool Darkseed::Cutscene::alienBornScene() {
+bool Cutscene::alienBornScene() {
 	switch (_movieStep) {
 	case 1: {
 		_palette.load("art/ship.pal");
@@ -673,7 +675,7 @@ bool Darkseed::Cutscene::alienBornScene() {
 	return true;
 }
 
-bool Darkseed::Cutscene::stepAnim(int drawMode) {
+bool Cutscene::stepAnim(int drawMode) {
 	if (_animDelayCount == 0) {
 		Img animFrame;
 		_animation.getImg(_animIdx, animFrame);
@@ -693,7 +695,7 @@ bool Darkseed::Cutscene::stepAnim(int drawMode) {
 	return false;
 }
 
-void Darkseed::Cutscene::putHouse() {
+void Cutscene::putHouse() {
 	Img dollImg;
 	dollImg.load("art/bdoll0.img");
 	dollImg.draw();
@@ -705,15 +707,17 @@ void Darkseed::Cutscene::putHouse() {
 	houseFrameImg.draw(1);
 }
 
-void Darkseed::Cutscene::registTime() {
+void Cutscene::registTime() {
 	_startTime = g_system->getMillis();
 }
 
-bool Darkseed::Cutscene::waitTime(int16 duration) {
+bool Cutscene::waitTime(int16 duration) {
 	return g_system->getMillis() < _startTime + (duration * 100);
 }
 
-void Darkseed::Cutscene::runAnim(int direction) {
+void Cutscene::runAnim(int direction) {
 	_animDelayCount = 0;
 	_animDirection = direction;
 }
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index d883577adc2..d018741f5be 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -22,31 +22,33 @@
 #include "darkseed/darkseed.h"
 #include "darkseed/inventory.h"
 
+namespace Darkseed {
+
 constexpr uint16 MAX_INVENTORY = 42;
 constexpr uint16 MAX_ICONS = 9;
 static constexpr Common::Rect drawArea = {{139, 0}, 334, 40};
 
-Darkseed::Inventory::Inventory() {
+Inventory::Inventory() {
 	_iconList.resize(MAX_ICONS);
 	_inventory.resize(MAX_INVENTORY);
 	reset();
 }
 
-void Darkseed::Inventory::reset() {
+void Inventory::reset() {
 	_viewOffset = 0;
 	_inventory[0] = 8;
 	_inventoryLength = 1;
 	update();
 }
 
-void Darkseed::Inventory::addItem(uint8 item) {
+void Inventory::addItem(uint8 item) {
 	_inventory[_inventoryLength] = item;
 	_inventoryLength++;
 	// TODO playsound(6, 5, -1);
 	update();
 }
 
-void Darkseed::Inventory::removeItem(uint8 item) {
+void Inventory::removeItem(uint8 item) {
 	for (int i = 0; i < _inventoryLength; i++) {
 		if (_inventory[i] == item) {
 			for (int j = i; j < _inventoryLength - 1; j++) {
@@ -59,7 +61,7 @@ void Darkseed::Inventory::removeItem(uint8 item) {
 	}
 }
 
-void Darkseed::Inventory::update() {
+void Inventory::update() {
 	if (_viewOffset != 0) {
 		if (_inventoryLength <= _viewOffset + (MAX_ICONS - 1)) {
 			_viewOffset = _inventoryLength - (MAX_ICONS - 1);
@@ -89,12 +91,12 @@ void Darkseed::Inventory::update() {
 	_redraw = true;
 }
 
-void Darkseed::Inventory::restoreFrame() {
+void Inventory::restoreFrame() {
 	g_engine->_frame.drawRect(drawArea);
 	g_engine->_screen->addDirtyRect(drawArea);
 }
 
-void Darkseed::Inventory::draw() {
+void Inventory::draw() {
 	if ((g_engine->_actionMode <= 4 && g_engine->_cursor.getY() > 40) || g_engine->_isPlayingAnimation_maybe || (g_engine->_objectVar[141] >= 1 && g_engine->_objectVar[141] <= 3)) {
 		if (_isVisible) {
 			restoreFrame();
@@ -125,7 +127,7 @@ void Darkseed::Inventory::draw() {
 	g_engine->_screen->addDirtyRect(drawArea);
 }
 
-void Darkseed::Inventory::handleClick() {
+void Inventory::handleClick() {
 	Common::Point clickPos = g_engine->_cursor.getPosition();
 	if (clickPos.x < 140 || clickPos.x > 140 + _numIcons * 37) {
 		return;
@@ -160,19 +162,19 @@ void Darkseed::Inventory::handleClick() {
 	}
 }
 
-void Darkseed::Inventory::leftArrowClicked() {
+void Inventory::leftArrowClicked() {
 	if (_viewOffset > 0) {
 		_viewOffset--;
 		update();
 	}
 }
 
-void Darkseed::Inventory::rightArrowClicked() {
+void Inventory::rightArrowClicked() {
 	_viewOffset++;
 	update();
 }
 
-Common::Error Darkseed::Inventory::sync(Common::Serializer &s) {
+Common::Error Inventory::sync(Common::Serializer &s) {
 	s.syncAsSint16LE(_inventoryLength);
 	for (int i = 0; i < _inventoryLength; i++) {
 		s.syncAsByte(_inventory[i]);
@@ -182,7 +184,7 @@ Common::Error Darkseed::Inventory::sync(Common::Serializer &s) {
 	return Common::kNoError;
 }
 
-void Darkseed::Inventory::endOfDayOutsideLogic() {
+void Inventory::endOfDayOutsideLogic() {
 	for (int i = 0; i < _inventoryLength; i++) {
 		g_engine->_objectVar.setMoveObjectRoom(_inventory[i], _inventory[i] == 28 ? 255 : 252);
 	}
@@ -191,7 +193,7 @@ void Darkseed::Inventory::endOfDayOutsideLogic() {
 	g_engine->_objectVar[53] = 2;
 }
 
-void Darkseed::Inventory::gotoJailLogic() {
+void Inventory::gotoJailLogic() {
 	for (int i = 0; i < _inventoryLength; i++) {
 		g_engine->_objectVar.setMoveObjectRoom(_inventory[i], 100);
 	}
@@ -201,7 +203,7 @@ void Darkseed::Inventory::gotoJailLogic() {
 	update();
 }
 
-bool Darkseed::Inventory::hasObject(uint8 objNum) {
+bool Inventory::hasObject(uint8 objNum) {
 	for (int i = 0; i < _inventoryLength; i++) {
 		if (_inventory[i] == objNum) {
 			return true;
@@ -209,3 +211,5 @@ bool Darkseed::Inventory::hasObject(uint8 objNum) {
 	}
 	return false;
 }
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index 0e7ae918fb7..dc64d3e5985 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -23,11 +23,13 @@
 #include "darkseed/nsp.h"
 #include "common/debug.h"
 
-Darkseed::Sprite::Sprite(uint16 width, uint16 height, uint16 pitch) : _width(width), _height(height), _pitch(pitch) {
+namespace Darkseed {
+
+Sprite::Sprite(uint16 width, uint16 height, uint16 pitch) : _width(width), _height(height), _pitch(pitch) {
 	_pixels.resize(pitch * height, 0);
 }
 
-bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
+bool Sprite::loadData(Common::SeekableReadStream &readStream) {
 	if (_width == 1 && _height == 1) {
 		byte b = readStream.readByte();
 		_pixels[0] = b >> 4;
@@ -52,7 +54,7 @@ bool Darkseed::Sprite::loadData(Common::SeekableReadStream &readStream) {
 	return true;
 }
 
-void Darkseed::Sprite::draw(int x, int y, uint16 frameBottom) const {
+void Sprite::draw(int x, int y, uint16 frameBottom) const {
 	uint16 clippedWidth = _width;
 	uint16 clippedHeight = _height;
 	if (x + _width > g_engine->_screen->w) {
@@ -67,7 +69,7 @@ void Darkseed::Sprite::draw(int x, int y, uint16 frameBottom) const {
 	g_engine->_screen->copyRectToSurfaceWithKey(_pixels.data(), _pitch, x, y, clippedWidth, clippedHeight, 0xf);
 }
 
-void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destHeight, bool flipX) const {
+void Sprite::drawScaled(int destX, int destY, int destWidth, int destHeight, bool flipX) const {
 	//TODO image isn't exactly the same when not scaling. It seems larger by about a pixel.
 	//TODO this logic is pretty messy. It should probably be re-written. It is trying to scale, clip and flip at once.
 	Graphics::ManagedSurface * destSurface = g_engine->_screen;
@@ -132,7 +134,7 @@ void Darkseed::Sprite::drawScaled(int destX, int destY, int destWidth, int destH
 	}
 }
 
-bool Darkseed::Nsp::load(const Common::Path &filename) {
+bool Nsp::load(const Common::Path &filename) {
 	Common::File file;
 	Common::Path filePath = g_engine->getRoomFilePath(filename);
 	if (!file.open(filePath)) {
@@ -149,7 +151,7 @@ bool Darkseed::Nsp::load(const Common::Path &filename) {
 	return ret;
 }
 
-bool Darkseed::Nsp::load(Common::SeekableReadStream &readStream) {
+bool Nsp::load(Common::SeekableReadStream &readStream) {
 	_frames.clear();
 	for (int i = 0; i < 96; i++) {
 		int w = readStream.readByte();
@@ -167,14 +169,14 @@ bool Darkseed::Nsp::load(Common::SeekableReadStream &readStream) {
 	return true;
 }
 
-const Darkseed::Sprite &Darkseed::Nsp::getSpriteAt(int index) {
+const Sprite &Nsp::getSpriteAt(int index) {
 	if (index >= (int)_frames.size()) {
 		error("getSpriteAt: Invalid sprite index. %d", index);
 	}
 	return _frames[index];
 }
 
-bool Darkseed::Nsp::loadObt(const Common::Path &filename) {
+bool Nsp::loadObt(const Common::Path &filename) {
 	Common::File file;
 	if (!file.open(filename)) {
 		return false;
@@ -207,11 +209,11 @@ bool Darkseed::Nsp::loadObt(const Common::Path &filename) {
 	return true;
 }
 
-const Darkseed::Obt &Darkseed::Nsp::getAnimAt(int index) {
+const Obt &Nsp::getAnimAt(int index) {
 	return _animations[index];
 }
 
-Darkseed::Obt::Obt() {
+Obt::Obt() {
 	_numFrames = 0;
 	_deltaX.reserve(20);
 	_deltaY.reserve(20);
@@ -219,9 +221,11 @@ Darkseed::Obt::Obt() {
 	_frameDuration.reserve(20);
 }
 
-Darkseed::Obt::~Obt() {
+Obt::~Obt() {
 	_deltaX.clear();
 	_deltaY.clear();
 	_frameNo.clear();
 	_frameDuration.clear();
 }
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index 86e5d49eb51..9e586a05aba 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -21,7 +21,9 @@
 
 #include "darkseed/objects.h"
 
-Darkseed::Objects::Objects() {
+namespace Darkseed {
+
+Objects::Objects() {
 	_objectVar.resize(MAX_OBJECTS);
 	_objectRunningCode.resize(MAX_OBJECTS);
 	_moveObjectXY.resize(MAX_OBJECTS);
@@ -29,7 +31,7 @@ Darkseed::Objects::Objects() {
 	reset();
 }
 
-void Darkseed::Objects::reset() {
+void Objects::reset() {
 	for (int i = 0; i < MAX_OBJECTS; i++) {
 		_objectVar[i] = 0;
 		_objectRunningCode[i] = 0;
@@ -43,48 +45,48 @@ void Darkseed::Objects::reset() {
 	setVar(62, 0);
 }
 
-void Darkseed::Objects::setVar(uint16 varIdx, int16 newValue) {
+void Objects::setVar(uint16 varIdx, int16 newValue) {
 	if (varIdx >= MAX_OBJECTS) {
 		error("setVar: Object Index out of range! %d", varIdx);
 	}
 	_objectVar[varIdx] = newValue;
 }
 
-int16 Darkseed::Objects::getVar(uint16 varIdx) {
+int16 Objects::getVar(uint16 varIdx) {
 	if (varIdx >= MAX_OBJECTS) {
 		error("getVar: Object Index out of range! %d", varIdx);
 	}
 	return _objectVar[varIdx];
 }
 
-Common::Point Darkseed::Objects::getMoveObjectPosition(uint8 objIdx) {
+Common::Point Objects::getMoveObjectPosition(uint8 objIdx) {
 	if (objIdx >= MAX_OBJECTS) {
 		error("getMoveObjectPosition: Object Index out of range! %d", objIdx);
 	}
 	return _moveObjectXY[objIdx];
 }
 
-void Darkseed::Objects::setMoveObjectPosition(uint8 objIdx, const Common::Point &newPoint) {
+void Objects::setMoveObjectPosition(uint8 objIdx, const Common::Point &newPoint) {
 	if (objIdx >= MAX_OBJECTS) {
 		error("setMoveObjectPosition: Object Index out of range! %d", objIdx);
 	}
 	_moveObjectXY[objIdx] = newPoint;
 }
 
-void Darkseed::Objects::setMoveObjectX(uint8 objIdx, int16 xPos) {
+void Objects::setMoveObjectX(uint8 objIdx, int16 xPos) {
 	if (objIdx >= MAX_OBJECTS) {
 		error("setMoveObjectX: Object Index out of range! %d", objIdx);
 	}
 	_moveObjectXY[objIdx].x = xPos;
 }
 
-int16 &Darkseed::Objects::operator[](uint16 varIdx) {
+int16 &Objects::operator[](uint16 varIdx) {
 	if (varIdx >= MAX_OBJECTS) {
 		error("getVar: Object Index out of range! %d", varIdx);
 	}
 	return _objectVar[varIdx];
 }
-const int16 &Darkseed::Objects::operator[](uint16 varIdx) const {
+const int16 &Objects::operator[](uint16 varIdx) const {
 	if (varIdx >= MAX_OBJECTS) {
 		error("getVar: Object Index out of range! %d", varIdx);
 	}
@@ -346,42 +348,42 @@ static constexpr char objectNameTbl[199][21] = {
 	"bed bottom",
 };
 
-int Darkseed::Objects::getEyeDescriptionTosIdx(uint16 objNum) {
+int Objects::getEyeDescriptionTosIdx(uint16 objNum) {
 	if (objNum >= MAX_OBJECTS) {
 		error("getEyeDescriptionTosIdx: Object Index out of range! %d", objNum);
 	}
 	return eyeDescriptionsTbl[objNum];
 }
 
-int Darkseed::Objects::getMoveObjectRoom(uint16 idx) {
+int Objects::getMoveObjectRoom(uint16 idx) {
 	if (idx >= MAX_OBJECTS) {
 		error("getMoveObjectRoom: index out of range.");
 	}
 	return _moveObjectRoom[idx];
 }
 
-void Darkseed::Objects::setMoveObjectRoom(uint16 idx, uint8 value) {
+void Objects::setMoveObjectRoom(uint16 idx, uint8 value) {
 	if (idx >= MAX_OBJECTS) {
 		error("setMoveObjectRoom: index out of range.");
 	}
 	_moveObjectRoom[idx] = value;
 }
 
-int16 Darkseed::Objects::getObjectRunningCode(int idx) {
+int16 Objects::getObjectRunningCode(int idx) {
 	if (idx >= MAX_OBJECTS) {
 		error("getObjectRunningCode: index out of range.");
 	}
 	return _objectRunningCode[idx];
 }
 
-void Darkseed::Objects::setObjectRunningCode(int idx, int16 value) {
+void Objects::setObjectRunningCode(int idx, int16 value) {
 	if (idx >= MAX_OBJECTS) {
 		error("setObjectRunningCode: index out of range.");
 	}
 	_objectRunningCode[idx] = value;
 }
 
-const char *Darkseed::Objects::getObjectName(int idx) {
+const char *Objects::getObjectName(int idx) {
 	if (idx < 0 || idx >= MAX_OBJECTS) {
 		error("getObjectName: index out of range.");
 	}
@@ -394,7 +396,7 @@ static inline void syncPoint(Common::Serializer &s, Common::Point &value) {
 	s.syncAsSint16LE(value.y);
 }
 
-Common::Error Darkseed::Objects::sync(Common::Serializer &s) {
+Common::Error Objects::sync(Common::Serializer &s) {
 	s.syncArray(_objectVar.data(), _objectVar.size(), Common::Serializer::Sint16LE);
 	s.syncArray(_objectRunningCode.data(), _objectRunningCode.size(), Common::Serializer::Sint16LE);
 	s.syncArray(_objectRunningCode.data(), _objectRunningCode.size(), Common::Serializer::Sint16LE);
@@ -402,3 +404,5 @@ Common::Error Darkseed::Objects::sync(Common::Serializer &s) {
 	s.syncArray(_moveObjectRoom.data(), _moveObjectRoom.size(), Common::Serializer::Byte);
 	return Common::kNoError;
 }
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/pic.cpp b/engines/darkseed/pic.cpp
index 3e6d9bb5950..f60caee720e 100644
--- a/engines/darkseed/pic.cpp
+++ b/engines/darkseed/pic.cpp
@@ -23,7 +23,9 @@
 #include "darkseed/darkseed.h"
 #include "common/debug.h"
 
-bool Darkseed::Pic::load(const Common::Path &filename) {
+namespace Darkseed {
+
+bool Pic::load(const Common::Path &filename) {
 	Common::File file;
 	Common::Path fullPath = g_engine->getPictureFilePath(filename);
 	if (!file.open(fullPath)) {
@@ -38,7 +40,7 @@ bool Darkseed::Pic::load(const Common::Path &filename) {
 	return ret;
 }
 
-bool Darkseed::Pic::load(Common::SeekableReadStream &readStream) {
+bool Pic::load(Common::SeekableReadStream &readStream) {
 	_width = readStream.readUint16BE();
 	_height = readStream.readUint16BE();
 	_pixels.resize(_width * (_height + 1), 0);
@@ -75,7 +77,7 @@ bool Darkseed::Pic::load(Common::SeekableReadStream &readStream) {
 	return true;
 }
 
-byte Darkseed::Pic::readNextNibble(Common::SeekableReadStream &readStream) {
+byte Pic::readNextNibble(Common::SeekableReadStream &readStream) {
 	if (!_hasReadByte) {
 		_currentDataByte = readStream.readByte();
 		if (readStream.eos()) {
@@ -89,15 +91,17 @@ byte Darkseed::Pic::readNextNibble(Common::SeekableReadStream &readStream) {
 	}
 }
 
-void Darkseed::Pic::draw() {
+void Pic::draw() {
 	draw(0, 0);
 }
 
-void Darkseed::Pic::draw(int xOffset, int yOffset) {
+void Pic::draw(int xOffset, int yOffset) {
 	g_engine->_screen->copyRectToSurface(getPixels().data(), getWidth(), xOffset, yOffset, getWidth(), getHeight());
 }
 
-void Darkseed::Pic::drawRect(const Common::Rect &rect) {
+void Pic::drawRect(const Common::Rect &rect) {
 	void *ptr = getPixels().data() + rect.left + (rect.top * getWidth());
 	g_engine->_screen->copyRectToSurface(ptr, getWidth(), rect.left, rect.top, rect.width(), rect.height());
 }
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 0317a6865b9..8d0a6dabfb0 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -23,13 +23,15 @@
 #include "darkseed/player.h"
 #include "darkseed/darkseed.h"
 
-Darkseed::Player::Player() {
+namespace Darkseed {
+
+Player::Player() {
 	_cPlayerSprites.load("cplayer.nsp");
 	_gPlayerSprites.load("gplayer.nsp");
 	_connectorList.resize(Room::MAX_CONNECTORS);
 }
 
-const Darkseed::Sprite &Darkseed::Player::getSprite(int frameNo) {
+const Sprite &Player::getSprite(int frameNo) {
 	if (g_engine->_room->isGiger()) {
 		return _gPlayerSprites.getSpriteAt(frameNo);
 	} else {
@@ -37,7 +39,7 @@ const Darkseed::Sprite &Darkseed::Player::getSprite(int frameNo) {
 	}
 }
 
-bool Darkseed::Player::loadAnimations(const Common::Path &filename) {
+bool Player::loadAnimations(const Common::Path &filename) {
 	return _animations.load(filename);
 }
 
@@ -45,7 +47,7 @@ uint8 playerSpriteIndexDirectionTbl[] = { 24,  26,  28,  26 };
 bool BYTE_ARRAY_2c85_41eb[] = { false, false, false, true };
 uint16 walkFrameOffsetTbl[] = { 0,   8,  16,   8 };
 
-void Darkseed::Player::updateSprite() {
+void Player::updateSprite() {
 	if (!_playerIsChangingDirection) {
 		if ((_direction == 3) || (_direction == 1)) {
 			g_engine->_player_sprite_related_2c85_82f3 = BYTE_ARRAY_2c85_41eb[_direction];
@@ -78,15 +80,15 @@ void Darkseed::Player::updateSprite() {
 		}
 	}
 }
-bool Darkseed::Player::isAtPosition(int x, int y) const {
+bool Player::isAtPosition(int x, int y) const {
 	return _position.x == x && _position.y == y;
 }
 
-bool Darkseed::Player::isAtWalkTarget() const {
+bool Player::isAtWalkTarget() const {
 	return _position == _walkTarget;
 }
 
-void Darkseed::Player::changeDirection(int16 oldDir, int16 newDir) {
+void Player::changeDirection(int16 oldDir, int16 newDir) {
 	if (oldDir != newDir) {
 		_playerIsChangingDirection = true;
 		_playerSpriteWalkIndex_maybe = (int16)(oldDir * 2);
@@ -119,7 +121,7 @@ void Darkseed::Player::changeDirection(int16 oldDir, int16 newDir) {
 	}
 }
 
-void Darkseed::Player::playerFaceWalkTarget() {
+void Player::playerFaceWalkTarget() {
 	int previousDirection;
 	int xDelta;
 	int yDelta;
@@ -151,7 +153,7 @@ void Darkseed::Player::playerFaceWalkTarget() {
 	_positionLong = _position;
 }
 
-void Darkseed::Player::calculateWalkTarget() {
+void Player::calculateWalkTarget() {
 	_heroMoving = true;
 	_playerWalkFrameIdx = 0;
 	_walkPathIndex = -1;
@@ -222,15 +224,15 @@ void Darkseed::Player::calculateWalkTarget() {
 	}
 }
 
-int Darkseed::Player::getWidth() {
+int Player::getWidth() {
 	return getSprite(_frameIdx)._width;
 }
 
-int Darkseed::Player::getHeight() {
+int Player::getHeight() {
 	return getSprite(_frameIdx)._height;
 }
 
-void Darkseed::Player::updatePlayerPositionAfterRoomChange() {
+void Player::updatePlayerPositionAfterRoomChange() {
 	int currentRoomNumber = g_engine->_room->_roomNumber;
 	g_engine->_room->calculateScaledSpriteDimensions(getWidth(), getHeight(), _position.y);
 	if (currentRoomNumber == 0x29 && g_engine->_previousRoomNumber == 0x2c) {
@@ -297,7 +299,7 @@ void Darkseed::Player::updatePlayerPositionAfterRoomChange() {
 	}
 }
 
-void Darkseed::Player::createConnectorPathToDest() {
+void Player::createConnectorPathToDest() {
 	constexpr Common::Point noConnectorFound(-1, -1);
 	Common::Point origWalkTarget = _walkTarget;
 	Common::Point startPoint = _position;
@@ -350,7 +352,7 @@ void Darkseed::Player::createConnectorPathToDest() {
 	_walkTarget = _connectorList[0];
 }
 
-Common::Point Darkseed::Player::getClosestUnusedConnector(int16 x, int16 y, bool mustHaveCleanLine) {
+Common::Point Player::getClosestUnusedConnector(int16 x, int16 y, bool mustHaveCleanLine) {
 	Common::Point closestPoint = {-1, -1};
 	int closestDist = 5000;
 	for (auto &roomConnector : g_engine->_room->_connectors) {
@@ -373,7 +375,7 @@ Common::Point Darkseed::Player::getClosestUnusedConnector(int16 x, int16 y, bool
 	return closestPoint;
 }
 
-void Darkseed::Player::walkToNextConnector() {
+void Player::walkToNextConnector() {
 	if (_walkPathIndex == -1) {
 		return;
 	}
@@ -387,7 +389,7 @@ void Darkseed::Player::walkToNextConnector() {
 	playerFaceWalkTarget();
 }
 
-void Darkseed::Player::draw() {
+void Player::draw() {
 	if (g_engine->_debugShowWalkPath) {
 		if (_walkPathIndex != -1) {
 			for (int i = _walkPathIndex; i < _numConnectorsInWalkPath; i++) {
@@ -402,7 +404,7 @@ void Darkseed::Player::draw() {
 	}
 }
 
-void Darkseed::Player::reverseConnectorList() {
+void Player::reverseConnectorList() {
 	Common::Array<Common::Point> tempList;
 	tempList.resize(_numConnectorsInWalkPath);
 
@@ -415,7 +417,7 @@ void Darkseed::Player::reverseConnectorList() {
 	}
 }
 
-void Darkseed::Player::OptimisePath() {
+void Player::OptimisePath() {
 	if (g_engine->_room->_roomNumber != 7 && g_engine->_room->_roomNumber != 32) {
 		while (_numConnectorsInWalkPath > 1) {
 			if (g_engine->_room->canWalkInLineToTarget(_connectorList[_numConnectorsInWalkPath - 2].x, _connectorList[_numConnectorsInWalkPath - 2].y, _walkTarget.x, _walkTarget.y)) {
@@ -433,7 +435,7 @@ static constexpr uint8 _closerroom[10] = {
 	7, 6
 };
 
-void Darkseed::Player::setplayertowardsbedroom() {
+void Player::setplayertowardsbedroom() {
 	if (g_engine->_isPlayingAnimation_maybe) {
 		return;
 	}
@@ -469,3 +471,5 @@ void Darkseed::Player::setplayertowardsbedroom() {
 	playerFaceWalkTarget();
 	g_engine->_cursor.setPosition(currentCursor);
 }
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 0aac3918fa6..3abb9b2138b 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -22,6 +22,8 @@
 #include "darkseed/room.h"
 #include "darkseed/darkseed.h"
 
+namespace Darkseed {
+
 const static int roomDescriptionTextTbl[] = {
 	0, 138, 165, 165,
 	181, 243, 254, 292,
@@ -43,7 +45,7 @@ const static int roomDescriptionTextTbl[] = {
 	903
 };
 
-Darkseed::Room::Room(int roomNumber) : _roomNumber(roomNumber) {
+Room::Room(int roomNumber) : _roomNumber(roomNumber) {
 	_room1.resize(8);
 	_walkableLocationsMap.resize(16);
 	_roomObj.resize(30);
@@ -56,7 +58,7 @@ Darkseed::Room::Room(int roomNumber) : _roomNumber(roomNumber) {
 	}
 }
 
-void Darkseed::Room::initRoom() {
+void Room::initRoom() {
 	for (int iVar1 = 0; iVar1 < 30; iVar1 = iVar1 + 1) {
 		_locObjFrame[iVar1] = 0;
 		g_engine->_animIndexTbl[iVar1] = 0;
@@ -77,7 +79,7 @@ void Darkseed::Room::initRoom() {
 	}
 }
 
-bool Darkseed::Room::load() {
+bool Room::load() {
 	Common::String filenameBase = getRoomFilenameBase(_roomNumber);
 	Common::Path romFilename;
 	Common::File file;
@@ -197,7 +199,7 @@ bool Darkseed::Room::load() {
 	return true;
 }
 
-Common::String Darkseed::Room::stripSpaces(Common::String source) {
+Common::String Room::stripSpaces(Common::String source) {
 	Common::String out;
 	const char *src = source.c_str();
 	for (uint i = 0; i < source.size(); i++) {
@@ -208,7 +210,7 @@ Common::String Darkseed::Room::stripSpaces(Common::String source) {
 	return out;
 }
 
-void Darkseed::Room::draw() {
+void Room::draw() {
 	if (!_palLoaded) {
 		_pal.installPalette();
 		_palLoaded = true;
@@ -231,7 +233,7 @@ void Darkseed::Room::draw() {
 	}
 }
 
-int Darkseed::Room::checkCursorAndMoveableObjects() {
+int Room::checkCursorAndMoveableObjects() {
 	int actionMode = g_engine->_actionMode;
 	const Sprite &cursorSprite = (actionMode == LookAction)
 									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
@@ -267,7 +269,7 @@ int Darkseed::Room::checkCursorAndMoveableObjects() {
 	return hasObject ? objNum : -1;
 }
 
-int Darkseed::Room::checkCursorAndStaticObjects(int x, int y) {
+int Room::checkCursorAndStaticObjects(int x, int y) {
 	int actionMode = g_engine->_actionMode;
 	const Sprite &cursorSprite = (actionMode == LookAction)
 									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
@@ -317,7 +319,7 @@ int Darkseed::Room::checkCursorAndStaticObjects(int x, int y) {
 	return -1;
 }
 
-int Darkseed::Room::CheckCursorAndMovedObjects() {
+int Room::CheckCursorAndMovedObjects() {
 	int actionMode = g_engine->_actionMode;
 	const Sprite &cursorSprite = (actionMode == LookAction)
 									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
@@ -352,7 +354,7 @@ int Darkseed::Room::CheckCursorAndMovedObjects() {
 	return -1;
 }
 
-void Darkseed::Room::update() {
+void Room::update() {
 	if (g_engine->_actionMode == HandAction || g_engine->_actionMode > 4) {
 		int moveableObj = checkCursorAndMoveableObjects();
 		if (moveableObj == -1) {
@@ -417,10 +419,10 @@ void Darkseed::Room::update() {
 	}
 }
 
-bool Darkseed::Room::exitRoom() {
+bool Room::exitRoom() {
 	return false;
 }
-int Darkseed::Room::getExitRoomNumberAtPoint(int x, int y) {
+int Room::getExitRoomNumberAtPoint(int x, int y) {
 	int obj = checkCursorAndStaticObjects(x, y);
 	for (uint i = 0; i < _room1.size(); i++) {
 		if (
@@ -435,14 +437,14 @@ int Darkseed::Room::getExitRoomNumberAtPoint(int x, int y) {
 	}
 	return -1;
 }
-Common::String Darkseed::Room::getRoomFilenameBase(int roomNumber) {
+Common::String Room::getRoomFilenameBase(int roomNumber) {
 	if (roomNumber == 20 || roomNumber == 22) {
 		return "room19";
 	}
 	return Common::String::format("room%d", roomNumber);
 }
 
-bool Darkseed::Room::canWalkAtLocation(int x, int y) {
+bool Room::canWalkAtLocation(int x, int y) {
 	if (x < 69 || x >= 570 || y < 40 || y >= 239) {
 		return false;
 	}
@@ -452,7 +454,7 @@ bool Darkseed::Room::canWalkAtLocation(int x, int y) {
 	return (_walkableLocationsMap[t / 8].strip[(y - 40) / 5] >> ((7 - (t % 8)) & 0x1f) & 1);
 }
 
-bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int destY) {
+bool Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int destY) {
 	int iVar1;
 	int iVar2;
 	int iVar4;
@@ -621,14 +623,14 @@ bool Darkseed::Room::canWalkInLineToTarget(int srcX, int srcY, int destX, int de
 //	return false;
 }
 
-void Darkseed::Room::printRoomDescriptionText() const {
+void Room::printRoomDescriptionText() const {
 	int textId = roomDescriptionTextTbl[_roomNumber];
 	if (textId != 0) {
 		g_engine->_console->printTosText(textId);
 	}
 }
 
-int Darkseed::Room::getRoomExitAtCursor() {
+int Room::getRoomExitAtCursor() {
 	for (uint i = 0; i < _roomObj.size(); i++) {
 		Common::Rect roomRect(_roomObj[i].xOffset, _roomObj[i].yOffset, _roomObj[i].xOffset + _roomObj[i].width, _roomObj[i].yOffset + _roomObj[i].height);
 		if (_roomObj[i].type == 0 && _roomObj[i].objNum < 6 && roomRect.contains(g_engine->_cursor.getPosition())) {
@@ -639,7 +641,7 @@ int Darkseed::Room::getRoomExitAtCursor() {
 	return 0;
 }
 
-void Darkseed::Room::getWalkTargetForObjectType_maybe(int objId) {
+void Room::getWalkTargetForObjectType_maybe(int objId) {
 	for (uint i = 0; i < _roomObj.size(); i++) {
 		if (_roomObj[i].objNum == objId && _roomObj[i].type == 4) {
 			g_engine->_player->_walkTarget.x = _roomObj[i].xOffset;
@@ -708,7 +710,7 @@ static const uint8 room_sprite_related_2c85_4303[] = {
 	15
 };
 
-void Darkseed::Room::calculateScaledSpriteDimensions(int width, int height, int curYPosition) {
+void Room::calculateScaledSpriteDimensions(int width, int height, int curYPosition) {
 	int local_6 = (g_engine->_sprite_y_scaling_threshold_maybe - 2) - curYPosition;
 	if (local_6 <= 0) {
 		local_6 = 0;
@@ -718,7 +720,7 @@ void Darkseed::Room::calculateScaledSpriteDimensions(int width, int height, int
 	g_engine->_scaledSpriteHeight = (height * g_engine->_scaledWalkSpeed_maybe) / 1000;
 }
 
-uint16 Darkseed::Room::getDoorTargetRoom(int objId) {
+uint16 Room::getDoorTargetRoom(int objId) {
 	for (uint i = 0; i < _roomObj.size(); i++) {
 		if (_roomObj[i].objNum == objId && _roomObj[i].type == 4) {
 			for (uint j = 0; j < _room1.size(); j++) {
@@ -736,7 +738,7 @@ uint16 Darkseed::Room::getDoorTargetRoom(int objId) {
 	return g_engine->_targetRoomNumber; //TODO is this a safe fallback if no door exists?
 }
 
-int Darkseed::Room::getObjectUnderCursor() {
+int Room::getObjectUnderCursor() {
 	_collisionType = 0;
 	int objIdx = checkCursorAndMoveableObjects();
 	if (objIdx == -1) {
@@ -748,7 +750,7 @@ int Darkseed::Room::getObjectUnderCursor() {
 	return objIdx;
 }
 
-bool Darkseed::Room::isOutside() {
+bool Room::isOutside() {
 	bool isRoomOutside;
 
 	if (_roomNumber == 61) {
@@ -771,7 +773,7 @@ bool Darkseed::Room::isOutside() {
 	return isRoomOutside;
 }
 
-void Darkseed::Room::runRoomObjects() {
+void Room::runRoomObjects() {
 	if (_roomNumber == 61) {
 		drawTrunk();
 	}
@@ -1165,11 +1167,11 @@ void Darkseed::Room::runRoomObjects() {
 	}
 }
 
-bool Darkseed::Room::isGiger() {
+bool Room::isGiger() {
 	return _roomNumber >= 38 && (_roomNumber <= 60 || _roomNumber >= 66);
 }
 
-void Darkseed::Room::removeObjectFromRoom(int16 objNum) {
+void Room::removeObjectFromRoom(int16 objNum) {
 	if (_collisionType == 0) {
 		for (auto &roomObj : _roomObj) {
 			if (roomObj.objNum == objNum) {
@@ -1183,7 +1185,7 @@ void Darkseed::Room::removeObjectFromRoom(int16 objNum) {
 	}
 }
 
-void Darkseed::Room::updateRoomObj(int16 objNum, int16 x, int16 width, int16 y, int16 height) {
+void Room::updateRoomObj(int16 objNum, int16 x, int16 width, int16 y, int16 height) {
 	for (auto &roomObj : _roomObj) {
 		if (roomObj.type == 0 && roomObj.objNum == objNum) {
 			roomObj.xOffset = x;
@@ -1207,7 +1209,7 @@ void Darkseed::Room::updateRoomObj(int16 objNum, int16 x, int16 width, int16 y,
 	}
 }
 
-void Darkseed::Room::drawTrunk() {
+void Room::drawTrunk() {
 	int trunkXPos;
 	int trunkYPos;
 	int spriteIdx;
@@ -1249,7 +1251,7 @@ void Darkseed::Room::drawTrunk() {
 	return;
 }
 
-void Darkseed::Room::advanceLocAnimFrame(int roomObjIdx) {
+void Room::advanceLocAnimFrame(int roomObjIdx) {
 	const Obt &anim = _locationSprites.getAnimAt(_roomObj[roomObjIdx].spriteNum);
 	g_engine->_objRestarted = false;
 	_locObjFrameTimer[roomObjIdx]--;
@@ -1263,7 +1265,7 @@ void Darkseed::Room::advanceLocAnimFrame(int roomObjIdx) {
 	}
 }
 
-bool Darkseed::Room::advanceFrame(int animIdx) {
+bool Room::advanceFrame(int animIdx) {
 	g_engine->_frameAdvanced = false;
 	const Obt &anim = _locationSprites.getAnimAt(animIdx);
 	g_engine->_objRestarted = false;
@@ -1280,7 +1282,7 @@ bool Darkseed::Room::advanceFrame(int animIdx) {
 	return g_engine->_frameAdvanced;
 }
 
-void Darkseed::Room::mikeStickThrowAnim() {
+void Room::mikeStickThrowAnim() {
 	advanceFrame(2);
 	if (!g_engine->_objRestarted) {
 		g_engine->_player->_frameIdx = _locationSprites.getAnimAt(2)._frameNo[_locObjFrame[2]];
@@ -1292,7 +1294,7 @@ void Darkseed::Room::mikeStickThrowAnim() {
 	}
 }
 
-void Darkseed::Room::loadRoom61AWalkableLocations() {
+void Room::loadRoom61AWalkableLocations() {
 	Common::File file;
 	Common::Path romFilename = g_engine->getRoomFilePath(Common::Path("room61a.rom"));
 	if (!file.open(romFilename)) {
@@ -1306,11 +1308,11 @@ void Darkseed::Room::loadRoom61AWalkableLocations() {
 	}
 }
 
-void Darkseed::Room::restorePalette() {
+void Room::restorePalette() {
 	_palLoaded = false;
 }
 
-void Darkseed::Room::darkenSky() {
+void Room::darkenSky() {
 	if (isOutside() && g_engine->_currentTimeInSeconds / 3600 > 16) {
 		Pal workPal(_pal);
 		int timeOffset = g_engine->_currentTimeInSeconds - 61200;
@@ -1328,14 +1330,14 @@ void Darkseed::Room::darkenSky() {
 	}
 }
 
-void Darkseed::Room::loadLocationSprites(const Common::Path &path) {
+void Room::loadLocationSprites(const Common::Path &path) {
 	_locationSprites.load(path);
 	for (int i = 0; i < _locationSprites.getTotalAnim(); i++) {
 		_locObjFrameTimer[i] = _locationSprites.getAnimAt(i)._frameDuration[0];
 	}
 }
 
-Common::Point Darkseed::Room::getExitPointForRoom(uint8 roomNumber) {
+Common::Point Room::getExitPointForRoom(uint8 roomNumber) {
 	for (unsigned int i = 0; i < _room1.size(); i++) {
 		if (_room1[i].roomNumber == roomNumber) {
 			return Common::Point(_room1[i].x, _room1[i].y);
@@ -1343,3 +1345,5 @@ Common::Point Darkseed::Room::getExitPointForRoom(uint8 roomNumber) {
 	}
 	return Common::Point();
 }
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/sound.cpp b/engines/darkseed/sound.cpp
index 741467642bd..fe506ff8643 100644
--- a/engines/darkseed/sound.cpp
+++ b/engines/darkseed/sound.cpp
@@ -25,12 +25,14 @@
 #include "darkseed/sound.h"
 #include "darkseed/darkseed.h"
 
-Darkseed::Sound::Sound(Audio::Mixer *mixer) : _mixer(mixer) {
+namespace Darkseed {
+
+Sound::Sound(Audio::Mixer *mixer) : _mixer(mixer) {
 	_didSpeech.resize(978);
 	resetSpeech();
 }
 
-void Darkseed::Sound::playTosSpeech(int tosIdx) {
+void Sound::playTosSpeech(int tosIdx) {
 	if (!g_engine->isCdVersion() || _didSpeech[tosIdx] == 1) {
 		return;
 	}
@@ -40,30 +42,32 @@ void Darkseed::Sound::playTosSpeech(int tosIdx) {
 	if (!f.open(path)) {
 		return;
 	}
-	Common::SeekableReadStream *srcStream = f.readStream(f.size());
+	Common::SeekableReadStream *srcStream = f.readStream((uint32)f.size());
 	Audio::SeekableAudioStream *stream = Audio::makeVOCStream(srcStream,
 															  Audio::FLAG_UNSIGNED, DisposeAfterUse::YES);
 	_mixer->playStream(Audio::Mixer::kSpeechSoundType, &_speechHandle, stream);
 	_didSpeech[tosIdx] = 1;
 }
 
-bool Darkseed::Sound::isPlayingSpeech() {
+bool Sound::isPlayingSpeech() {
 	return _mixer->isSoundHandleActive(_speechHandle);
 }
 
-void Darkseed::Sound::waitForSpeech() {
+void Sound::waitForSpeech() {
 	while (isPlayingSpeech()) {
 		// TODO poll events / wait a bit here.
 	}
 }
 
-void Darkseed::Sound::resetSpeech() {
+void Sound::resetSpeech() {
 	for (int i = 0; i < (int)_didSpeech.size(); i++) {
 		_didSpeech[i] = 0;
 	}
 }
 
-Common::Error Darkseed::Sound::sync(Common::Serializer &s) {
+Common::Error Sound::sync(Common::Serializer &s) {
 	s.syncArray(_didSpeech.data(), _didSpeech.size(), Common::Serializer::Byte);
 	return Common::kNoError;
 }
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/sprites.cpp b/engines/darkseed/sprites.cpp
index 8bc97d0eb8f..36cef09389f 100644
--- a/engines/darkseed/sprites.cpp
+++ b/engines/darkseed/sprites.cpp
@@ -22,13 +22,15 @@
 #include "darkseed/sprites.h"
 #include "darkseed/darkseed.h"
 
+namespace Darkseed {
+
 #define DARKSEED_MAX_SPRITES_ON_SCREEN 30
 
-Darkseed::Sprites::Sprites() {
+Sprites::Sprites() {
 	_spriteDrawList.reserve(DARKSEED_MAX_SPRITES_ON_SCREEN);
 }
 
-void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Darkseed::Sprite *sprite, uint8 order, uint16 destW, uint16 destH, bool flip) {
+void Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Sprite *sprite, uint8 order, uint16 destW, uint16 destH, bool flip) {
 	if (_spriteDrawList.size() == DARKSEED_MAX_SPRITES_ON_SCREEN || destX >= 570) {
 		return;
 	}
@@ -55,14 +57,14 @@ void Darkseed::Sprites::addSpriteToDrawList(uint16 destX, uint16 destY, const Da
 	}
 }
 
-void Darkseed::Sprites::clearSpriteDrawList() {
+void Sprites::clearSpriteDrawList() {
 	// not using clear() here to avoid freeing array storage memory.
 	while (!_spriteDrawList.empty()) {
 		_spriteDrawList.pop_back();
 	}
 }
 
-void Darkseed::Sprites::drawSprites() {
+void Sprites::drawSprites() {
 	for (int i = _spriteDrawList.size() - 1; i >= 0; i--) {
 		SpriteDrawInstruction &drawInstruction = _spriteDrawList[i];
 		if (drawInstruction.sprite->_width == drawInstruction.destW && drawInstruction.sprite->_height == drawInstruction.destH && !drawInstruction.flip) {
@@ -72,3 +74,5 @@ void Darkseed::Sprites::drawSprites() {
 		}
 	}
 }
+
+} // End of namespace Darkseed


Commit: 5eb4d27120f3d3daa2f4f8e74ddef7ef1c44a2a3
    https://github.com/scummvm/scummvm/commit/5eb4d27120f3d3daa2f4f8e74ddef7ef1c44a2a3
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Formatting

Changed paths:
    engines/darkseed/console.h


diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
index e37d7ede8ba..09693d037b6 100644
--- a/engines/darkseed/console.h
+++ b/engines/darkseed/console.h
@@ -1,4 +1,3 @@
-
 /* ScummVM - Graphic Adventure Engine
  *
  * ScummVM is the legal property of its developers, whose names


Commit: 769d9659793078d000d9b54f17943c81c0dfe273
    https://github.com/scummvm/scummvm/commit/769d9659793078d000d9b54f17943c81c0dfe273
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Move core animation logic into its own class

Changed paths:
  A engines/darkseed/animation.cpp
  A engines/darkseed/animation.h
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/inventory.cpp
    engines/darkseed/module.mk
    engines/darkseed/player.cpp
    engines/darkseed/room.cpp
    engines/darkseed/usecode.cpp


diff --git a/engines/darkseed/animation.cpp b/engines/darkseed/animation.cpp
new file mode 100644
index 00000000000..336dae882f2
--- /dev/null
+++ b/engines/darkseed/animation.cpp
@@ -0,0 +1,838 @@
+/* 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 "darkseed/darkseed.h"
+#include "darkseed/animation.h"
+
+namespace Darkseed {
+
+void Animation::setupOtherNspAnimation(int nspAnimIdx, int animId) {
+	assert(nspAnimIdx < 20);
+	_player->_playerIsChangingDirection = false;
+	_nsp_sprite_scaling_y_position = 0;
+	_scaleSequence = false;
+
+	_animIndexTbl[nspAnimIdx] = 0;
+	if (_player->_animations.getTotalAnim() > nspAnimIdx) {
+		_spriteAnimCountdownTimer[nspAnimIdx] = _player->_animations.getAnimAt(nspAnimIdx)._frameDuration[0];
+		_player->_frameIdx = _player->_animations.getAnimAt(nspAnimIdx)._frameNo[0];
+	} else {
+		_spriteAnimCountdownTimer[nspAnimIdx] = 0;
+		_player->_frameIdx = 0;
+	}
+	_isPlayingAnimation_maybe = true;
+	_otherNspAnimationType_maybe = animId;
+
+	g_engine->_player_sprite_related_2c85_82f3 = 0;
+	_objRestarted = false;
+
+	if (_otherNspAnimationType_maybe < 2) {
+		return;
+	}
+
+	// TODO big switch here to init the different animation types.
+	switch (_otherNspAnimationType_maybe) {
+	case 2:
+		_player->_position.x = 188;
+		_player->_position.y = 94;
+		break;
+	case 3:
+		// TODO
+		//		if ((_SoundDevice != '\x01') && ((char)g_engine->_currentDay == '\x03')) {
+		//			LoadModeSong(7);
+		//			PlaySound(0,6,-1);
+		//		}
+		_scaleSequence = 1;
+		break;
+	case 4:
+	case 14:
+	case 15:
+	case 18:
+	case 21:
+	case 22:
+	case 24:
+	case 25:
+	case 65:
+		_scaleSequence = 1;
+		break;
+	case 6 : // stairs
+		_nsp_sprite_scaling_y_position = 0xbe;
+		_scaleSequence = true;
+		break;
+	case 7 : // stairs down
+		_nsp_sprite_scaling_y_position = 0xbe;
+		_scaleSequence = true;
+		break;
+	case 8 :
+		_player->_position.x = 249;
+		_player->_position.y = 92;
+		break;
+	case 16 :
+		_player->_position.x = 324;
+		_player->_position.y = 50;
+		break;
+	case 19:
+	case 23:
+		_scaleSequence = true;
+		_player->_frameIdx = 24;
+		break;
+	case 20:
+		_spriteAnimCountdownTimer[3] = 3;
+		break;
+	case 26 :
+		_player->_position.x = 324;
+		_player->_position.y = 135;
+		break;
+	case 27 :
+		_player->_position.x = 397;
+		_player->_position.y = 84;
+		break;
+	case 28 :
+		_player->_position.x = 397;
+		_player->_position.y = 77;
+		break;
+	case 39:
+		_scaleSequence = true;
+		_player->_frameIdx = g_engine->_room->_locationSprites.getAnimAt(nspAnimIdx)._frameNo[0];
+		break;
+	case 41 :
+	case 42 :
+		_player->_position.x = 432;
+		_player->_position.y = 78;
+		break;
+	case 44:
+	case 46:
+		g_engine->playSound(30, 5, -1);
+		break;
+	case 47:
+		_scaleSequence = true;
+		_player->_frameIdx = g_engine->_room->_locationSprites.getAnimAt(nspAnimIdx)._frameNo[0];
+		break;
+	case 53 :
+	case 54 :
+		_player->_position.x = 308;
+		_player->_position.y = 160;
+		break;
+	case 55 :
+		_player->_position.x = 150;
+		_player->_position.y = 104;
+		break;
+	case 56 :
+		_player->_position.x = 142;
+		_player->_position.y = 104;
+		break;
+	case 57:
+	case 58:
+		g_engine->playSound(48, 5, -1);
+		break;
+	case 63:
+		_player->_position.x = 249;
+		_player->_position.y = 92;
+		g_engine->_phoneStatus = 1;
+		break;
+	default:
+		break;
+	}
+}
+
+void Animation::updateAnimation() {
+	int currentRoomNumber = g_engine->_room->_roomNumber;
+	switch (_otherNspAnimationType_maybe) {
+	case 0:
+		break;
+	case 1 : // sleep wake anim
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
+		} else {
+			_player->_position.x = 0xdf;
+			_player->_position.y = 0xbe;
+			_player->_walkTarget.x = 0xdf;
+			_player->_walkTarget.y = 0xbe;
+			_player->updateSprite();
+		}
+		break;
+	case 2:
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
+		} else {
+			_player->_position.x = 218;
+			_player->_position.y = 198;
+			_player->_direction = 2;
+			_player->updateSprite();
+			_player->_walkTarget.x = 218;
+			_player->_walkTarget.y = 198;
+			_objectVar[52] = 0;
+			//			StopVOC(); TODO
+		}
+		break;
+	case 3:
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
+		} else {
+			if (g_engine->_room->isGiger()) {
+				g_engine->stuffPlayer();
+			} else {
+				if (g_engine->_room->isOutside() && g_engine->_currentTimeInSeconds > 61200) {
+					g_engine->_room->restorePalette();
+				}
+				g_engine->gotonextmorning();
+				g_engine->playDayChangeCutscene();
+			}
+		}
+		break;
+	case 4:
+	case 21:
+	case 22: // dig up grave
+		advanceAnimationFrame(0);
+		if (_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]] % 5 == 3 &&
+			_player->_animations.getAnimAt(0)._frameDuration[_animIndexTbl[0]] == _spriteAnimCountdownTimer[0]) {
+			g_engine->playSound(14, 5, -1);
+		}
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
+		} else {
+			_isPlayingAnimation_maybe = false;
+			_objectVar[52] = 1;
+			if (_otherNspAnimationType_maybe == 21 && _objectVar[151] != 0) {
+				if (_objectVar[87] == 0) {
+					_objectVar[88] = 1;
+					_objectVar[87] = 1;
+					g_engine->_console->printTosText(581);
+					g_engine->_inventory.addItem(29);
+				} else {
+					g_engine->_console->printTosText(582);
+				}
+			} else {
+				_objectVar[88] = 1;
+				g_engine->_console->printTosText(580);
+			}
+		}
+		break;
+	case 5: // goto sleep animation
+		_player->_position.x = 135;
+		_player->_position.y = 91;
+		advanceAnimationFrame(1);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]];
+		} else {
+			g_engine->gotonextmorning(); // TODO there might be some extra logic required from original function
+			_player->_position.x = 242;
+			_player->_position.y = 187;
+			g_engine->playDayChangeCutscene();
+		}
+		_player->_position.x = 242;
+		_player->_position.y = 187;
+		break;
+	case 6: // stairs up
+		if (currentRoomNumber == 6) {
+			advanceAnimationFrame(1);
+		} else {
+			advanceAnimationFrame(2);
+		}
+		if (_frameAdvanced && ((currentRoomNumber == 6 && _animIndexTbl[1] == 1) || (currentRoomNumber == 5 && _animIndexTbl[2] == 1))) {
+			//			FUN_1208_0dacg_engine->_sound_related(0xd,CONCAT11(uVar4,5));
+		}
+		if (!_objRestarted) {
+			if (currentRoomNumber == 6) {
+				_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]];
+			} else {
+				_player->_frameIdx = _player->_animations.getAnimAt(2)._frameNo[_player->_animations.getAnimAt(2)._frameNo[_animIndexTbl[2]]];
+			}
+		} else {
+			if (currentRoomNumber == 6) {
+				g_engine->_previousRoomNumber = 6;
+				g_engine->changeToRoom(5);
+			}
+			if (_player->_isAutoWalkingToBed) {
+				_player->setplayertowardsbedroom();
+			}
+		}
+		break;
+	case 7: // stairs down
+		if (currentRoomNumber == 5) {
+			advanceAnimationFrame(3);
+			if (_frameAdvanced && _animIndexTbl[3] == 1) {
+				// FUN_1208_0dacg_engine->_sound_related(0xd,CONCAT11(extraout_AH_05,5));
+			}
+			if (!_objRestarted) {
+				_player->_frameIdx = _player->_animations.getAnimAt(3)._frameNo[_player->_animations.getAnimAt(3)._frameNo[_animIndexTbl[3]]];
+			} else {
+				g_engine->_previousRoomNumber = 5;
+				g_engine->changeToRoom(6);
+			}
+		} else {
+			advanceAnimationFrame(0);
+			if (_frameAdvanced && _animIndexTbl[0] == 1) {
+				// FUN_1208_0dacg_engine->_sound_related(0xd,CONCAT11(extraout_AH_05,5));
+			}
+			if (!_objRestarted) {
+				_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
+			}
+		}
+		break;
+	case 8: //phone call
+	case 63:
+		if (_otherNspAnimationType_maybe == 8) {
+			advanceAnimationFrame(0);
+		} else {
+			advanceAnimationFrame(2);
+			if (g_engine->_phoneStatus == 1) {
+				g_engine->_phoneStatus = 2;
+			}
+		}
+		if (!_objRestarted) {
+			if (_otherNspAnimationType_maybe == 8) {
+				_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
+			} else {
+				_player->_frameIdx = _player->_animations.getAnimAt(2)._frameNo[_player->_animations.getAnimAt(2)._frameNo[_animIndexTbl[2]]];
+			}
+		} else {
+			if (_otherNspAnimationType_maybe == 63) {
+				g_engine->_console->printTosText(44);
+				setupOtherNspAnimation(1, 64);
+			} else {
+				_objectVar.setObjectRunningCode(47, 0);
+				if (g_engine->_currentDay == 1) {
+					g_engine->_console->printTosText(904);
+					_objectVar[47] = 1;
+					_objectVar[46] = 1;
+				} else {
+					_objectVar[51] = 2;
+					_objectVar[47] = 1;
+					g_engine->_console->printTosText(922);
+				}
+				g_engine->_sound->waitForSpeech();
+				setupOtherNspAnimation(1, 9);
+			}
+		}
+		break;
+	case 9: // hang up phone
+	case 64:
+		advanceAnimationFrame(1);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]];
+		} else {
+			_player->_position.x = 300;
+			_player->_position.y = 183;
+			_player->_walkTarget.x = 300;
+			_player->_walkTarget.y = 183;
+			_player->_direction = 3;
+			_player->updateSprite();
+		}
+		break;
+	case 11:
+		advanceAnimationFrame(1);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
+		} else {
+			_player->_position.x = 175;
+			_player->_position.y = 200;
+			_player->_walkTarget.x = 175;
+			_player->_walkTarget.y = 200;
+			_player->updateSprite();
+			if (_player->_isAutoWalkingToBed) {
+				_player->setplayertowardsbedroom();
+			}
+		}
+		break;
+	case 12:
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
+		} else {
+			_player->_position.x = 360;
+			_player->_position.y = 238;
+			_player->_walkTarget.x = 360;
+			_player->_walkTarget.y = 238;
+			_player->_direction = 3;
+			g_engine->changeToRoom(2);
+		}
+		break;
+	case 13:
+		advanceAnimationFrame(1);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
+		} else {
+			_player->_position.x = 450;
+			_player->_position.y = 217;
+			_player->_walkTarget.x = 450;
+			_player->_walkTarget.y = 217;
+			_player->_direction = 3;
+			_player->updateSprite();
+		}
+		break;
+	case 16: // climb down rope
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
+		} else {
+			_player->_position.x = 336;
+			_player->_position.y = 195;
+			_player->_walkTarget.x = 336;
+			_player->_walkTarget.y = 195;
+			_player->_direction = 1;
+			_player->updateSprite();
+		}
+		break;
+	case 17: // open trunk with crowbar
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
+		}
+		if (_animIndexTbl[0] == 5 && _frameAdvanced) {
+			g_engine->playSound(31, 5, -1);
+			g_engine->_console->printTosText(666);
+			if (_objectVar[42] == 0) {
+				_objectVar[42] = 1;
+			} else {
+				_objectVar[42] = 3;
+			}
+		}
+		break;
+	case 18: // push trunk
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
+		}
+		if (_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]] == 3 && _frameAdvanced) {
+			g_engine->_console->printTosText(_objectVar[22] + 662);
+			_objectVar[22] = _objectVar[22] + 1;
+			if (_objectVar[22] == 3) {
+				g_engine->_room->loadRoom61AWalkableLocations();
+			}
+		}
+		break;
+	case 19: // pickup book from library
+		_player->_frameIdx = 24;
+		if (_objRestarted) {
+			_isPlayingAnimation_maybe = true;
+			_objectVar[46] = 2;
+			g_engine->libanim(true);
+		}
+		break;
+	case 20: // receive card from delbert
+		advanceAnimationFrame(3);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(3)._frameNo[_animIndexTbl[3]];
+		} else {
+			g_engine->_inventory.addItem(18);
+		}
+		break;
+	case 23:
+		_player->_frameIdx = 24;
+		if (_objRestarted != 0) {
+			_isPlayingAnimation_maybe = false;
+			_objectVar[99] = 1;
+			g_engine->_console->printTosText(468);
+		}
+		break;
+	case 10:
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
+		} else {
+			g_engine->_previousRoomNumber = g_engine->_room->_roomNumber;
+			g_engine->changeToRoom(61);
+		}
+		break;
+	case 14:
+	case 15:
+	case 24:
+	case 25:
+		// Open doors
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
+		} else {
+			_player->updateSprite();
+			if (_otherNspAnimationType_maybe == 14) {
+				// TODO
+				if (_objectVar.getObjectRunningCode(140) == 0 || g_engine->_room->_roomNumber != 6) {
+					g_engine->_previousRoomNumber = g_engine->_room->_roomNumber;
+					int newRoomNumber = g_engine->_previousRoomNumber;
+					if (g_engine->_room->_roomNumber == 6) {
+						if (_player->_isAutoWalkingToBed && _objectVar[137] == 2) {
+							g_engine->wongame();
+						}
+						newRoomNumber = 10;
+					} else if (g_engine->_room->_roomNumber == 10) {
+						newRoomNumber = 6;
+					} else if (g_engine->_room->_roomNumber == 11) {
+						if (_player->_position.x < 250) {
+							newRoomNumber = 15;
+						} else {
+							newRoomNumber = 16;
+						}
+					} else {
+						newRoomNumber = 17;
+					}
+					g_engine->changeToRoom(newRoomNumber);
+				} else {
+					_objectVar.setObjectRunningCode(140, 0);
+					g_engine->getPackageObj(g_engine->_currentDay);
+				}
+			}
+			if (_otherNspAnimationType_maybe == 25) {
+				g_engine->_previousRoomNumber = 33;
+				g_engine->changeToRoom(34);
+			}
+		}
+		break;
+	case 26: // climb up rope.
+		advanceAnimationFrame(1);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
+		} else {
+			g_engine->_previousRoomNumber = g_engine->_room->_roomNumber;
+			g_engine->changeToRoom(13);
+		}
+		break;
+	case 27:
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]]; // TODO check if this is correct.
+		} else {
+			g_engine->_previousRoomNumber = g_engine->_room->_roomNumber;
+			g_engine->changeToRoom(38);
+		}
+		break;
+	case 28: // step out of mirror normal world
+		advanceAnimationFrame(1);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
+		} else {
+			_player->_position.x = 418;
+			_player->_position.y = 170;
+			_player->_direction = 3;
+			_player->updateSprite();
+			_player->_walkTarget = _player->_position;
+		}
+		break;
+	case 30:
+	case 31: {
+		int animIdx = _otherNspAnimationType_maybe - 30;
+		advanceAnimationFrame(animIdx);
+		if (_isPlayingAnimation_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(animIdx)._frameNo[_animIndexTbl[animIdx]];
+		}
+		if (_objRestarted && _otherNspAnimationType_maybe == 30) {
+			setupOtherNspAnimation(1, 31);
+		}
+		break;
+	}
+	case 32:
+	case 33:
+	case 34: {
+		_objectVar[112] = 1;
+		int animIdx = _otherNspAnimationType_maybe - 30;
+		advanceAnimationFrame(animIdx);
+		// TODO play sfx.
+		if (_isPlayingAnimation_maybe) {
+			_player->_frameIdx = _player->_animations.getAnimAt(animIdx)._frameNo[_animIndexTbl[animIdx]];
+		}
+		if (_objRestarted && (_otherNspAnimationType_maybe == 32 || _otherNspAnimationType_maybe == 33)) {
+			setupOtherNspAnimation(_otherNspAnimationType_maybe - 29, _otherNspAnimationType_maybe + 1);
+		}
+		break;
+	}
+	case 35: // pay shopkeeper
+		advanceAnimationFrame(6);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(6)._frameNo[_animIndexTbl[6]];
+		} else {
+			_objectVar[8]++;
+			if (_objectVar[8] > 2) {
+				g_engine->_inventory.removeItem(8);
+			}
+			_objectVar[138]++;
+			g_engine->_console->printTosText(927);
+		}
+		break;
+	case 36:
+	case 37: // smash mirror
+		advanceAnimationFrame(_otherNspAnimationType_maybe - 36);
+		_player->_frameIdx = _player->_animations.getAnimAt(_otherNspAnimationType_maybe - 36)._frameNo[_animIndexTbl[_otherNspAnimationType_maybe - 36]];
+		if (_frameAdvanced && _otherNspAnimationType_maybe == 36 && _player->_frameIdx == 4) {
+			g_engine->playSound(28, 5, -1);
+		}
+		if (_objRestarted) {
+			if (_otherNspAnimationType_maybe == 36) {
+				setupOtherNspAnimation(1, 37);
+			} else {
+				_objectVar[137] = 2;
+				_player->_isAutoWalkingToBed = true;
+				_player->setplayertowardsbedroom();
+			}
+		}
+		break;
+	case 38:
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
+		} else {
+			g_engine->stuffPlayer();
+		}
+		break;
+	case 39: // Arrest Mike.
+		g_engine->_room->advanceFrame(1);
+		if (!_objRestarted) {
+			_player->_frameIdx = g_engine->_room->_locationSprites.getAnimAt(1)._frameNo[g_engine->_room->_locObjFrame[1]];
+		} else {
+			g_engine->throwmikeinjail();
+		}
+		break;
+	case 40: // give Delbert's card to cop.
+		advanceAnimationFrame(1);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
+		} else {
+			g_engine->_console->printTosText(61);
+			g_engine->_console->draw();
+			g_engine->_screen->updateScreen();
+			g_engine->waitxticks(60);
+			g_engine->_previousRoomNumber = g_engine->_room->_roomNumber;
+			_player->_position.x = 240;
+			_player->_position.y = 200;
+			_player->updateSprite();
+			_isPlayingAnimation_maybe = false;
+			g_engine->changeToRoom(15, true);
+			g_engine->_inventory.removeItem(41);
+			g_engine->_inventory.removeItem(18);
+			_objectVar.setMoveObjectRoom(41, 255);
+		}
+		break;
+	case 41:
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
+		} else {
+			g_engine->_previousRoomNumber = g_engine->_room->_roomNumber;
+			g_engine->changeToRoom(7);
+		}
+		break;
+	case 42: // step out of mirror giger world
+		advanceAnimationFrame(1);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
+		} else {
+			_player->_position.x = 456;
+			_player->_position.y = 173;
+			_player->_direction = 3;
+			_player->updateSprite();
+			_player->_walkTarget = _player->_position;
+		}
+		break;
+	case 43:
+	case 44:
+	case 45:
+	case 46: {
+		int iVar4 = 0;
+		if ((_otherNspAnimationType_maybe == 44) || (_otherNspAnimationType_maybe == 46)) {
+			iVar4 = 1;
+		}
+		advanceAnimationFrame(iVar4);
+		_player->_frameIdx = _player->_animations.getAnimAt(iVar4)._frameNo[_player->_animations.getAnimAt(iVar4)._frameNo[_animIndexTbl[iVar4]]];
+		//		_HeroSpr = (uint) * (byte *)((int)&DAT_1060_7eb8 + *(int *)((int)&_ObjFrame + iVar4 * 2) + iVar4 * 202);
+		if (!_objRestarted || (_otherNspAnimationType_maybe != 46 && _otherNspAnimationType_maybe != 44)) {
+			if (_otherNspAnimationType_maybe == 45) {
+				_objectVar[117] = 1;
+			} else if (_objRestarted) {
+				if ((_objectVar[71] == 2) && (_objectVar[44] != 0)) {
+					g_engine->_console->printTosText(896);
+					_objectVar[57] = 1;
+				} else {
+					g_engine->_console->printTosText(897);
+				}
+			}
+		} else {
+			//			LoadModeSong(7); TODO
+			g_engine->playSound(0, 6, -1);
+			g_engine->stuffPlayer();
+		}
+		break;
+	}
+	case 47:
+		g_engine->_room->mikeStickThrowAnim();
+		break;
+	case 48:
+	case 49:
+	case 50:
+	case 51:
+	case 52:
+		// open/close cupboards, oven
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
+		} else {
+			if (_otherNspAnimationType_maybe == 52) {
+				_objectVar[108] = (_objectVar[108] == 0) ? 1 : 0;
+			} else {
+				_objectVar[56 + _otherNspAnimationType_maybe] = _objectVar[56 + _otherNspAnimationType_maybe] == 0 ? 1 : 0;
+			}
+			g_engine->playSound(42, 5, -1);
+		}
+		break;
+	case 53 :
+	case 54 :
+	case 55 :
+	case 56 :
+		advanceAnimationFrame((_otherNspAnimationType_maybe - 53) & 1);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
+		} else {
+			switch (_otherNspAnimationType_maybe) {
+			case 53 :
+				g_engine->_previousRoomNumber = g_engine->_room->_roomNumber;
+				g_engine->changeToRoom(6);
+				break;
+			case 54 :
+				_player->_position.x = 322;
+				_player->_position.y = 220;
+				_player->_walkTarget = _player->_position;
+				_player->_direction = 2;
+				_player->updateSprite();
+				break;
+			case 55 :
+				g_engine->_previousRoomNumber = g_engine->_room->_roomNumber;
+				g_engine->changeToRoom(15);
+				break;
+			case 56 :
+				_player->_position.x = 162;
+				_player->_position.y = 206;
+				_player->_walkTarget = _player->_position;
+				_player->_direction = 2;
+				_player->updateSprite();
+				break;
+			}
+		}
+		if (_frameAdvanced && _animIndexTbl[0] == 1) {
+			// FUN_1208_0dacg_engine->_sound_related(0xd,CONCAT11(extraout_AH_05,5));
+			// PlaySound(1,5,-1);
+		}
+		break;
+	case 57:
+	case 58:
+		advanceAnimationFrame((_otherNspAnimationType_maybe - 57) & 1);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]; //_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
+		} else if (_otherNspAnimationType_maybe == 57) {
+			g_engine->_previousRoomNumber = g_engine->_room->_roomNumber;
+			g_engine->changeToRoom(g_engine->_room->_roomNumber == 41 ? 44 : 41);
+		} else {
+			_player->_direction = 2;
+		}
+		break;
+	case 59: // use shard on mirror
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
+		} else {
+			_player->_direction = 1;
+			_player->updateSprite();
+		}
+		if (_frameAdvanced && _player->_frameIdx == 3) {
+			g_engine->playSound(26, 5, -1);
+		}
+		break;
+	case 60: // turn on alien computer
+		g_engine->_room->advanceFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = g_engine->_room->_locationSprites.getAnimAt(0)._frameNo[g_engine->_room->_locObjFrame[0]];
+		} else {
+			_isPlayingAnimation_maybe = false;
+			_objectVar[187] = 1;
+		}
+		break;
+	case 61: // turn off alien computer
+		g_engine->_room->advanceFrame(1);
+		if (!_objRestarted) {
+			_player->_frameIdx = g_engine->_room->_locationSprites.getAnimAt(1)._frameNo[g_engine->_room->_locObjFrame[1]];
+		} else {
+			_isPlayingAnimation_maybe = false;
+		}
+		_objectVar[187] = 0;
+		break;
+	case 62: // bang cup against bars
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
+		} else {
+			bool bVar5 = _objectVar.getMoveObjectRoom(18) == 250;
+			if (!bVar5) {
+				if (g_engine->_inventory.hasObject(18)) {
+					bVar5 = true;
+				}
+			}
+			if (bVar5) {
+				_isPlayingAnimation_maybe = false;
+				_objectVar.setObjectRunningCode(53, 1);
+				_player->loadAnimations("copcard.nsp");
+				_animIndexTbl[0] = 0;
+				_spriteAnimCountdownTimer[0] = 3;
+				_objectVar[1] = 2000;
+			} else {
+				g_engine->_console->addTextLine("The cops ignore your demands for attention.");
+			}
+		}
+		break;
+	case 65:
+		advanceAnimationFrame(0);
+		if (!_objRestarted) {
+			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
+		} else {
+			_player->updateSprite();
+		}
+		break;
+	default:
+		error("Unhandled animation type! %d", _otherNspAnimationType_maybe);
+	}
+}
+
+void Animation::advanceAnimationFrame(int nspAminIdx) {
+	if (!_scaleSequence) {
+		g_engine->_scaledWalkSpeed_maybe = 1000;
+	} else {
+		g_engine->_room->calculateScaledSpriteDimensions(10, 10, _player->_position.y);
+	}
+	_objRestarted = false;
+	_frameAdvanced = false;
+	const Obt &anim = _player->_animations.getAnimAt(nspAminIdx);
+	_spriteAnimCountdownTimer[nspAminIdx] = _spriteAnimCountdownTimer[nspAminIdx] - 1;
+	if (_spriteAnimCountdownTimer[nspAminIdx] < 1) {
+		_frameAdvanced = true;
+		_animIndexTbl[nspAminIdx] = _animIndexTbl[nspAminIdx] + 1;
+		_player->_position.x += ((int16)anim._deltaX[_animIndexTbl[nspAminIdx]] * g_engine->_scaledWalkSpeed_maybe) / 1000;
+		_player->_position.y += ((int16)anim._deltaY[_animIndexTbl[nspAminIdx]] * g_engine->_scaledWalkSpeed_maybe) / 1000;
+		if (_animIndexTbl[nspAminIdx] == anim._numFrames) {
+			_animIndexTbl[nspAminIdx] = 0;
+			_objRestarted = true;
+			_isPlayingAnimation_maybe = false;
+			_player->_walkTarget.x = _player->_position.x;
+			_player->_walkTarget.y = _player->_position.y;
+			_player->updateSprite();
+		}
+		_spriteAnimCountdownTimer[nspAminIdx] = anim._frameDuration[_animIndexTbl[nspAminIdx]];
+	}
+}
+} // End of namespace Darkseed
diff --git a/engines/darkseed/animation.h b/engines/darkseed/animation.h
new file mode 100644
index 00000000000..8c4845d4fcf
--- /dev/null
+++ b/engines/darkseed/animation.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 DARKSEED_ANIMATION_H
+#define DARKSEED_ANIMATION_H
+
+#include "darkseed/objects.h"
+#include "darkseed/player.h"
+namespace Darkseed {
+
+class Animation {
+private:
+	Player *_player = nullptr;
+	Objects &_objectVar;
+
+public:
+	int _animIndexTbl[30];
+	int _spriteAnimCountdownTimer[30];
+
+	bool _isPlayingAnimation_maybe = false;
+	uint16 _otherNspAnimationType_maybe = 0;
+
+	bool _scaleSequence = false;
+	bool _objRestarted = false;
+	bool _frameAdvanced = false;
+
+	int _nsp_sprite_scaling_y_position = 0;
+
+	void updateAnimation();
+
+	void advanceAnimationFrame(int nspAminIdx);
+
+public:
+	explicit Animation(Player *player, Objects &objectVar) : _player(player), _objectVar(objectVar) {}
+	void setupOtherNspAnimation(int nspAnimIdx, int animId);
+};
+
+} // End of namespace Darkseed
+
+#endif // DARKSEED_ANIMATION_H
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 1d08a2bc574..b63ef5c9359 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -69,6 +69,7 @@ Common::Error DarkseedEngine::run() {
 	_console = new Console(_tosText, _sound);
 	_player = new Player();
 	_useCode = new UseCode(_console, _player, _objectVar, _inventory);
+	_animation = new Animation(_player, _objectVar);
 
 	// Set the engine's debugger console
 	setDebugger(new DebugConsole(_tosText));
@@ -234,7 +235,7 @@ void DarkseedEngine::gameloop() {
 			if (_currentDay == 1 && _currentTimeInSeconds == 64800 && _room->_roomNumber != 16) {
 				_objectVar.setMoveObjectRoom(7, 253); // remove scotch from shop.
 			}
-			if (_timeAdvanceEventSelected && _currentTimeInSeconds < 79200 && !_isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting) {
+			if (_timeAdvanceEventSelected && _currentTimeInSeconds < 79200 && !_animation->_isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting) {
 				_timeAdvanceEventSelected = false;
 				if (((_room->_roomNumber == 30) || ((0 < _objectVar[141] && (_objectVar[141] < 4)))) ||
 					(((_room->_roomNumber == 31 || (_room->_roomNumber == 32)) &&
@@ -273,7 +274,7 @@ void DarkseedEngine::gameloop() {
 				if (_room->isOutside() && _room->_roomNumber != 30) {
 					_inventory.endOfDayOutsideLogic();
 				}
-				if (!_isPlayingAnimation_maybe) {
+				if (!_animation->_isPlayingAnimation_maybe) {
 					if (_room->_roomNumber == 30) {
 						gotosleepinjail();
 					} else {
@@ -290,11 +291,11 @@ void DarkseedEngine::gameloop() {
 						} else {
 							_player->loadAnimations("gliedown.nsp");
 						}
-						setupOtherNspAnimation(0, 3);
+						_animation->setupOtherNspAnimation(0, 3);
 					}
 				}
 			}
-			if (_room->_roomNumber == 30 && _objectVar[1] == 0 && (_otherNspAnimationType_maybe != 40 || !_isPlayingAnimation_maybe || _currentTimeInSeconds > 79199)) {
+			if (_room->_roomNumber == 30 && _objectVar[1] == 0 && (_animation->_otherNspAnimationType_maybe != 40 || !_animation->_isPlayingAnimation_maybe || _currentTimeInSeconds > 79199)) {
 				gotosleepinjail();
 			}
 			updateDisplay(); // Aka serviceRoom()
@@ -329,7 +330,7 @@ void DarkseedEngine::gameloop() {
 			if (_room->_roomNumber == 32 && _currentDay == 2 &&
 				_currentTimeInSeconds > 64799 && _currentTimeInSeconds < 68401 &&
 				  (_objectVar[141] == 5 || _objectVar[141] == 6 || _objectVar[141] == 4
-					 || _objectVar[141] == 12) && !_isPlayingAnimation_maybe) {
+					 || _objectVar[141] == 12) && !_animation->_isPlayingAnimation_maybe) {
 				zeromousebuttons();
 			}
 			updateHeadache();
@@ -471,10 +472,10 @@ void DarkseedEngine::handleInput() {
 		_player->_isAutoWalkingToBed = false;
 		_currentTimeInSeconds = 0x7e90;
 		_player->loadAnimations("bedsleep.nsp");
-		setupOtherNspAnimation(1, 5);
+		_animation->setupOtherNspAnimation(1, 5);
 	}
 
-	if (!_isPlayingAnimation_maybe) {
+	if (!_animation->_isPlayingAnimation_maybe) {
 		if (!_player->_playerIsChangingDirection) {
 			if (currentRoomNumber == 0x39 && _previousRoomNumber == 0x36) {
 				_player->updateSprite();
@@ -676,23 +677,23 @@ void DarkseedEngine::handleInput() {
 								}
 								if (currentRoomNumber == 7 && roomExit.roomNumber == 38 && bVar) {
 									_player->loadAnimations("mirror.nsp");
-									setupOtherNspAnimation(0, 27);
+									_animation->setupOtherNspAnimation(0, 27);
 									return;
 								}
 								if ((currentRoomNumber == 41 && roomExit.roomNumber == 44 && bVar) ||
 									(currentRoomNumber == 44 && roomExit.roomNumber == 41 && bVar)) {
 									_player->loadAnimations("beamer.nsp");
-									setupOtherNspAnimation(0, 57);
+									_animation->setupOtherNspAnimation(0, 57);
 									return;
 								}
 								if (currentRoomNumber == 10 && roomExit.roomNumber == 6 && bVar && !_player->_isAutoWalkingToBed) {
 									_player->loadAnimations("rm10strs.nsp");
-									setupOtherNspAnimation(0, 53);
+									_animation->setupOtherNspAnimation(0, 53);
 									return;
 								}
 								if (currentRoomNumber == 38 && roomExit.roomNumber == 7 && bVar) {
 									_player->loadAnimations("darkin.nsp");
-									setupOtherNspAnimation(0, 41);
+									_animation->setupOtherNspAnimation(0, 41);
 									return;
 								}
 								if (_objectVar[52] == 1 &&
@@ -703,7 +704,7 @@ void DarkseedEngine::handleInput() {
 									// TODO the original sets roomExit to number 8 here.
 								} else if (currentRoomNumber == 11 && roomExit.roomNumber == 15 && bVar) {
 									_player->loadAnimations("rm11strs.nsp");
-									setupOtherNspAnimation(0, 55);
+									_animation->setupOtherNspAnimation(0, 55);
 									return;
 								}
 								if (currentRoomNumber == 14 && roomExit.roomNumber == 35 && _objectVar[99] != 1) {
@@ -717,7 +718,7 @@ void DarkseedEngine::handleInput() {
 												)
 									) {
 									_player->loadAnimations("opendoor.nsp");
-									setupOtherNspAnimation(0, 14);
+									_animation->setupOtherNspAnimation(0, 14);
 									// FUN_1208_0dac_sound_related(10,CONCAT11(extraout_AH,5));
 									return;
 								}
@@ -725,12 +726,12 @@ void DarkseedEngine::handleInput() {
 									_player->_position.x = 346;
 									_player->_position.y = 176;
 									_player->loadAnimations("stairs.nsp");
-									setupOtherNspAnimation(1, 6);
+									_animation->setupOtherNspAnimation(1, 6);
 									return;
 								}
 								if (currentRoomNumber == 33 && roomExit.roomNumber == 34 && bVar) {
 									_player->loadAnimations("opendoor.nsp");
-									setupOtherNspAnimation(0, 25);
+									_animation->setupOtherNspAnimation(0, 25);
 									// FUN_1208_0dac_sound_related(24,CONCAT11(extraout_AH,5));
 									return;
 								}
@@ -738,7 +739,7 @@ void DarkseedEngine::handleInput() {
 									if (_player->_position.x == 466 && _player->_position.y == 195) {
 										_player->loadAnimations("stairs.nsp");
 										_player->_position.x -= 35;
-										setupOtherNspAnimation(3, 7);
+										_animation->setupOtherNspAnimation(3, 7);
 										return;
 									}
 									bVar = false;
@@ -823,7 +824,7 @@ void DarkseedEngine::handleInput() {
 						}
 					}
 				}
-				if (!_isPlayingAnimation_maybe) {
+				if (!_animation->_isPlayingAnimation_maybe) {
 					// walk to destination point
 					int walkXDelta = 0;
 					int walkYDelta = 0;
@@ -988,8 +989,8 @@ void DarkseedEngine::handleInput() {
 			_player->updateSprite();
 		}
 	} else {
-		updateAnimation();
-		if (!_isPlayingAnimation_maybe && _player->_isAutoWalkingToBed) {
+		_animation->updateAnimation();
+		if (!_animation->_isPlayingAnimation_maybe && _player->_isAutoWalkingToBed) {
 			_player->setplayertowardsbedroom();
 		}
 	}
@@ -1039,7 +1040,7 @@ void DarkseedEngine::loadRoom(int roomNumber) {
 		return;
 	}
 	if (roomNumber == 15 && _objectVar.getMoveObjectRoom(28) != 255) {
-		setupOtherNspAnimation(1, 39);
+		_animation->setupOtherNspAnimation(1, 39);
 	}
 }
 
@@ -1069,21 +1070,21 @@ void DarkseedEngine::changeToRoom(int newRoomNumber, bool placeDirectly) { // AK
 		_player->loadAnimations("stairs.nsp");
 		_player->_position.x = 0x174;
 		_player->_position.y = 0x100;
-		setupOtherNspAnimation(2, 6);
+		_animation->setupOtherNspAnimation(2, 6);
 	} else if (newRoomNumber == 6 && _previousRoomNumber == 5) {
 		_player->loadAnimations("stairs.nsp");
 		_player->_position.x = 0x19f;
 		_player->_position.y = 0x8c;
-		setupOtherNspAnimation(0, 7);
+		_animation->setupOtherNspAnimation(0, 7);
 	} else if (newRoomNumber == 32 && _previousRoomNumber == 13) {
 		_player->loadAnimations("slide.nsp");
-		setupOtherNspAnimation(0, 16);
+		_animation->setupOtherNspAnimation(0, 16);
 	} else if (newRoomNumber == 10 && _previousRoomNumber == 6) {
 		_player->loadAnimations("rm10strs.nsp");
-		setupOtherNspAnimation(1, 54);
+		_animation->setupOtherNspAnimation(1, 54);
 	} else if (newRoomNumber == 11 && _previousRoomNumber == 15) {
 		_player->loadAnimations("rm11strs.nsp");
-		setupOtherNspAnimation(1, 56);
+		_animation->setupOtherNspAnimation(1, 56);
 	} else if (newRoomNumber == 46 && _previousRoomNumber == 60 && _objectVar[57] == 1) {
 		_console->printTosText(62);
 		// TODO wait logic here.
@@ -1091,22 +1092,22 @@ void DarkseedEngine::changeToRoom(int newRoomNumber, bool placeDirectly) { // AK
 		return;
 	} else if (newRoomNumber == 7 && _previousRoomNumber == 38) {
 		_player->loadAnimations("mirror.nsp");
-		setupOtherNspAnimation(1, 28);
+		_animation->setupOtherNspAnimation(1, 28);
 		if (_objectVar[47] == 0 && _currentDay == 3 && _objectVar[51] == 1) {
 			_objectVar.setObjectRunningCode(47, 2);
 		}
 	} else if ((newRoomNumber == 38) && (_previousRoomNumber == 7)) {
 		_player->loadAnimations("darkout.nsp");
-		setupOtherNspAnimation(1, 42);
+		_animation->setupOtherNspAnimation(1, 42);
 	} else if ((_previousRoomNumber == 2) && (newRoomNumber == 3)) {
 		_player->loadAnimations("rtladder.nsp");
-		setupOtherNspAnimation(1, 13);
+		_animation->setupOtherNspAnimation(1, 13);
 	} else if ((_previousRoomNumber == 61) && (newRoomNumber == 5)) {
 		_player->loadAnimations("ltladder.nsp");
-		setupOtherNspAnimation(1, 11);
+		_animation->setupOtherNspAnimation(1, 11);
 	} else if ((_previousRoomNumber == 41 && newRoomNumber == 44) || (_previousRoomNumber == 44 && newRoomNumber == 41)) {
 		_player->loadAnimations("beamer.nsp");
-		setupOtherNspAnimation(1, 58);
+		_animation->setupOtherNspAnimation(1, 58);
 		for (auto &exit : _room->_room1) {
 			if (exit.roomNumber == _previousRoomNumber) {
 				_player->_position.x = exit.x + exit.width / 2;
@@ -1132,7 +1133,7 @@ void DarkseedEngine::changeToRoom(int newRoomNumber, bool placeDirectly) { // AK
 		}
 	}
 
-	if (!g_engine->_isPlayingAnimation_maybe) {
+	if (!g_engine->_animation->_isPlayingAnimation_maybe) {
 		g_engine->_player->updateSprite();
 	}
 	_room->initRoom();
@@ -1163,8 +1164,8 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 	_sprites.clearSpriteDrawList();
 	_room->runRoomObjects();
 	runObjects();
-	if (_isPlayingAnimation_maybe == 0 ||
-		(_otherNspAnimationType_maybe != 6 && _otherNspAnimationType_maybe != 7) || currentRoomNumber != 5) {
+	if (_animation->_isPlayingAnimation_maybe == 0 ||
+		(_animation->_otherNspAnimationType_maybe != 6 && _animation->_otherNspAnimationType_maybe != 7) || currentRoomNumber != 5) {
 		_frameBottom = 240;
 	} else {
 		_frameBottom = 208;
@@ -1173,14 +1174,14 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 	if (currentRoomNumber != 0x22 && currentRoomNumber != 0x13 &&
 		  currentRoomNumber != 0x14 && currentRoomNumber != 0x15 && currentRoomNumber != 0x16 &&
 		 _objectVar[141] != 9 && (currentRoomNumber != 0x35 || _objectVar[45] != 2)) {
-		if (((_otherNspAnimationType_maybe == 60) || (_otherNspAnimationType_maybe == 61)) &&
-			_isPlayingAnimation_maybe) {
+		if (((_animation->_otherNspAnimationType_maybe == 60) || (_animation->_otherNspAnimationType_maybe == 61)) &&
+			_animation->_isPlayingAnimation_maybe) {
 			const Sprite &sprite = _room->_locationSprites.getSpriteAt(_player->_frameIdx);
 			_sprites.addSpriteToDrawList(431, 66, &sprite, 255, sprite._width, sprite._height, false);
 		}
 		if (_objectVar[OBJ_21_HEADBAND] == 0 || (_headAcheMessageCounter & 1) != 0) {
-			if (!_isPlayingAnimation_maybe || _otherNspAnimationType_maybe == 19
-				|| _otherNspAnimationType_maybe == 23) {
+			if (!_animation->_isPlayingAnimation_maybe || _animation->_otherNspAnimationType_maybe == 19
+				|| _animation->_otherNspAnimationType_maybe == 23) {
 				const Sprite &playerSprite = _player->getSprite(_player->_frameIdx);
 				_room->calculateScaledSpriteDimensions(playerSprite._width, playerSprite._height, _player->_position.y);
 				if ((currentRoomNumber != 53) || (_objectVar[79] != 2)) {
@@ -1193,7 +1194,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						_scaledSpriteHeight, _player_sprite_related_2c85_82f3);
 				}
 			} else {
-				if (_otherNspAnimationType_maybe == 37) {
+				if (_animation->_otherNspAnimationType_maybe == 37) {
 					const Sprite &playerSprite = _player->getSprite(26);
 					_room->calculateScaledSpriteDimensions(playerSprite._width, playerSprite._height, _player->_position.y);
 					_sprites.addSpriteToDrawList(
@@ -1204,8 +1205,8 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						_scaledSpriteWidth,
 						_scaledSpriteHeight, _player_sprite_related_2c85_82f3);
 				}
-				if (_otherNspAnimationType_maybe == 39 || _otherNspAnimationType_maybe == 59 ||
-					_otherNspAnimationType_maybe == 60 || _otherNspAnimationType_maybe == 61) {
+				if (_animation->_otherNspAnimationType_maybe == 39 || _animation->_otherNspAnimationType_maybe == 59 ||
+					_animation->_otherNspAnimationType_maybe == 60 || _animation->_otherNspAnimationType_maybe == 61) {
 					const Sprite &playerSprite = _player->getSprite(26);
 					_room->calculateScaledSpriteDimensions(playerSprite._width, playerSprite._height, _player->_position.y);
 					_sprites.addSpriteToDrawList(
@@ -1215,7 +1216,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						240 - _player->_position.y,
 						_scaledSpriteWidth,
 						_scaledSpriteHeight, _player_sprite_related_2c85_82f3);
-					if (_otherNspAnimationType_maybe == 60 || _otherNspAnimationType_maybe == 61) {
+					if (_animation->_otherNspAnimationType_maybe == 60 || _animation->_otherNspAnimationType_maybe == 61) {
 						_sprite_y_scaling_threshold_maybe = 240;
 //						DrawObjectsMenu(); TODO do we need this logic?
 //						UpdateAllVideo();
@@ -1225,7 +1226,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 				}
 //				iVar9 = *(int *)((int)otherNspWidthTbl + _player->_frameIdx * 2);
 //				iVar8 = *(int *)((int)&otherNspHeightTbl + _player->_frameIdx * 2);
-				if (_otherNspAnimationType_maybe == 18) {
+				if (_animation->_otherNspAnimationType_maybe == 18) {
 					if (_objectVar[22] == 0) {
 						_sprite_y_scaling_threshold_maybe = 0xcb;
 					} else if (_objectVar[22] == 1) {
@@ -1241,10 +1242,10 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 					_room->calculateScaledSpriteDimensions(
 						_player->_animations.getSpriteAt(_player->_frameIdx)._width,
 						_player->_animations.getSpriteAt(_player->_frameIdx)._height,
-						_nsp_sprite_scaling_y_position != 0 ? _nsp_sprite_scaling_y_position : _player->_position.y);
+						_animation->_nsp_sprite_scaling_y_position != 0 ? _animation->_nsp_sprite_scaling_y_position : _player->_position.y);
 				}
 
-				if (_otherNspAnimationType_maybe == 3) { // fall unconscious outside.
+				if (_animation->_otherNspAnimationType_maybe == 3) { // fall unconscious outside.
 					int curScaledWidth = g_engine->_scaledSpriteWidth;
 					int curScaledHeight = g_engine->_scaledSpriteHeight;
 					_room->calculateScaledSpriteDimensions(
@@ -1252,11 +1253,11 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						_player->_animations.getSpriteAt(_player->_frameIdx + 1)._height, _player->_position.y);
 					const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 					_sprites.addSpriteToDrawList(_player->_position.x - (curScaledWidth + g_engine->_scaledSpriteWidth) / 2, _player->_position.y - curScaledHeight, &animSprite, 240 - _player->_position.y, curScaledWidth, curScaledHeight, false);
-				} else if (!_scaleSequence) {
-					if (_otherNspAnimationType_maybe == 17) { // open trunk
+				} else if (!_animation->_scaleSequence) {
+					if (_animation->_otherNspAnimationType_maybe == 17) { // open trunk
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(_player->_position.x - animSprite._width / 2, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
-					} else if (_otherNspAnimationType_maybe == 5 || _otherNspAnimationType_maybe == 1) {
+					} else if (_animation->_otherNspAnimationType_maybe == 5 || _animation->_otherNspAnimationType_maybe == 1) {
 						int x = 0xa6;
 						int y = 0x69;
 						if (_player->_frameIdx < 4) {
@@ -1273,47 +1274,47 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						/* bed wake sequence is played here. */
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(x, y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
-					} else if (_otherNspAnimationType_maybe == 43 || _otherNspAnimationType_maybe == 44) {
+					} else if (_animation->_otherNspAnimationType_maybe == 43 || _animation->_otherNspAnimationType_maybe == 44) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(303, 105, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
-					} else if (_otherNspAnimationType_maybe == 62) { // sargent approaches jail cell.
+					} else if (_animation->_otherNspAnimationType_maybe == 62) { // sargent approaches jail cell.
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(_player->_position.x - animSprite._width / 2, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
-					} else if (_otherNspAnimationType_maybe == 45 || _otherNspAnimationType_maybe == 46) { // pull lever
+					} else if (_animation->_otherNspAnimationType_maybe == 45 || _animation->_otherNspAnimationType_maybe == 46) { // pull lever
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(446, 124, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
-					} else if (_otherNspAnimationType_maybe == 36) {
+					} else if (_animation->_otherNspAnimationType_maybe == 36) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(339, 78, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
-					} else if (_otherNspAnimationType_maybe == 59) {
+					} else if (_animation->_otherNspAnimationType_maybe == 59) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(433, 91, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
-					} else if (_otherNspAnimationType_maybe == 37) {
+					} else if (_animation->_otherNspAnimationType_maybe == 37) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(428, 78, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
-					} else if (_otherNspAnimationType_maybe == 10 || _otherNspAnimationType_maybe == 11) {
+					} else if (_animation->_otherNspAnimationType_maybe == 10 || _animation->_otherNspAnimationType_maybe == 11) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(118, 62, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, false);
-					} else if (_otherNspAnimationType_maybe == 12 || _otherNspAnimationType_maybe == 13) {
+					} else if (_animation->_otherNspAnimationType_maybe == 12 || _animation->_otherNspAnimationType_maybe == 13) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList(407, 73, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, false);
-					} else if (_otherNspAnimationType_maybe == 20) {
+					} else if (_animation->_otherNspAnimationType_maybe == 20) {
 						const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 						_sprites.addSpriteToDrawList((_player->_position.x - animSprite._width / 2) - 4, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
-					} else if (_otherNspAnimationType_maybe < 30 || _otherNspAnimationType_maybe > 34) {
-						if (_otherNspAnimationType_maybe == 40) {
+					} else if (_animation->_otherNspAnimationType_maybe < 30 || _animation->_otherNspAnimationType_maybe > 34) {
+						if (_animation->_otherNspAnimationType_maybe == 40) {
 							const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 							_sprites.addSpriteToDrawList(373, 99, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
 							const Sprite &legsSprite = _player->_animations.getSpriteAt(12);
 							_sprites.addSpriteToDrawList(373, 99 + animSprite._height, &legsSprite, 240 - _player->_position.y, legsSprite._width, legsSprite._height, _player_sprite_related_2c85_82f3);
-						} else if (_otherNspAnimationType_maybe < 48 || _otherNspAnimationType_maybe > 52) {
-							if (_otherNspAnimationType_maybe == 35) {
+						} else if (_animation->_otherNspAnimationType_maybe < 48 || _animation->_otherNspAnimationType_maybe > 52) {
+							if (_animation->_otherNspAnimationType_maybe == 35) {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 								_sprites.addSpriteToDrawList(_player->_position.x - 10, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
-							} else if (_otherNspAnimationType_maybe >= 53 && _otherNspAnimationType_maybe <= 56) {
+							} else if (_animation->_otherNspAnimationType_maybe >= 53 && _animation->_otherNspAnimationType_maybe <= 56) {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 								_sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
-							} else if (_otherNspAnimationType_maybe == 57 || _otherNspAnimationType_maybe == 58) {
+							} else if (_animation->_otherNspAnimationType_maybe == 57 || _animation->_otherNspAnimationType_maybe == 58) {
 								const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
 								Common::Point spritePos = {344, 57};
 								if (_room->_roomNumber == 41) {
@@ -1336,7 +1337,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						_sprites.addSpriteToDrawList(451, 160, &legsSprite, 240 - _player->_position.y, legsSprite._width, legsSprite._height, _player_sprite_related_2c85_82f3);
 
 					}
-				} else if (_otherNspAnimationType_maybe == 6) {
+				} else if (_animation->_otherNspAnimationType_maybe == 6) {
 					// stairs up
 					_sprites.addSpriteToDrawList(
 						_player->_position.x - _scaledSpriteWidth / 2,
@@ -1346,7 +1347,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						_scaledSpriteWidth,
 						_scaledSpriteHeight,
 						_player_sprite_related_2c85_82f3);
-				} else if (_otherNspAnimationType_maybe == 22) { // dig grave
+				} else if (_animation->_otherNspAnimationType_maybe == 22) { // dig grave
 					_sprites.addSpriteToDrawList(
 						_player->_position.x - ((_scaledWalkSpeed_maybe * 30) / 1000),
 						_player->_position.y - _scaledSpriteHeight,
@@ -1355,7 +1356,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						_scaledSpriteWidth,
 						_scaledSpriteHeight,
 						_player_sprite_related_2c85_82f3);
-				} else if (_otherNspAnimationType_maybe == 4 || _otherNspAnimationType_maybe == 21) { // dig grave
+				} else if (_animation->_otherNspAnimationType_maybe == 4 || _animation->_otherNspAnimationType_maybe == 21) { // dig grave
 					_sprites.addSpriteToDrawList(
 						_player->_position.x - ((_scaledWalkSpeed_maybe * 95) / 1000),
 						_player->_position.y - _scaledSpriteHeight,
@@ -1364,7 +1365,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						_scaledSpriteWidth,
 						_scaledSpriteHeight,
 						_player_sprite_related_2c85_82f3);
-				} else if (_otherNspAnimationType_maybe == 39) {
+				} else if (_animation->_otherNspAnimationType_maybe == 39) {
 					int16 spriteX = 110;
 					int16 spriteY = _player->_position.y;
 					if (_room->_roomNumber == 10) {
@@ -1384,7 +1385,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						_scaledSpriteWidth,
 						_scaledSpriteHeight,
 						_player_sprite_related_2c85_82f3);
-				} else if (_otherNspAnimationType_maybe == 47) {
+				} else if (_animation->_otherNspAnimationType_maybe == 47) {
 					const Sprite &sprite = _room->_locationSprites.getSpriteAt(_player->_frameIdx);
 					_room->calculateScaledSpriteDimensions(
 						sprite._width,
@@ -1408,7 +1409,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 						_scaledSpriteHeight,
 						_player_sprite_related_2c85_82f3);
 				}
-				if (_isPlayingAnimation_maybe && _otherNspAnimationType_maybe == 14 && _animIndexTbl[0] > 1) {
+				if (_animation->_isPlayingAnimation_maybe && _animation->_otherNspAnimationType_maybe == 14 && _animation->_animIndexTbl[0] > 1) {
 					if (_objectVar.getObjectRunningCode(140) == 0 || _room->_roomNumber != 6) {
 						if (_room->_roomNumber == 6 && _player->_isAutoWalkingToBed) {
 							const Sprite &animSprite = _player->_animations.getSpriteAt(8);
@@ -1433,818 +1434,6 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
 	}
 }
 
-void DarkseedEngine::setupOtherNspAnimation(int nspAnimIdx, int animId) {
-	assert(nspAnimIdx < 20);
-	_player->_playerIsChangingDirection = false;
-	_nsp_sprite_scaling_y_position = 0;
-	_scaleSequence = false;
-
-	_animIndexTbl[nspAnimIdx] = 0;
-	if (_player->_animations.getTotalAnim() > nspAnimIdx) {
-		_spriteAnimCountdownTimer[nspAnimIdx] = _player->_animations.getAnimAt(nspAnimIdx)._frameDuration[0];
-		_player->_frameIdx = _player->_animations.getAnimAt(nspAnimIdx)._frameNo[0];
-	} else {
-		_spriteAnimCountdownTimer[nspAnimIdx] = 0;
-		_player->_frameIdx = 0;
-	}
-	_isPlayingAnimation_maybe = true;
-	_otherNspAnimationType_maybe = animId;
-
-	_player_sprite_related_2c85_82f3 = 0;
-	_objRestarted = false;
-
-	if (_otherNspAnimationType_maybe < 2) {
-		return;
-	}
-
-	// TODO big switch here to init the different animation types.
-	switch (_otherNspAnimationType_maybe) {
-	case 2:
-		_player->_position.x = 188;
-		_player->_position.y = 94;
-		break;
-	case 3:
-		// TODO
-//		if ((_SoundDevice != '\x01') && ((char)_currentDay == '\x03')) {
-//			LoadModeSong(7);
-//			PlaySound(0,6,-1);
-//		}
-		_scaleSequence = 1;
-		break;
-	case 4:
-	case 14:
-	case 15:
-	case 18:
-	case 21:
-	case 22:
-	case 24:
-	case 25:
-	case 65:
-		_scaleSequence = 1;
-		break;
-	case 6 : // stairs
-		_nsp_sprite_scaling_y_position = 0xbe;
-		_scaleSequence = true;
-		break;
-	case 7 : // stairs down
-		_nsp_sprite_scaling_y_position = 0xbe;
-		_scaleSequence = true;
-		break;
-	case 8 :
-		_player->_position.x = 249;
-		_player->_position.y = 92;
-		break;
-	case 16 :
-		_player->_position.x = 324;
-		_player->_position.y = 50;
-		break;
-	case 19:
-	case 23:
-		_scaleSequence = true;
-		_player->_frameIdx = 24;
-		break;
-	case 20:
-		_spriteAnimCountdownTimer[3] = 3;
-		break;
-	case 26 :
-		_player->_position.x = 324;
-		_player->_position.y = 135;
-		break;
-	case 27 :
-		_player->_position.x = 397;
-		_player->_position.y = 84;
-		break;
-	case 28 :
-		_player->_position.x = 397;
-		_player->_position.y = 77;
-		break;
-	case 39:
-		_scaleSequence = true;
-		_player->_frameIdx = _room->_locationSprites.getAnimAt(nspAnimIdx)._frameNo[0];
-		break;
-	case 41 :
-	case 42 :
-		_player->_position.x = 432;
-		_player->_position.y = 78;
-		break;
-	case 44:
-	case 46:
-		playSound(30, 5, -1);
-		break;
-	case 47:
-		_scaleSequence = true;
-		_player->_frameIdx = _room->_locationSprites.getAnimAt(nspAnimIdx)._frameNo[0];
-		break;
-	case 53 :
-	case 54 :
-		_player->_position.x = 308;
-		_player->_position.y = 160;
-		break;
-	case 55 :
-		_player->_position.x = 150;
-		_player->_position.y = 104;
-		break;
-	case 56 :
-		_player->_position.x = 142;
-		_player->_position.y = 104;
-		break;
-	case 57:
-	case 58:
-		playSound(48, 5, -1);
-		break;
-	case 63:
-		_player->_position.x = 249;
-		_player->_position.y = 92;
-		_phoneStatus = 1;
-		break;
-	default:
-		break;
-	}
-}
-
-void DarkseedEngine::updateAnimation() {
-	int currentRoomNumber = _room->_roomNumber;
-	switch (_otherNspAnimationType_maybe) {
-	case 0:
-		break;
-	case 1 : // sleep wake anim
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
-		} else {
-			_player->_position.x = 0xdf;
-			_player->_position.y = 0xbe;
-			_player->_walkTarget.x = 0xdf;
-			_player->_walkTarget.y = 0xbe;
-			_player->updateSprite();
-		}
-		break;
-	case 2:
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
-		} else {
-			_player->_position.x = 218;
-			_player->_position.y = 198;
-			_player->_direction = 2;
-			_player->updateSprite();
-			_player->_walkTarget.x = 218;
-			_player->_walkTarget.y = 198;
-			_objectVar[52] = 0;
-//			StopVOC(); TODO
-		}
-		break;
-	case 3:
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
-		} else {
-			if (_room->isGiger()) {
-				stuffPlayer();
-			} else {
-				if (_room->isOutside() && _currentTimeInSeconds > 61200) {
-					_room->restorePalette();
-				}
-				gotonextmorning();
-				playDayChangeCutscene();
-			}
-		}
-		break;
-	case 4:
-	case 21:
-	case 22: // dig up grave
-		advanceAnimationFrame(0);
-		if (_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]] % 5 == 3 &&
-			_player->_animations.getAnimAt(0)._frameDuration[_animIndexTbl[0]] == _spriteAnimCountdownTimer[0]) {
-			playSound(14, 5, -1);
-		}
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
-		} else {
-			_isPlayingAnimation_maybe = false;
-			_objectVar[52] = 1;
-			if (_otherNspAnimationType_maybe == 21 && _objectVar[151] != 0) {
-				if (_objectVar[87] == 0) {
-					_objectVar[88] = 1;
-					_objectVar[87] = 1;
-					_console->printTosText(581);
-					_inventory.addItem(29);
-				} else {
-					_console->printTosText(582);
-				}
-			} else {
-				_objectVar[88] = 1;
-				_console->printTosText(580);
-			}
-		}
-		break;
-	case 5: // goto sleep animation
-		_player->_position.x = 135;
-		_player->_position.y = 91;
-		advanceAnimationFrame(1);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]];
-		} else {
-			gotonextmorning(); // TODO there might be some extra logic required from original function
-			_player->_position.x = 242;
-			_player->_position.y = 187;
-			playDayChangeCutscene();
-		}
-		_player->_position.x = 242;
-		_player->_position.y = 187;
-		break;
-	case 6: // stairs up
-		if (currentRoomNumber == 6) {
-			advanceAnimationFrame(1);
-		} else {
-			advanceAnimationFrame(2);
-		}
-		if (_frameAdvanced && ((currentRoomNumber == 6 && _animIndexTbl[1] == 1) || (currentRoomNumber == 5 && _animIndexTbl[2] == 1))) {
-//			FUN_1208_0dac_sound_related(0xd,CONCAT11(uVar4,5));
-		}
-		if (!_objRestarted) {
-			if (currentRoomNumber == 6) {
-				_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]];
-			} else {
-				_player->_frameIdx = _player->_animations.getAnimAt(2)._frameNo[_player->_animations.getAnimAt(2)._frameNo[_animIndexTbl[2]]];
-			}
-		} else {
-			if (currentRoomNumber == 6) {
-				_previousRoomNumber = 6;
-				changeToRoom(5);
-			}
-			if (_player->_isAutoWalkingToBed) {
-				_player->setplayertowardsbedroom();
-			}
-		}
-		break;
-	case 7: // stairs down
-		if (currentRoomNumber == 5) {
-			advanceAnimationFrame(3);
-			if (_frameAdvanced && _animIndexTbl[3] == 1) {
-				// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
-			}
-			if (!_objRestarted) {
-				_player->_frameIdx = _player->_animations.getAnimAt(3)._frameNo[_player->_animations.getAnimAt(3)._frameNo[_animIndexTbl[3]]];
-			} else {
-				_previousRoomNumber = 5;
-				changeToRoom(6);
-			}
-		} else {
-			advanceAnimationFrame(0);
-			if (_frameAdvanced && _animIndexTbl[0] == 1) {
-				// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
-			}
-			if (!_objRestarted) {
-				_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
-			}
-		}
-		break;
-	case 8: //phone call
-	case 63:
-		if (_otherNspAnimationType_maybe == 8) {
-			advanceAnimationFrame(0);
-		} else {
-			advanceAnimationFrame(2);
-			if (_phoneStatus == 1) {
-				_phoneStatus = 2;
-			}
-		}
-		if (!_objRestarted) {
-			if (_otherNspAnimationType_maybe == 8) {
-				_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
-			} else {
-				_player->_frameIdx = _player->_animations.getAnimAt(2)._frameNo[_player->_animations.getAnimAt(2)._frameNo[_animIndexTbl[2]]];
-			}
-		} else {
-			if (_otherNspAnimationType_maybe == 63) {
-				_console->printTosText(44);
-				setupOtherNspAnimation(1, 64);
-			} else {
-				_objectVar.setObjectRunningCode(47, 0);
-				if (_currentDay == 1) {
-					_console->printTosText(904);
-					_objectVar[47] = 1;
-					_objectVar[46] = 1;
-				} else {
-					_objectVar[51] = 2;
-					_objectVar[47] = 1;
-					_console->printTosText(922);
-				}
-				_sound->waitForSpeech();
-				setupOtherNspAnimation(1, 9);
-			}
-		}
-		break;
-	case 9: // hang up phone
-	case 64:
-		advanceAnimationFrame(1);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]];
-		} else {
-			_player->_position.x = 300;
-			_player->_position.y = 183;
-			_player->_walkTarget.x = 300;
-			_player->_walkTarget.y = 183;
-			_player->_direction = 3;
-			_player->updateSprite();
-		}
-		break;
-	case 11:
-		advanceAnimationFrame(1);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
-		} else {
-			_player->_position.x = 175;
-			_player->_position.y = 200;
-			_player->_walkTarget.x = 175;
-			_player->_walkTarget.y = 200;
-			_player->updateSprite();
-			if (_player->_isAutoWalkingToBed) {
-				_player->setplayertowardsbedroom();
-			}
-		}
-		break;
-	case 12:
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
-		} else {
-			_player->_position.x = 360;
-			_player->_position.y = 238;
-			_player->_walkTarget.x = 360;
-			_player->_walkTarget.y = 238;
-			_player->_direction = 3;
-			changeToRoom(2);
-		}
-		break;
-	case 13:
-		advanceAnimationFrame(1);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
-		} else {
-			_player->_position.x = 450;
-			_player->_position.y = 217;
-			_player->_walkTarget.x = 450;
-			_player->_walkTarget.y = 217;
-			_player->_direction = 3;
-			_player->updateSprite();
-		}
-		break;
-	case 16: // climb down rope
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
-		} else {
-			_player->_position.x = 336;
-			_player->_position.y = 195;
-			_player->_walkTarget.x = 336;
-			_player->_walkTarget.y = 195;
-			_player->_direction = 1;
-			_player->updateSprite();
-		}
-		break;
-	case 17: // open trunk with crowbar
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
-		}
-		if (_animIndexTbl[0] == 5 && _frameAdvanced) {
-			playSound(31, 5, -1);
-			_console->printTosText(666);
-			if (_objectVar[42] == 0) {
-				_objectVar[42] = 1;
-			} else {
-				_objectVar[42] = 3;
-			}
-		}
-		break;
-	case 18: // push trunk
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
-		}
-		if (_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]] == 3 && _frameAdvanced) {
-			_console->printTosText(_objectVar[22] + 662);
-			_objectVar[22] = _objectVar[22] + 1;
-			if (_objectVar[22] == 3) {
-				_room->loadRoom61AWalkableLocations();
-			}
-		}
-		break;
-	case 19: // pickup book from library
-		_player->_frameIdx = 24;
-		if (_objRestarted) {
-			_isPlayingAnimation_maybe = true;
-			_objectVar[46] = 2;
-			libanim(true);
-		}
-		break;
-	case 20: // receive card from delbert
-		advanceAnimationFrame(3);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(3)._frameNo[_animIndexTbl[3]];
-		} else {
-			_inventory.addItem(18);
-		}
-		break;
-	case 23:
-		_player->_frameIdx = 24;
-		if (_objRestarted != 0) {
-			_isPlayingAnimation_maybe = false;
-			_objectVar[99] = 1;
-			_console->printTosText(468);
-		}
-		break;
-	case 10:
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
-		} else {
-			_previousRoomNumber = _room->_roomNumber;
-			changeToRoom(61);
-		}
-		break;
-	case 14:
-	case 15:
-	case 24:
-	case 25:
-		// Open doors
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
-		} else {
-			_player->updateSprite();
-			if (_otherNspAnimationType_maybe == 14) {
-				// TODO
-				if (_objectVar.getObjectRunningCode(140) == 0 || _room->_roomNumber != 6) {
-					_previousRoomNumber = _room->_roomNumber;
-					int newRoomNumber = _previousRoomNumber;
-					if (_room->_roomNumber == 6) {
-						if (_player->_isAutoWalkingToBed && _objectVar[137] == 2) {
-							wongame();
-						}
-						newRoomNumber = 10;
-					} else if (_room->_roomNumber == 10) {
-						newRoomNumber = 6;
-					} else if (_room->_roomNumber == 11) {
-						if (_player->_position.x < 250) {
-							newRoomNumber = 15;
-						} else {
-							newRoomNumber = 16;
-						}
-					} else {
-						newRoomNumber = 17;
-					}
-					changeToRoom(newRoomNumber);
-				} else {
-					_objectVar.setObjectRunningCode(140, 0);
-					getPackageObj(_currentDay);
-				}
-			}
-			if (_otherNspAnimationType_maybe == 25) {
-				_previousRoomNumber = 33;
-				changeToRoom(34);
-			}
-		}
-		break;
-	case 26: // climb up rope.
-		advanceAnimationFrame(1);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
-		} else {
-			_previousRoomNumber = _room->_roomNumber;
-			changeToRoom(13);
-		}
-		break;
-	case 27:
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]]; // TODO check if this is correct.
-		} else {
-			_previousRoomNumber = _room->_roomNumber;
-			changeToRoom(38);
-		}
-		break;
-	case 28: // step out of mirror normal world
-		advanceAnimationFrame(1);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
-		} else {
-			_player->_position.x = 418;
-			_player->_position.y = 170;
-			_player->_direction = 3;
-			_player->updateSprite();
-			_player->_walkTarget = _player->_position;
-		}
-		break;
-	case 30:
-	case 31: {
-		int animIdx = _otherNspAnimationType_maybe - 30;
-		advanceAnimationFrame(animIdx);
-		if (_isPlayingAnimation_maybe) {
-			_player->_frameIdx = _player->_animations.getAnimAt(animIdx)._frameNo[_animIndexTbl[animIdx]];
-		}
-		if (_objRestarted && _otherNspAnimationType_maybe == 30) {
-			setupOtherNspAnimation(1, 31);
-		}
-		break;
-	}
-	case 32:
-	case 33:
-	case 34: {
-		_objectVar[112] = 1;
-		int animIdx = _otherNspAnimationType_maybe - 30;
-		advanceAnimationFrame(animIdx);
-		// TODO play sfx.
-		if (_isPlayingAnimation_maybe) {
-			_player->_frameIdx = _player->_animations.getAnimAt(animIdx)._frameNo[_animIndexTbl[animIdx]];
-		}
-		if (_objRestarted && (_otherNspAnimationType_maybe == 32 || _otherNspAnimationType_maybe == 33)) {
-			setupOtherNspAnimation(_otherNspAnimationType_maybe - 29, _otherNspAnimationType_maybe + 1);
-		}
-		break;
-	}
-	case 35: // pay shopkeeper
-		advanceAnimationFrame(6);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(6)._frameNo[_animIndexTbl[6]];
-		} else {
-			_objectVar[8]++;
-			if (_objectVar[8] > 2) {
-				_inventory.removeItem(8);
-			}
-			_objectVar[138]++;
-			_console->printTosText(927);
-		}
-		break;
-	case 36:
-	case 37: // smash mirror
-		advanceAnimationFrame(_otherNspAnimationType_maybe - 36);
-		_player->_frameIdx = _player->_animations.getAnimAt(_otherNspAnimationType_maybe - 36)._frameNo[_animIndexTbl[_otherNspAnimationType_maybe - 36]];
-		if (_frameAdvanced && _otherNspAnimationType_maybe == 36 && _player->_frameIdx == 4) {
-			playSound(28, 5, -1);
-		}
-		if (_objRestarted) {
-			if (_otherNspAnimationType_maybe == 36) {
-				setupOtherNspAnimation(1, 37);
-			} else {
-				_objectVar[137] = 2;
-				_player->_isAutoWalkingToBed = true;
-				_player->setplayertowardsbedroom();
-			}
-		}
-		break;
-	case 38:
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
-		} else {
-			stuffPlayer();
-		}
-		break;
-	case 39: // Arrest Mike.
-		_room->advanceFrame(1);
-		if (!_objRestarted) {
-			_player->_frameIdx = _room->_locationSprites.getAnimAt(1)._frameNo[_room->_locObjFrame[1]];
-		} else {
-			throwmikeinjail();
-		}
-		break;
-	case 40: // give Delbert's card to cop.
-		advanceAnimationFrame(1);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
-		} else {
-			_console->printTosText(61);
-			_console->draw();
-			_screen->updateScreen();
-			waitxticks(60);
-			_previousRoomNumber = _room->_roomNumber;
-			_player->_position.x = 240;
-			_player->_position.y = 200;
-			_player->updateSprite();
-			_isPlayingAnimation_maybe = false;
-			changeToRoom(15, true);
-			_inventory.removeItem(41);
-			_inventory.removeItem(18);
-			_objectVar.setMoveObjectRoom(41, 255);
-		}
-		break;
-	case 41:
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
-		} else {
-			_previousRoomNumber = _room->_roomNumber;
-			changeToRoom(7);
-		}
-		break;
-	case 42: // step out of mirror giger world
-		advanceAnimationFrame(1);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]];
-		} else {
-			_player->_position.x = 456;
-			_player->_position.y = 173;
-			_player->_direction = 3;
-			_player->updateSprite();
-			_player->_walkTarget = _player->_position;
-		}
-		break;
-	case 43:
-	case 44:
-	case 45:
-	case 46: {
-		int iVar4 = 0;
-		if ((_otherNspAnimationType_maybe == 44) || (_otherNspAnimationType_maybe == 46)) {
-			iVar4 = 1;
-		}
-		advanceAnimationFrame(iVar4);
-		_player->_frameIdx = _player->_animations.getAnimAt(iVar4)._frameNo[_player->_animations.getAnimAt(iVar4)._frameNo[_animIndexTbl[iVar4]]];
-//		_HeroSpr = (uint) * (byte *)((int)&DAT_1060_7eb8 + *(int *)((int)&_ObjFrame + iVar4 * 2) + iVar4 * 202);
-		if (!_objRestarted || (_otherNspAnimationType_maybe != 46 && _otherNspAnimationType_maybe != 44)) {
-			if (_otherNspAnimationType_maybe == 45) {
-				_objectVar[117] = 1;
-			} else if (_objRestarted) {
-				if ((_objectVar[71] == 2) && (_objectVar[44] != 0)) {
-					_console->printTosText(896);
-					_objectVar[57] = 1;
-				} else {
-					_console->printTosText(897);
-				}
-			}
-		} else {
-//			LoadModeSong(7); TODO
-			playSound(0, 6, -1);
-			stuffPlayer();
-		}
-		break;
-	}
-	case 47:
-		_room->mikeStickThrowAnim();
-		break;
-	case 48:
-	case 49:
-	case 50:
-	case 51:
-	case 52:
-		// open/close cupboards, oven
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
-		} else {
-			if (_otherNspAnimationType_maybe == 52) {
-				_objectVar[108] = (_objectVar[108] == 0) ? 1 : 0;
-			} else {
-				_objectVar[56 + _otherNspAnimationType_maybe] = _objectVar[56 + _otherNspAnimationType_maybe] == 0 ? 1 : 0;
-			}
-			playSound(42, 5, -1);
-		}
-		break;
-	case 53 :
-	case 54 :
-	case 55 :
-	case 56 :
-		advanceAnimationFrame((_otherNspAnimationType_maybe - 53) & 1);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
-		} else {
-			switch (_otherNspAnimationType_maybe) {
-			case 53 :
-				_previousRoomNumber = _room->_roomNumber;
-				changeToRoom(6);
-				break;
-			case 54 :
-				_player->_position.x = 322;
-				_player->_position.y = 220;
-				_player->_walkTarget = _player->_position;
-				_player->_direction = 2;
-				_player->updateSprite();
-				break;
-			case 55 :
-				_previousRoomNumber = _room->_roomNumber;
-				changeToRoom(15);
-				break;
-			case 56 :
-				_player->_position.x = 162;
-				_player->_position.y = 206;
-				_player->_walkTarget = _player->_position;
-				_player->_direction = 2;
-				_player->updateSprite();
-				break;
-			}
-		}
-		if (_frameAdvanced && _animIndexTbl[0] == 1) {
-			// FUN_1208_0dac_sound_related(0xd,CONCAT11(extraout_AH_05,5));
-			// PlaySound(1,5,-1);
-		}
-		break;
-	case 57:
-	case 58:
-		advanceAnimationFrame((_otherNspAnimationType_maybe - 57) & 1);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]; //_player->_animations.getAnimAt(0).frameNo[animIndexTbl[0]]];
-		} else if (_otherNspAnimationType_maybe == 57) {
-			_previousRoomNumber = _room->_roomNumber;
-			changeToRoom(_room->_roomNumber == 41 ? 44 : 41);
-		} else {
-			_player->_direction = 2;
-		}
-		break;
-	case 59: // use shard on mirror
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
-		} else {
-			_player->_direction = 1;
-			_player->updateSprite();
-		}
-		if (_frameAdvanced && _player->_frameIdx == 3) {
-			playSound(26, 5, -1);
-		}
-		break;
-	case 60: // turn on alien computer
-		_room->advanceFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _room->_locationSprites.getAnimAt(0)._frameNo[_room->_locObjFrame[0]];
-		} else {
-			_isPlayingAnimation_maybe = false;
-			_objectVar[187] = 1;
-		}
-		break;
-	case 61: // turn off alien computer
-		_room->advanceFrame(1);
-		if (!_objRestarted) {
-			_player->_frameIdx = _room->_locationSprites.getAnimAt(1)._frameNo[_room->_locObjFrame[1]];
-		} else {
-			_isPlayingAnimation_maybe = false;
-		}
-		_objectVar[187] = 0;
-		break;
-	case 62: // bang cup against bars
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
-		} else {
-			bool bVar5 = _objectVar.getMoveObjectRoom(18) == 250;
-			if (!bVar5) {
-				if (_inventory.hasObject(18)) {
-					bVar5 = true;
-				}
-			}
-			if (bVar5) {
-				_isPlayingAnimation_maybe = false;
-				_objectVar.setObjectRunningCode(53, 1);
-				_player->loadAnimations("copcard.nsp");
-				_animIndexTbl[0] = 0;
-				_spriteAnimCountdownTimer[0] = 3;
-				_objectVar[1] = 2000;
-			} else {
-				_console->addTextLine("The cops ignore your demands for attention.");
-			}
-		}
-		break;
-	case 65:
-		advanceAnimationFrame(0);
-		if (!_objRestarted) {
-			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
-		} else {
-			_player->updateSprite();
-		}
-		break;
-	default:
-		error("Unhandled animation type! %d", _otherNspAnimationType_maybe);
-	}
-}
-
-void DarkseedEngine::advanceAnimationFrame(int nspAminIdx) {
-	if (!_scaleSequence) {
-		_scaledWalkSpeed_maybe = 1000;
-	} else {
-		_room->calculateScaledSpriteDimensions(10, 10, _player->_position.y);
-	}
-	_objRestarted = false;
-	_frameAdvanced = false;
-	const Obt &anim = _player->_animations.getAnimAt(nspAminIdx);
-	_spriteAnimCountdownTimer[nspAminIdx] = _spriteAnimCountdownTimer[nspAminIdx] - 1;
-	if (_spriteAnimCountdownTimer[nspAminIdx] < 1) {
-		_frameAdvanced = true;
-		_animIndexTbl[nspAminIdx] = _animIndexTbl[nspAminIdx] + 1;
-		_player->_position.x += ((int16)anim._deltaX[_animIndexTbl[nspAminIdx]] * _scaledWalkSpeed_maybe) / 1000;
-		_player->_position.y += ((int16)anim._deltaY[_animIndexTbl[nspAminIdx]] * _scaledWalkSpeed_maybe) / 1000;
-		if (_animIndexTbl[nspAminIdx] == anim._numFrames) {
-			_animIndexTbl[nspAminIdx] = 0;
-			_objRestarted = true;
-			_isPlayingAnimation_maybe = false;
-			_player->_walkTarget.x = _player->_position.x;
-			_player->_walkTarget.y = _player->_position.y;
-			_player->updateSprite();
-		}
-		_spriteAnimCountdownTimer[nspAminIdx] = anim._frameDuration[_animIndexTbl[nspAminIdx]];
-	}
-}
-
 Common::Path DarkseedEngine::getRoomFilePath(const Common::Path &filename) {
 	if (isCdVersion()) {
 		return Common::Path("room").join(filename);
@@ -2381,12 +1570,12 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 		}
 	} else {
 		_player->loadAnimations("pownex.nsp");
-		_animIndexTbl[0] = 0;
-		_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
-		_objRestarted = false;
+		_animation->_animIndexTbl[0] = 0;
+		_animation->_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
+		_animation->_objRestarted = false;
 		int16 frameIdx = 0;
 		int16 prevFrameIdx = 0;
-		while (!_objRestarted) {
+		while (!_animation->_objRestarted) {
 			prevFrameIdx = frameIdx;
 			for (int i = 0; i < 6; i++) {
 				wait();
@@ -2396,8 +1585,8 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			_frame.draw();
 			_console->draw();
 
-			advanceAnimationFrame(0);
-			frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
+			_animation->advanceAnimationFrame(0);
+			frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animation->_animIndexTbl[0]];
 			const Sprite &sprite = _player->_animations.getSpriteAt(frameIdx);
 			_sprites.addSpriteToDrawList(152, 89, &sprite, 255, sprite._width, sprite._height, false);
 			_room->draw();
@@ -2408,8 +1597,8 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 
 		}
 
-		_objRestarted = false;
-		while (!_objRestarted) {
+		_animation->_objRestarted = false;
+		while (!_animation->_objRestarted) {
 			for (int i = 0; i < 6; i++) {
 				wait();
 			}
@@ -2417,9 +1606,9 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			_frame.draw();
 			_console->draw();
 
-			advanceAnimationFrame(1);
+			_animation->advanceAnimationFrame(1);
 
-			const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(1)._frameNo[_animIndexTbl[1]]);
+			const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(1)._frameNo[_animation->_animIndexTbl[1]]);
 			_sprites.addSpriteToDrawList(152, 129, &sprite, 255, sprite._width, sprite._height, false);
 
 			const Sprite &mikeSprite = _player->_animations.getSpriteAt(prevFrameIdx);
@@ -2743,18 +1932,18 @@ void DarkseedEngine::playSound(int16 unk, uint8 unk1, int16 unk2) {
 }
 
 void DarkseedEngine::nextFrame(int nspAminIdx) {
-	_objRestarted = false;
-	_spriteAnimCountdownTimer[nspAminIdx]--;
-	_frameAdvanced = false;
-	if (_spriteAnimCountdownTimer[nspAminIdx] < 1) {
+	_animation->_objRestarted = false;
+	_animation->_spriteAnimCountdownTimer[nspAminIdx]--;
+	_animation->_frameAdvanced = false;
+	if (_animation->_spriteAnimCountdownTimer[nspAminIdx] < 1) {
 		const Obt &anim = _player->_animations.getAnimAt(nspAminIdx);
-		_animIndexTbl[nspAminIdx]++;
-		_frameAdvanced = true;
-		if (_animIndexTbl[nspAminIdx] == anim._numFrames) {
-			_animIndexTbl[nspAminIdx] = 0;
-			_objRestarted = true;
+		_animation->_animIndexTbl[nspAminIdx]++;
+		_animation->_frameAdvanced = true;
+		if (_animation->_animIndexTbl[nspAminIdx] == anim._numFrames) {
+			_animation->_animIndexTbl[nspAminIdx] = 0;
+			_animation->_objRestarted = true;
 		}
-		_spriteAnimCountdownTimer[nspAminIdx] = anim._frameDuration[_animIndexTbl[nspAminIdx]];
+		_animation->_spriteAnimCountdownTimer[nspAminIdx] = anim._frameDuration[_animation->_animIndexTbl[nspAminIdx]];
 	}
 }
 
@@ -2825,7 +2014,7 @@ void DarkseedEngine::closeShops() {
 void DarkseedEngine::initDelbertAtSide() {
 	_objectVar[141] = 12;
 	_objectVar.setMoveObjectX(141, 563);
-	if (!_isPlayingAnimation_maybe || _otherNspAnimationType_maybe != 26) {
+	if (!_animation->_isPlayingAnimation_maybe || _animation->_otherNspAnimationType_maybe != 26) {
 		_player->_heroMoving = false;
 		_player->_walkTarget = _player->_position;
 		_player->_actionToPerform = false;
@@ -2838,7 +2027,7 @@ void DarkseedEngine::throwmikeinjail() {
 		playSound(0, 6, -1);
 	}
 	_player->_position = {250, 200};
-	_isPlayingAnimation_maybe = false;
+	_animation->_isPlayingAnimation_maybe = false;
 	_player->_frameIdx = 26;
 	changeToRoom(30);
 	_objectVar.setMoveObjectRoom(28, 255);
@@ -2904,10 +2093,10 @@ void DarkseedEngine::runObjects() {
 		// delbert drinks scotch
 		_room->advanceFrame(0);
 		delbertSpriteIdx = _room->_locationSprites.getAnimAt(0)._frameNo[_room->_locObjFrame[0]];
-		if (_frameAdvanced && delbertSpriteIdx == 5) {
+		if (_animation->_frameAdvanced && delbertSpriteIdx == 5) {
 			playSound(32, 5, -1);
 		}
-		if (_objRestarted) {
+		if (_animation->_objRestarted) {
 			_objectVar[141] = 10;
 			_console->printTosText(910);
 			_inventory.removeItem(7);
@@ -2924,7 +2113,7 @@ void DarkseedEngine::runObjects() {
 		_room->advanceFrame(1);
 		delbertSpriteIdx = _room->_locationSprites.getAnimAt(1)._frameNo[_room->_locObjFrame[1]];
 		Common::Point delbertPos = _objectVar.getMoveObjectPosition(141);
-		if (_frameAdvanced) {
+		if (_animation->_frameAdvanced) {
 			delbertPos.x += 10;
 			_objectVar.setMoveObjectPosition(141, delbertPos);
 		}
@@ -2965,7 +2154,7 @@ void DarkseedEngine::runObjects() {
 			_objectVar.setMoveObjectRoom(19, 100);
 			_room->advanceFrame(_objectVar[45] + 1);
 			Common::Point stickPosition = _objectVar.getMoveObjectPosition(19);
-			if (_objRestarted && _objectVar[45] < 2) {
+			if (_animation->_objRestarted && _objectVar[45] < 2) {
 				_objectVar[45] = (_objectVar[45] == 0) ? 1 : 0;
 				if (_objectVar[45] == 0) {
 					stickPosition = {230, 205};
@@ -2980,7 +2169,7 @@ void DarkseedEngine::runObjects() {
 			}
 			Common::Point fidoPosition = _objectVar.getMoveObjectPosition(45);
 			int16 fidoSpriteIdx = _room->_locationSprites.getAnimAt(_objectVar[45] + 1)._frameNo[_room->_locObjFrame[_objectVar[45] + 1]];
-			if (_frameAdvanced) {
+			if (_animation->_frameAdvanced) {
 				if (_objectVar[45] == 2) {
 					fidoPosition.x += 30;
 					_objectVar.setMoveObjectPosition(45, fidoPosition);
@@ -3026,11 +2215,11 @@ void DarkseedEngine::runObjects() {
 		if (_player->_position.x == 290 && _player->_position.y == 209 && !_player->_playerIsChangingDirection && _player->_direction != 3) {
 			_player->changeDirection(_player->_direction, 3);
 		}
-		_objRestarted = false;
+		_animation->_objRestarted = false;
 		if (!_sound->isPlayingSpeech() && (_objectVar[141] != 2 || _delbertspeech > 64)) {
 			nextFrame(_objectVar[141] - 1);
 		}
-		if (_objRestarted) {
+		if (_animation->_objRestarted) {
 			_objectVar[141]++;
 			if (_objectVar[141] == 2) {
 				_delbertspeech = 63;
@@ -3041,7 +2230,7 @@ void DarkseedEngine::runObjects() {
 			} else if (_objectVar[141] == 4) {
 				_player->_herowaiting = false;
 			}
-			_objRestarted = false;
+			_animation->_objRestarted = false;
 		}
 		if (!_sound->isPlayingSpeech() && _objectVar[141] == 2) {
 			if (_delbertspeech < 65) {
@@ -3051,14 +2240,14 @@ void DarkseedEngine::runObjects() {
 				_console->printTosText(908);
 				_sound->waitForSpeech();
 			} else if (_delbertspeech == 65) {
-				setupOtherNspAnimation(3, 20);
-				_spriteAnimCountdownTimer[1] = 3;
+				_animation->setupOtherNspAnimation(3, 20);
+				_animation->_spriteAnimCountdownTimer[1] = 3;
 				_delbertspeech = 72;
 			}
 		}
-		const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(_objectVar[141] - 1)._frameNo[_animIndexTbl[_objectVar[141] - 1]]);
+		const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(_objectVar[141] - 1)._frameNo[_animation->_animIndexTbl[_objectVar[141] - 1]]);
 		Common::Point delbertPosition = _objectVar.getMoveObjectPosition(141);
-		if (_frameAdvanced) {
+		if (_animation->_frameAdvanced) {
 			if (_objectVar[141] == 1) {
 				delbertPosition.x += 15;
 				delbertPosition.y -= 1;
@@ -3080,7 +2269,7 @@ void DarkseedEngine::runObjects() {
 	if (_room->_roomNumber == 32 && _currentDay == 2 && _currentTimeInSeconds > 64799 && (_objectVar[141] == 5 || _objectVar[141] == 6)) {
 		// walk delbert off into garden.
 		_room->advanceFrame(_objectVar[141] - 4);
-		if (_objRestarted) {
+		if (_animation->_objRestarted) {
 			_objectVar[141]++;
 			if (_objectVar[141] == 7) {
 				_player->_herowaiting = false;
@@ -3088,7 +2277,7 @@ void DarkseedEngine::runObjects() {
 		}
 		Common::Point delbertPosition = _objectVar.getMoveObjectPosition(141);
 		const Sprite &sprite = _room->_locationSprites.getSpriteAt(_room->_locationSprites.getAnimAt(_objectVar[141] - 4)._frameNo[_room->_locObjFrame[_objectVar[141] - 4]]);
-		if (_frameAdvanced && _objectVar[141] > 5) {
+		if (_animation->_frameAdvanced && _objectVar[141] > 5) {
 			delbertPosition.x += 8;
 			_objectVar.setMoveObjectX(141, delbertPosition.x);
 		}
@@ -3129,41 +2318,41 @@ void DarkseedEngine::runObjects() {
 	}
 	// jail sargent
 	if (_room->_roomNumber == 30 && (_objectVar.getObjectRunningCode(53) == 1 || _objectVar.getObjectRunningCode(53) == 2)
-			  && (_otherNspAnimationType_maybe != 40 || !_isPlayingAnimation_maybe)) {
+			  && (_animation->_otherNspAnimationType_maybe != 40 || !_animation->_isPlayingAnimation_maybe)) {
 		if (_objectVar.getObjectRunningCode(53) == 1) {
-			int oldFrame = _animIndexTbl[0];
+			int oldFrame = _animation->_animIndexTbl[0];
 			nextFrame(0);
-			if (_objRestarted) {
+			if (_animation->_objRestarted) {
 				_objectVar.setObjectRunningCode(53, 2);
-				_animIndexTbl[0] = oldFrame;
+				_animation->_animIndexTbl[0] = oldFrame;
 			}
 		}
 		_room->removeObjectFromRoom(189);
-		const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]);
+		const Sprite &sprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0)._frameNo[_animation->_animIndexTbl[0]]);
 		g_engine->_sprites.addSpriteToDrawList(463, 99, &sprite, 255, sprite._width, sprite._height, false);
 		_room->updateRoomObj(64, 467, 200, 99, 200);
 	}
-	if ((((!_isPlayingAnimation_maybe || _otherNspAnimationType_maybe != 39) && _room->_roomNumber == 10) &&
+	if ((((!_animation->_isPlayingAnimation_maybe || _animation->_otherNspAnimationType_maybe != 39) && _room->_roomNumber == 10) &&
 		 _objectVar.getObjectRunningCode(72) != 0) &&
 		((_currentDay == 3 && _currentTimeInSeconds > 39600 && _objectVar[57] == 0) ||
 		  _objectVar[88] != 0)) {
 		if (_player->_position.x == 322 && _player->_position.y == 226) {
-			setupOtherNspAnimation(1, 39); // arrest mike.
+			_animation->setupOtherNspAnimation(1, 39); // arrest mike.
 		} else {
 			const Sprite &sprite = _room->_locationSprites.getSpriteAt(4);
 			_room->calculateScaledSpriteDimensions(sprite._width, sprite._height, 224);
 			g_engine->_sprites.addSpriteToDrawList(348 - _scaledSpriteWidth, 224 - _scaledSpriteHeight, &sprite, 224, _scaledSpriteWidth, _scaledSpriteHeight, false);
 			if (_player->_heroMoving && _player->_playerIsChangingDirection == 0 && _player->_direction != 1 &&
 				(_player->_position.x < 368 || _player->_position.y < 200) &&
-				   (!_isPlayingAnimation_maybe || _otherNspAnimationType_maybe == 53) && _player->_walkTarget.x != 322 &&
+				   (!_animation->_isPlayingAnimation_maybe || _animation->_otherNspAnimationType_maybe == 53) && _player->_walkTarget.x != 322 &&
 				  _player->_walkTarget.y != 226) {
 				_player->_heroMoving = false;
 			}
 			if (_player->_position.x < 369 && !_player->_heroMoving &&
-				 (!_isPlayingAnimation_maybe || _otherNspAnimationType_maybe == 53) &&
+				 (!_animation->_isPlayingAnimation_maybe || _animation->_otherNspAnimationType_maybe == 53) &&
 				(_player->_position.x != 322 || _player->_position.y != 226)) {
-				if (_isPlayingAnimation_maybe && _otherNspAnimationType_maybe == 53) {
-					_isPlayingAnimation_maybe = false;
+				if (_animation->_isPlayingAnimation_maybe && _animation->_otherNspAnimationType_maybe == 53) {
+					_animation->_isPlayingAnimation_maybe = false;
 				}
 				if (!_player->_heroMoving) {
 					Common::Point oldCursor = g_engine->_cursor.getPosition();
@@ -3256,7 +2445,7 @@ void DarkseedEngine::runObjects() {
 }
 
 void DarkseedEngine::moveplayertodelbert() {
-	if (_room->_roomNumber == 32 && !_isPlayingAnimation_maybe) {
+	if (_room->_roomNumber == 32 && !_animation->_isPlayingAnimation_maybe) {
 		_player->_herowaiting = true;
 		if (!_player->_heroMoving && _player->_position.x != 364 && _player->_position.y != 198) {
 			Common::Point oldCursor = g_engine->_cursor.getPosition();
@@ -3279,7 +2468,7 @@ void DarkseedEngine::rundrekethsequence() {
 }
 
 void DarkseedEngine::delthrowstick(int16 spriteNum) {
-	if (_frameAdvanced && spriteNum == 8) {
+	if (_animation->_frameAdvanced && spriteNum == 8) {
 		Common::Point stickPos = {265, 150};
 		_objectVar.setMoveObjectPosition(19, stickPos);
 		_yvec = -6;
@@ -3338,7 +2527,7 @@ void DarkseedEngine::libanim(bool pickingUpReservedBook) {
 
 	_console->printTosText(pickingUpReservedBook ? 928 : 924);
 
-	_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
+	_animation->_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
 	uint8 lipsIdx = 0;
 	while (_sound->isPlayingSpeech()) {
 		_sprites.clearSpriteDrawList();
@@ -3348,10 +2537,10 @@ void DarkseedEngine::libanim(bool pickingUpReservedBook) {
 		}
 		_console->draw();
 
-		advanceAnimationFrame(0);
-		const Sprite &eyesSprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]);
+		_animation->advanceAnimationFrame(0);
+		const Sprite &eyesSprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0)._frameNo[_animation->_animIndexTbl[0]]);
 		g_engine->_sprites.addSpriteToDrawList(255, 114, &eyesSprite, 255, eyesSprite._width, eyesSprite._height, false);
-		advanceAnimationFrame(1);
+		_animation->advanceAnimationFrame(1);
 
 		const Sprite &mouthSprite = _player->_animations.getSpriteAt(libList[lipsIdx]);
 		g_engine->_sprites.addSpriteToDrawList(255, 154, &mouthSprite, 255, mouthSprite._width, mouthSprite._height, false);
@@ -3411,8 +2600,8 @@ static constexpr uint8 dcopList[100] = {
 void DarkseedEngine::dcopanim() {
 	_player->loadAnimations("dcopb.nsp");
 	showFullscreenPic("dcopb.pic");
-	_animIndexTbl[0] = 0;
-	_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
+	_animation->_animIndexTbl[0] = 0;
+	_animation->_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
 
 	_sprites.clearSpriteDrawList();
 	_console->printTosText(923);
@@ -3424,7 +2613,7 @@ void DarkseedEngine::dcopanim() {
 		if (_fullscreenPic) {
 			_fullscreenPic->draw(0x45, 0x28);
 		}
-		advanceAnimationFrame(0);
+		_animation->advanceAnimationFrame(0);
 		const Sprite &dcopSprite = _player->_animations.getSpriteAt(dcopList[lipsIdx]);
 		g_engine->_sprites.addSpriteToDrawList(310, 180, &dcopSprite, 255, dcopSprite._width, dcopSprite._height, false);
 		_sprites.drawSprites();
@@ -3515,8 +2704,8 @@ void DarkseedEngine::keeperanim() {
 	_cursor.showCursor(false);
 	_player->loadAnimations("keeper.nsp");
 	showFullscreenPic("keeper.pic");
-	_animIndexTbl[0] = 0;
-	_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
+	_animation->_animIndexTbl[0] = 0;
+	_animation->_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
 
 	_console->printTosText(913);
 
@@ -3528,7 +2717,7 @@ void DarkseedEngine::keeperanim() {
 		if (_fullscreenPic) {
 			_fullscreenPic->draw(0x45, 0x28);
 		}
-		advanceAnimationFrame(0);
+		_animation->advanceAnimationFrame(0);
 		const Sprite &keeperSprite = _player->_animations.getSpriteAt(keeperList[lipsIdx]);
 		g_engine->_sprites.addSpriteToDrawList(254, 117, &keeperSprite, 255, keeperSprite._width, keeperSprite._height, false);
 		_sprites.drawSprites();
@@ -3625,8 +2814,8 @@ void DarkseedEngine::sargoanim() {
 	_cursor.showCursor(false);
 	_player->loadAnimations("sargo.nsp");
 	showFullscreenPic("sargo.pic");
-	_animIndexTbl[0] = 0;
-	_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
+	_animation->_animIndexTbl[0] = 0;
+	_animation->_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
 
 	_console->printTosText(916);
 
@@ -3638,7 +2827,7 @@ void DarkseedEngine::sargoanim() {
 		if (_fullscreenPic) {
 			_fullscreenPic->draw(0x45, 0x28);
 		}
-		advanceAnimationFrame(0);
+		_animation->advanceAnimationFrame(0);
 		const Sprite &sargoSprite = _player->_animations.getSpriteAt(sargoList[lipsIdx]);
 		g_engine->_sprites.addSpriteToDrawList(334, 160, &sargoSprite, 255, sargoSprite._width, sargoSprite._height, false);
 		_sprites.drawSprites();
@@ -3722,7 +2911,7 @@ void DarkseedEngine::newGame() {
 	_player->_position.y = 0x5b;
 	_player->_frameIdx = 0;
 	_player->_direction = 1;
-	setupOtherNspAnimation(0, 1);
+	_animation->setupOtherNspAnimation(0, 1);
 	//		bVar1 = true;
 	if (_currentDay == 1) {
 		_console->printTosText(8);
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index fb5ced445fb..2256a4407a6 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -34,6 +34,7 @@
 #include "engines/savestate.h"
 #include "graphics/screen.h"
 
+#include "darkseed/animation.h"
 #include "darkseed/console.h"
 #include "darkseed/cursor.h"
 #include "darkseed/cutscene.h"
@@ -88,7 +89,7 @@ protected:
 	Common::Error run() override;
 public:
 	Pic _frame;
-	bool _frameAdvanced = false;
+
 	bool _ct_voice_status = false;
 	bool _isRightMouseClicked = false;
 	bool _isLeftMouseClicked = false;
@@ -107,6 +108,7 @@ public:
 	Inventory _inventory;
 	UseCode *_useCode = nullptr;
 	Cutscene _cutscene;
+	Animation *_animation = nullptr;
 
 	uint8 _currentDay = 1;
 	int _currentTimeInSeconds = 0x7e8e;
@@ -115,8 +117,6 @@ public:
 	uint8 _previousRoomNumber = 0;
 	uint16 _targetRoomNumber = 0;
 
-	bool _isPlayingAnimation_maybe = false;
-	uint16 _otherNspAnimationType_maybe = 0;
 	uint16 _headAcheMessageCounter = 0;
 	uint8 _headacheMessageIdx = 0;
 
@@ -125,17 +125,11 @@ public:
 	uint16 _scaledSpriteWidth = 0;
 	uint16 _scaledSpriteHeight = 0;
 
-	int _nsp_sprite_scaling_y_position = 0;
-
 	bool _player_sprite_related_2c85_82f3 = false;
 	int _frameBottom = 0;
-	bool _objRestarted = false;
-	int _animIndexTbl[30];
-	int _spriteAnimCountdownTimer[30];
 
 	// Unknown variables
 	bool _doorEnabled = false;
-	bool _scaleSequence = false;
 	bool _useDoorTarget = false;
 
 	int16 _counter_2c85_888b = 0;
@@ -151,6 +145,12 @@ public:
 	bool _printedcomeheredawson = false;
 	void zeromousebuttons();
 
+	void gotonextmorning();
+
+	void playDayChangeCutscene();
+
+	void wongame();
+
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	~DarkseedEngine() override;
@@ -181,11 +181,11 @@ public:
 	};
 
 	bool canLoadGameStateCurrently(Common::U32String *msg) override {
-		return !_isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting;
+		return !_animation->_isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting;
 	}
 
 	bool canSaveGameStateCurrently(Common::U32String *msg) override {
-		return !_isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting;
+		return !_animation->_isPlayingAnimation_maybe && !_player->_isAutoWalkingToBed && !_player->_herowaiting;
 	}
 
 	/**
@@ -219,7 +219,6 @@ public:
 	void newGame();
 
 	void updateDisplay();
-	void setupOtherNspAnimation(int nspAnimIdx, int animId);
 	void debugTeleportToRoom(int newRoomNumber, int entranceNumber);
 	void showFullscreenPic(const Common::Path &filename);
 	void lookCode(int objNum);
@@ -239,8 +238,6 @@ public:
 
 private:
 	void updateBaseSprites();
-	void updateAnimation();
-	void advanceAnimationFrame(int nspAminIdx);
 	void gameloop();
 	void updateEvents();
 	void handleInput();
@@ -248,15 +245,12 @@ private:
 	void handlePointerAction();
 	void loadRoom(int roomNumber);
 
-	void wongame();
 	void keeperanim();
 	void sargoanim();
 
 	void gotosleepinjail();
-	void gotonextmorning();
 
 	void updateHeadache();
-	void playDayChangeCutscene();
 	void closeShops();
 	void initDelbertAtSide();
 	void moveplayertodelbert();
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index d018741f5be..7f18349aea3 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -97,7 +97,7 @@ void Inventory::restoreFrame() {
 }
 
 void Inventory::draw() {
-	if ((g_engine->_actionMode <= 4 && g_engine->_cursor.getY() > 40) || g_engine->_isPlayingAnimation_maybe || (g_engine->_objectVar[141] >= 1 && g_engine->_objectVar[141] <= 3)) {
+	if ((g_engine->_actionMode <= 4 && g_engine->_cursor.getY() > 40) || g_engine->_animation->_isPlayingAnimation_maybe || (g_engine->_objectVar[141] >= 1 && g_engine->_objectVar[141] <= 3)) {
 		if (_isVisible) {
 			restoreFrame();
 			_isVisible = false;
diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
index c8981f07d84..bf7c55e5c15 100644
--- a/engines/darkseed/module.mk
+++ b/engines/darkseed/module.mk
@@ -21,7 +21,8 @@ MODULE_OBJS = \
 	inventory.o \
 	sound.o \
 	usecode.o \
-	cutscene.o
+	cutscene.o \
+	animation.o
 
 # This module can be built as a plugin
 ifeq ($(ENABLE_DARKSEED), DYNAMIC_PLUGIN)
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 8d0a6dabfb0..3684fe84d11 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -436,7 +436,7 @@ static constexpr uint8 _closerroom[10] = {
 };
 
 void Player::setplayertowardsbedroom() {
-	if (g_engine->_isPlayingAnimation_maybe) {
+	if (g_engine->_animation->_isPlayingAnimation_maybe) {
 		return;
 	}
 	Common::Point currentCursor = g_engine->_cursor.getPosition();
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 3abb9b2138b..8f195898cb5 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -61,7 +61,7 @@ Room::Room(int roomNumber) : _roomNumber(roomNumber) {
 void Room::initRoom() {
 	for (int iVar1 = 0; iVar1 < 30; iVar1 = iVar1 + 1) {
 		_locObjFrame[iVar1] = 0;
-		g_engine->_animIndexTbl[iVar1] = 0;
+		g_engine->_animation->_animIndexTbl[iVar1] = 0;
 	}
 	if (g_engine->_objectVar[141] == 10) {
 		g_engine->_objectVar[141] = 11;
@@ -820,13 +820,13 @@ void Room::runRoomObjects() {
 		}
 		case 2: {
 			int spriteNum = 0;
-			if (_roomNumber == 17 && g_engine->_isPlayingAnimation_maybe && g_engine->_otherNspAnimationType_maybe == 19 && _locObjFrame[roomObjIdx] == 4) {
+			if (_roomNumber == 17 && g_engine->_animation->_isPlayingAnimation_maybe && g_engine->_animation->_otherNspAnimationType_maybe == 19 && _locObjFrame[roomObjIdx] == 4) {
 				advanceLocAnimFrame(roomObjIdx + 1);
 				spriteNum = _locationSprites.getAnimAt(1)._frameNo[_locObjFrame[roomObjIdx + 1]];
-			} else if (_roomNumber == 16 && g_engine->_isPlayingAnimation_maybe && g_engine->_otherNspAnimationType_maybe == 35) {
+			} else if (_roomNumber == 16 && g_engine->_animation->_isPlayingAnimation_maybe && g_engine->_animation->_otherNspAnimationType_maybe == 35) {
 				// shop
 				g_engine->nextFrame(5);
-				spriteNum = g_engine->_player->_animations.getAnimAt(5)._frameNo[g_engine->_animIndexTbl[5]];
+				spriteNum = g_engine->_player->_animations.getAnimAt(5)._frameNo[g_engine->_animation->_animIndexTbl[5]];
 			} else if (_roomNumber == 53) {
 				if (g_engine->_objectVar[79] == 4) {
 					g_engine->_objectVar[79] = 2;
@@ -838,7 +838,7 @@ void Room::runRoomObjects() {
 					roomObj.yOffset += anim._deltaY[_locObjFrame[g_engine->_objectVar[79]]];
 				}
 				spriteNum = _locationSprites.getAnimAt(g_engine->_objectVar[79])._frameNo[_locObjFrame[g_engine->_objectVar[79]]];
-				if (g_engine->_objRestarted) {
+				if (g_engine->_animation->_objRestarted) {
 					if (g_engine->_objectVar[79] == 1) {
 						g_engine->_objectVar[79] = 3;
 					}
@@ -853,7 +853,7 @@ void Room::runRoomObjects() {
 				spriteNum = _locationSprites.getAnimAt(_roomObj[roomObjIdx].spriteNum)._frameNo[_locObjFrame[roomObjIdx]];
 			}
 
-			if (_roomNumber == 16 && g_engine->_isPlayingAnimation_maybe && g_engine->_otherNspAnimationType_maybe == 35) {
+			if (_roomNumber == 16 && g_engine->_animation->_isPlayingAnimation_maybe && g_engine->_animation->_otherNspAnimationType_maybe == 35) {
 				const Sprite &sprite = g_engine->_player->_animations.getSpriteAt(spriteNum);
 				g_engine->_sprites.addSpriteToDrawList(
 					xPos,
@@ -900,7 +900,7 @@ void Room::runRoomObjects() {
 						false);
 				}
 				updateRoomObj(48, xPos, sprite._width, yPos, sprite._height);
-			} else if (_roomNumber == 5 && g_engine->_isPlayingAnimation_maybe && g_engine->_otherNspAnimationType_maybe == 7) {
+			} else if (_roomNumber == 5 && g_engine->_animation->_isPlayingAnimation_maybe && g_engine->_animation->_otherNspAnimationType_maybe == 7) {
 				const Sprite &sprite = _locationSprites.getSpriteAt(spriteNum);
 				g_engine->_sprites.addSpriteToDrawList(
 					xPos,
@@ -948,7 +948,7 @@ void Room::runRoomObjects() {
 						false);
 				} else if ((_roomNumber != 64 || g_engine->_currentTimeInSeconds < 64801 || spriteNum == 3 || spriteNum > 13) &&
 						      (
-							   g_engine->_isPlayingAnimation_maybe ||
+							   g_engine->_animation->_isPlayingAnimation_maybe ||
 							   _locationSprites.getAnimAt(roomObj.spriteNum)._numFrames > 1 ||
 							   (playerLeftXPos <= xPos + sprite._width && xPos <= playerRightXPos && g_engine->_player->_position.x <= xPos + sprite._width) ||
 							   g_engine->_objectVar[141] == 6 ||
@@ -977,7 +977,7 @@ void Room::runRoomObjects() {
 			}
 			if (_roomNumber == 57 && g_engine->_previousRoomNumber == 54 && spriteNum < 6) {
 				g_engine->_objectVar[56] = spriteNum;
-				if (g_engine->_objRestarted) {
+				if (g_engine->_animation->_objRestarted) {
 					g_engine->_objectVar[56] = 6;
 				}
 			}
@@ -1021,7 +1021,7 @@ void Room::runRoomObjects() {
 		const Sprite &sprite = _locationSprites.getSpriteAt(0);
 		g_engine->_sprites.addSpriteToDrawList(519, 80, &sprite, 255, sprite._width, sprite._height, false);
 	}
-	if (_roomNumber == 0 && g_engine->_isPlayingAnimation_maybe) {
+	if (_roomNumber == 0 && g_engine->_animation->_isPlayingAnimation_maybe) {
 		const Sprite &sprite = _locationSprites.getSpriteAt(1);
 		g_engine->_sprites.addSpriteToDrawList(111, 136, &sprite, 1, sprite._width, sprite._height, false);
 	}
@@ -1058,7 +1058,7 @@ void Room::runRoomObjects() {
 	}
 	if (_roomNumber == 14) { // tuttle tome
 		if (g_engine->_objectVar[99] == 0) {
-			if (!g_engine->_isPlayingAnimation_maybe || g_engine->_otherNspAnimationType_maybe != 23) {
+			if (!g_engine->_animation->_isPlayingAnimation_maybe || g_engine->_animation->_otherNspAnimationType_maybe != 23) {
 				const Sprite &sprite = _locationSprites.getSpriteAt(g_engine->_objectVar[66] != 0 ? 1 : 0);
 				g_engine->_sprites.addSpriteToDrawList(245, 140, &sprite, 255, sprite._width, sprite._height, false);
 				const Sprite &sprite1 = _locationSprites.getSpriteAt(g_engine->_objectVar[67] == 0 ? 2 : 3);
@@ -1067,7 +1067,7 @@ void Room::runRoomObjects() {
 				g_engine->_sprites.addSpriteToDrawList(334, 153, &sprite2, 255, sprite2._width, sprite2._height, false);
 			} else {
 				advanceLocAnimFrame(0);
-				if (!g_engine->_objRestarted) {
+				if (!g_engine->_animation->_objRestarted) {
 					const Sprite &sprite = _locationSprites.getSpriteAt(_locationSprites.getAnimAt(0)._frameNo[_locObjFrame[0]]);
 					g_engine->_sprites.addSpriteToDrawList(245, 93, &sprite, 255, sprite._width, sprite._height, false);
 				} else {
@@ -1091,7 +1091,7 @@ void Room::runRoomObjects() {
 		}
 	}
 	if (_roomNumber == 33) { // in garage
-		if (g_engine->_isPlayingAnimation_maybe && g_engine->_otherNspAnimationType_maybe == 25) {
+		if (g_engine->_animation->_isPlayingAnimation_maybe && g_engine->_animation->_otherNspAnimationType_maybe == 25) {
 			const Sprite &sprite = _locationSprites.getSpriteAt(0);
 			g_engine->_sprites.addSpriteToDrawList(370, 128, &sprite, 255, sprite._width, sprite._height, false);
 		}
@@ -1253,42 +1253,42 @@ void Room::drawTrunk() {
 
 void Room::advanceLocAnimFrame(int roomObjIdx) {
 	const Obt &anim = _locationSprites.getAnimAt(_roomObj[roomObjIdx].spriteNum);
-	g_engine->_objRestarted = false;
+	g_engine->_animation->_objRestarted = false;
 	_locObjFrameTimer[roomObjIdx]--;
 	if (_locObjFrameTimer[roomObjIdx] < 1) {
 		_locObjFrame[roomObjIdx]++;
 		if (_locObjFrame[roomObjIdx] == anim._numFrames) {
 			_locObjFrame[roomObjIdx] = 0;
-			g_engine->_objRestarted = true;
+			g_engine->_animation->_objRestarted = true;
 		}
 		_locObjFrameTimer[roomObjIdx] = anim._frameDuration[_locObjFrame[roomObjIdx]];
 	}
 }
 
 bool Room::advanceFrame(int animIdx) {
-	g_engine->_frameAdvanced = false;
+	g_engine->_animation->_frameAdvanced = false;
 	const Obt &anim = _locationSprites.getAnimAt(animIdx);
-	g_engine->_objRestarted = false;
+	g_engine->_animation->_objRestarted = false;
 	_locObjFrameTimer[animIdx]--;
 	if (_locObjFrameTimer[animIdx] < 1) {
-		g_engine->_frameAdvanced = true;
+		g_engine->_animation->_frameAdvanced = true;
 		_locObjFrame[animIdx]++;
 		if (_locObjFrame[animIdx] == anim._numFrames) {
 			_locObjFrame[animIdx] = 0;
-			g_engine->_objRestarted = true;
+			g_engine->_animation->_objRestarted = true;
 		}
 		_locObjFrameTimer[animIdx] = anim._frameDuration[_locObjFrame[animIdx]];
 	}
-	return g_engine->_frameAdvanced;
+	return g_engine->_animation->_frameAdvanced;
 }
 
 void Room::mikeStickThrowAnim() {
 	advanceFrame(2);
-	if (!g_engine->_objRestarted) {
+	if (!g_engine->_animation->_objRestarted) {
 		g_engine->_player->_frameIdx = _locationSprites.getAnimAt(2)._frameNo[_locObjFrame[2]];
 	} else {
 		g_engine->_objectVar[79] = 1;
-		g_engine->_isPlayingAnimation_maybe = false;
+		g_engine->_animation->_isPlayingAnimation_maybe = false;
 		g_engine->_inventory.removeItem(19);
 		g_engine->_objectVar.setMoveObjectRoom(19, 100);
 	}
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 3f723c69b79..df1bcfd7dae 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -202,9 +202,9 @@ void Darkseed::UseCode::useCode(int objNum) {
 	if (objNum == 47) {
 		_player->loadAnimations("phone.nsp");
 		if (_objectVar.getObjectRunningCode(47) == 0) {
-			g_engine->setupOtherNspAnimation(2, 63);
+			g_engine->_animation->setupOtherNspAnimation(2, 63);
 		} else {
-			g_engine->setupOtherNspAnimation(0, 8);
+			g_engine->_animation->setupOtherNspAnimation(0, 8);
 		}
 		_player->_direction = 3;
 	}
@@ -244,7 +244,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 			_console->printTosText(119);
 		} else {
 			_player->loadAnimations("bedsleep.nsp");
-			g_engine->setupOtherNspAnimation(1, 5);
+			g_engine->_animation->setupOtherNspAnimation(1, 5);
 		}
 		return;
 	}
@@ -268,9 +268,9 @@ void Darkseed::UseCode::useCode(int objNum) {
 	if (objNum == 187) { //keeper computer screen
 		if (_objectVar[187] == 0) {
 			_console->printTosText(856);
-			g_engine->setupOtherNspAnimation(0, 60);
+			g_engine->_animation->setupOtherNspAnimation(0, 60);
 		} else {
-			g_engine->setupOtherNspAnimation(1, 61);
+			g_engine->_animation->setupOtherNspAnimation(1, 61);
 		}
 		return;
 	}
@@ -298,7 +298,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 	}
 	if (objNum == 46) {
 		if (_objectVar[46] == 1) {
-			g_engine->setupOtherNspAnimation(0, 19);
+			g_engine->_animation->setupOtherNspAnimation(0, 19);
 		} else {
 			_console->printTosText(539);
 		}
@@ -347,14 +347,14 @@ void Darkseed::UseCode::useCode(int objNum) {
 					} else {
 						_console->printTosText(385);
 					}
-					g_engine->setupOtherNspAnimation(0, 52);
+					g_engine->_animation->setupOtherNspAnimation(0, 52);
 				} else {
 					if (_objectVar[objNum] == 0) {
 						_console->printTosText(371);
 					} else {
 						_console->printTosText(373);
 					}
-					g_engine->setupOtherNspAnimation(0, objNum - 56);
+					g_engine->_animation->setupOtherNspAnimation(0, objNum - 56);
 				}
 			} else {
 				if (_objectVar[objNum] == 0) {
@@ -368,13 +368,13 @@ void Darkseed::UseCode::useCode(int objNum) {
 		}
 		if (objNum == 111) { // tap
 			_player->loadAnimations("aspirin.nsp");
-			g_engine->setupOtherNspAnimation(0, 30);
+			g_engine->_animation->setupOtherNspAnimation(0, 30);
 			_console->printTosText(242);
 			return;
 		}
 		if (objNum == 112) { // mirror cabinet
 			_player->loadAnimations("aspirin.nsp");
-			g_engine->setupOtherNspAnimation(2, 32);
+			g_engine->_animation->setupOtherNspAnimation(2, 32);
 			return;
 		}
 		if (objNum > 30 && objNum < 34) {
@@ -388,21 +388,21 @@ void Darkseed::UseCode::useCode(int objNum) {
 		}
 		if ((objNum == 102) && (_objectVar[23] == 1)) {
 			_player->loadAnimations("slide.nsp");
-			g_engine->setupOtherNspAnimation(1, 26);
+			g_engine->_animation->setupOtherNspAnimation(1, 26);
 			return;
 		}
 		if (objNum == 101) {
 			switch (_objectVar[101]) {
 			case 0:
 				_player->loadAnimations("opendoor.nsp");
-				g_engine->setupOtherNspAnimation(0, 65);
+				g_engine->_animation->setupOtherNspAnimation(0, 65);
 				g_engine->playSound(31, 5, -1);
 				_objectVar[101] = 1;
 				_console->printTosText(733);
 				break;
 			case 1:
 				_player->loadAnimations("opendoor.nsp");
-				g_engine->setupOtherNspAnimation(0, 65);
+				g_engine->_animation->setupOtherNspAnimation(0, 65);
 				g_engine->playSound(31, 5, -1);
 				_objectVar[101] = 0;
 				_console->printTosText(737);
@@ -414,14 +414,14 @@ void Darkseed::UseCode::useCode(int objNum) {
 				return;
 			case 3:
 				_player->loadAnimations("opendoor.nsp");
-				g_engine->setupOtherNspAnimation(0, 65);
+				g_engine->_animation->setupOtherNspAnimation(0, 65);
 				g_engine->playSound(31, 5, -1);
 				_objectVar[101] = 4;
 				_console->printTosText(737);
 				break;
 			case 4:
 				_player->loadAnimations("opendoor.nsp");
-				g_engine->setupOtherNspAnimation(0, 65);
+				g_engine->_animation->setupOtherNspAnimation(0, 65);
 				g_engine->playSound(31, 5, -1);
 				_objectVar[101] = 3;
 				_console->printTosText(733);
@@ -482,7 +482,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 		} else if (objNum == 22) {
 			if (_objectVar[22] < 4) {
 				_player->loadAnimations("push.nsp");
-				g_engine->setupOtherNspAnimation(0, 18);
+				g_engine->_animation->setupOtherNspAnimation(0, 18);
 			} else {
 				_console->printTosText(665);
 			}
@@ -498,13 +498,13 @@ void Darkseed::UseCode::useCode(int objNum) {
 			_player->loadAnimations("instrshp.nsp");
 			if (_objectVar[71] == 2) {
 				_console->printTosText(4);
-				g_engine->setupOtherNspAnimation(1, 44);
+				g_engine->_animation->setupOtherNspAnimation(1, 44);
 			} else {
-				g_engine->setupOtherNspAnimation(0, 43);
+				g_engine->_animation->setupOtherNspAnimation(0, 43);
 			}
 		} else if (objNum == 117) {
 			_player->loadAnimations("obslev.nsp");
-			g_engine->setupOtherNspAnimation(1, 46);
+			g_engine->_animation->setupOtherNspAnimation(1, 46);
 		} else if (objNum == 62) {
 			if (((_objectVar[49] == 0) || (1 < _objectVar[62])) || (g_engine->_currentDay != 1)) {
 				if (((_objectVar[49] == 0) || (1 < _objectVar[62])) || (g_engine->_currentDay != 2)) {
@@ -559,7 +559,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 			//			_NoScroll = 0;
 			if (_objectVar[52] == 1) {
 				_player->loadAnimations("shower.nsp");
-				g_engine->setupOtherNspAnimation(0, 2);
+				g_engine->_animation->setupOtherNspAnimation(0, 2);
 				_console->printTosText(193);
 				g_engine->playSound(2, 4, -1);
 			} else {
@@ -592,7 +592,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 			}
 		} else if (objNum == 139) {
 			_player->loadAnimations("ltladder.nsp");
-			g_engine->setupOtherNspAnimation(0, 10);
+			g_engine->_animation->setupOtherNspAnimation(0, 10);
 		} else if (objNum == 76) {
 			//			_NoScroll = 0;
 			//			Ordinal_184(unaff_CS,(int)&_file_name,4192,(int)sg_engine->_room3.nnn_1060_31e1);
@@ -602,7 +602,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 			//			SetHeroSpriteNumber();
 		} else if (objNum == 77) {
 			_player->loadAnimations("rtladder.nsp");
-			g_engine->setupOtherNspAnimation(0, 12);
+			g_engine->_animation->setupOtherNspAnimation(0, 12);
 		} else if (objNum == 66 && _objectVar[68] == 0) {
 			if (_objectVar[12] == 2) {
 				g_engine->playSound(5, 5, -1);
@@ -639,7 +639,7 @@ void Darkseed::UseCode::useCode(int objNum) {
 					if ((_objectVar[66] == 1) && (_objectVar[67] == 1)) {
 						g_engine->playSound(13, 5, -1);
 						_objectVar[68] = 1;
-						g_engine->setupOtherNspAnimation(0, 23);
+						g_engine->_animation->setupOtherNspAnimation(0, 23);
 					} else {
 						_objectVar[68] = 2;
 					}
@@ -689,10 +689,10 @@ void Darkseed::UseCode::useCodeGloves(int16 targetObjNum) {
 	}
 	if (targetObjNum == 57) {
 		_player->loadAnimations("instrshp.nsp");
-		g_engine->setupOtherNspAnimation(0, 43);
+		g_engine->_animation->setupOtherNspAnimation(0, 43);
 	} else if (targetObjNum == 117) {
 		_player->loadAnimations("obslev.nsp");
-		g_engine->setupOtherNspAnimation(0, 45);
+		g_engine->_animation->setupOtherNspAnimation(0, 45);
 	}
 }
 
@@ -714,7 +714,7 @@ void Darkseed::UseCode::useCodeMoney(int16 targetObjNum) {
 	}
 	if (_objectVar[138] == 0) {
 		_player->loadAnimations("givclerk.nsp");
-		g_engine->setupOtherNspAnimation(6, 35);
+		g_engine->_animation->setupOtherNspAnimation(6, 35);
 	} else {
 		_console->addTextLine("Choose an item before giving clerk more money.");
 	}
@@ -745,7 +745,7 @@ void Darkseed::UseCode::useCodeShopItems(int16 actionObjNum, int16 targetObjNum)
 	if (actionObjNum == 7) {
 		if (targetObjNum == 44) {
 			_player->loadAnimations("opendoor.nsp");
-			g_engine->setupOtherNspAnimation(0, 24);
+			g_engine->_animation->setupOtherNspAnimation(0, 24);
 			_objectVar[44] = 3600;
 			g_engine->playSound(32, 5, -1);
 			_inventory.removeItem(7);
@@ -1005,7 +1005,7 @@ void Darkseed::UseCode::useCrowBar(int16 targetObjNum) {
 	if (targetObjNum == 42) {
 		if ((_objectVar[42] == 0) || (_objectVar[42] == 4)) {
 			_player->loadAnimations("crowbar.nsp");
-			g_engine->setupOtherNspAnimation(0, 17);
+			g_engine->_animation->setupOtherNspAnimation(0, 17);
 		} else {
 			_console->printTosText(962);
 		}
@@ -1183,7 +1183,7 @@ void UseCode::useCodeMirrorShard(int16 targetObjNum) {
 		_inventory.removeItem(15);
 		_objectVar[137] = 1;
 		_player->loadAnimations("mglow.nsp");
-		g_engine->setupOtherNspAnimation(0, 59);
+		g_engine->_animation->setupOtherNspAnimation(0, 59);
 	} else if (targetObjNum == 124) {
 		_console->printTosText(20);
 	} else if (targetObjNum == 129) {
@@ -1249,7 +1249,7 @@ void UseCode::useCodeDelbertsCard(int16 targetObjNum) {
 	}
 	if (targetObjNum == 64) {
 		if (g_engine->_room->_roomNumber == 30) {
-			g_engine->setupOtherNspAnimation(1, 40);
+			g_engine->_animation->setupOtherNspAnimation(1, 40);
 		} else {
 			_console->printTosText(488);
 		}
@@ -1267,7 +1267,7 @@ void UseCode::useCodeStick(int16 targetObjNum) {
 	}
 	if (targetObjNum == 116) {
 		g_engine->_room->loadLocationSprites("mthrow.nsp");
-		g_engine->setupOtherNspAnimation(2, 47);
+		g_engine->_animation->setupOtherNspAnimation(2, 47);
 	} else if (targetObjNum == 53) {
 		g_engine->throwmikeinjail();
 	}
@@ -1299,7 +1299,7 @@ void UseCode::useCodeRope(int16 targetObjNum) {
 	if (targetObjNum == 61) {
 		_objectVar[23] = 1;
 		_player->loadAnimations("opendoor.nsp");
-		g_engine->setupOtherNspAnimation(0, 15);
+		g_engine->_animation->setupOtherNspAnimation(0, 15);
 		_inventory.removeItem(23);
 	}
 	if (targetObjNum == 53) {
@@ -1373,7 +1373,7 @@ void UseCode::useCodeSpecialHammer(int16 actionObjNum, int16 targetObjNum) {
 			_console->printTosText(301);
 		} else {
 			_player->loadAnimations("smash.nsp");
-			g_engine->setupOtherNspAnimation(0, 36);
+			g_engine->_animation->setupOtherNspAnimation(0, 36);
 		}
 	} else if (targetObjNum == 53) {
 		g_engine->throwmikeinjail();
@@ -1536,7 +1536,7 @@ void UseCode::useCodeWatch(int16 targetObjNum) {
 void UseCode::useCodeTinCup(int16 targetObjNum) {
 	if (targetObjNum == 189) {
 		_player->loadAnimations("cuphit.nsp");
-		g_engine->setupOtherNspAnimation(0, 62);
+		g_engine->_animation->setupOtherNspAnimation(0, 62);
 		_player->_frameIdx = 3;
 	} else if (targetObjNum == 113) {
 		_console->printTosText(753);
@@ -1748,13 +1748,13 @@ static constexpr bool diggingxflipTbl[12] = {
 void UseCode::startdigging(int16 targetObjNum) {
 	if (targetObjNum == 0) {
 		_player->loadAnimations("lgravedg.nsp");
-		g_engine->setupOtherNspAnimation(0, 21);
+		g_engine->_animation->setupOtherNspAnimation(0, 21);
 	} else if (diggingxflipTbl[targetObjNum]) {
 		_player->loadAnimations("lgravedg.nsp");
-		g_engine->setupOtherNspAnimation(0, 4);
+		g_engine->_animation->setupOtherNspAnimation(0, 4);
 	} else {
 		_player->loadAnimations("rgravedg.nsp");
-		g_engine->setupOtherNspAnimation(0, 22);
+		g_engine->_animation->setupOtherNspAnimation(0, 22);
 	}
 	g_engine->playSound(14, 5, -1);
 }


Commit: fb2238ecd906f57f8fa28a72b5a88218d6c6c3b1
    https://github.com/scummvm/scummvm/commit/fb2238ecd906f57f8fa28a72b5a88218d6c6c3b1
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Move fullscreen animations into Animation class

Changed paths:
    engines/darkseed/animation.cpp
    engines/darkseed/animation.h
    engines/darkseed/cutscene.cpp
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/room.cpp
    engines/darkseed/usecode.cpp


diff --git a/engines/darkseed/animation.cpp b/engines/darkseed/animation.cpp
index 336dae882f2..469c07a624f 100644
--- a/engines/darkseed/animation.cpp
+++ b/engines/darkseed/animation.cpp
@@ -191,7 +191,7 @@ void Animation::updateAnimation() {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
 			if (g_engine->_room->isGiger()) {
-				g_engine->stuffPlayer();
+				stuffPlayer();
 			} else {
 				if (g_engine->_room->isOutside() && g_engine->_currentTimeInSeconds > 61200) {
 					g_engine->_room->restorePalette();
@@ -428,7 +428,7 @@ void Animation::updateAnimation() {
 		if (_objRestarted) {
 			_isPlayingAnimation_maybe = true;
 			_objectVar[46] = 2;
-			g_engine->libanim(true);
+			libanim(true);
 		}
 		break;
 	case 20: // receive card from delbert
@@ -591,7 +591,7 @@ void Animation::updateAnimation() {
 		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]];
 		} else {
-			g_engine->stuffPlayer();
+			stuffPlayer();
 		}
 		break;
 	case 39: // Arrest Mike.
@@ -668,7 +668,7 @@ void Animation::updateAnimation() {
 		} else {
 			//			LoadModeSong(7); TODO
 			g_engine->playSound(0, 6, -1);
-			g_engine->stuffPlayer();
+			stuffPlayer();
 		}
 		break;
 	}
@@ -835,4 +835,359 @@ void Animation::advanceAnimationFrame(int nspAminIdx) {
 		_spriteAnimCountdownTimer[nspAminIdx] = anim._frameDuration[_animIndexTbl[nspAminIdx]];
 	}
 }
+
+static constexpr uint8 dcopList[100] = {
+	0, 1, 2, 3,
+	2, 1, 2, 3,
+	2, 1, 0, 1,
+	2, 3, 2, 3,
+	2, 3, 2, 1,
+	0, 1, 2, 1,
+	2, 1, 2, 3,
+	2, 1, 0, 1,
+	2, 3, 2, 1,
+	2, 3, 2, 1,
+	0, 1, 2, 3,
+	2, 3, 2, 3,
+	2, 1, 0, 1,
+	2, 1, 2, 1,
+	2, 3, 2, 1,
+	0, 1, 2, 1,
+	2, 1, 2, 3,
+	2, 1, 0, 1,
+	2, 3, 2, 3,
+	2, 3, 2, 1,
+	0, 1, 2, 1,
+	2, 1, 2, 3,
+	2, 1, 0, 1,
+	2, 1, 2, 1,
+	2, 3, 2, 1
+};
+
+void Animation::dcopanim() {
+	_player->loadAnimations("dcopb.nsp");
+	g_engine->showFullscreenPic("dcopb.pic");
+	_animIndexTbl[0] = 0;
+	_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
+
+	g_engine->_sprites.clearSpriteDrawList();
+	g_engine->_console->printTosText(923);
+
+	uint8 lipsIdx = 0;
+	while (g_engine->_sound->isPlayingSpeech()) {
+		g_engine->_sprites.clearSpriteDrawList();
+
+		g_engine->drawFullscreenPic();
+
+		advanceAnimationFrame(0);
+		const Sprite &dcopSprite = _player->_animations.getSpriteAt(dcopList[lipsIdx]);
+		g_engine->_sprites.addSpriteToDrawList(310, 180, &dcopSprite, 255, dcopSprite._width, dcopSprite._height, false);
+		g_engine->_sprites.drawSprites();
+
+		g_engine->_console->draw();
+		g_engine->_screen->makeAllDirty();
+		g_engine->_screen->update();
+
+		lipsIdx++;
+		if (lipsIdx == 100) {
+			lipsIdx = 0;
+		}
+
+		for (int i = 0; i < 6; i++) {
+			g_engine->wait();
+		}
+	}
+	g_engine->removeFullscreenPic();
+}
+
+static constexpr uint8 sargoList[100] = {
+	0, 1, 2, 3,
+	4, 3, 2, 1,
+	0, 1, 0, 1,
+	2, 3, 2, 3,
+	2, 3, 2, 1,
+	0, 1, 2, 3,
+	4, 3, 4, 3,
+	2, 1, 0, 1,
+	2, 3, 4, 3,
+	2, 1, 0, 1,
+	0, 1, 2, 3,
+	2, 3, 2, 3,
+	2, 1, 0, 1,
+	2, 3, 2, 1,
+	0, 4, 3, 2,
+	1, 1, 2, 3,
+	4, 3, 2, 1,
+	0, 1, 0, 1,
+	2, 3, 2, 3,
+	2, 3, 2, 1,
+	2, 1, 0, 0,
+	1, 2, 3, 2,
+	1, 0, 1, 2,
+	3, 4, 3, 2,
+	3, 2, 1, 1
+};
+
+void Animation::sargoanim() {
+	g_engine->_cursor.showCursor(false);
+	_player->loadAnimations("sargo.nsp");
+	g_engine->showFullscreenPic("sargo.pic");
+	_animIndexTbl[0] = 0;
+	_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
+
+	g_engine->_console->printTosText(916);
+
+	uint8 dialogIdx = 79;
+	uint8 lipsIdx = 0;
+	while (g_engine->_sound->isPlayingSpeech() || dialogIdx < 81) {
+		g_engine->_sprites.clearSpriteDrawList();
+
+		g_engine->drawFullscreenPic();
+
+		advanceAnimationFrame(0);
+		const Sprite &sargoSprite = _player->_animations.getSpriteAt(sargoList[lipsIdx]);
+		g_engine->_sprites.addSpriteToDrawList(334, 160, &sargoSprite, 255, sargoSprite._width, sargoSprite._height, false);
+		g_engine->_sprites.drawSprites();
+
+		g_engine->_console->draw();
+		g_engine->_screen->makeAllDirty();
+		g_engine->_screen->update();
+
+		lipsIdx++;
+		if (lipsIdx == 100) {
+			lipsIdx = 0;
+		}
+
+		if (!g_engine->_sound->isPlayingSpeech()) {
+			dialogIdx++;
+			if (dialogIdx == 80) {
+				g_engine->_console->printTosText(917);
+			}
+		}
+		g_engine->waitxticks(1);
+	}
+	g_engine->removeFullscreenPic();
+	g_engine->_cursor.showCursor(true);
+}
+
+static constexpr uint8 keeperList[250] = {
+	10, 11, 12, 13,
+	12, 12, 13, 10,
+	11, 10, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	10, 10, 11, 11,
+	12, 12, 11, 12,
+	12, 13, 12, 12,
+	12, 13, 13, 12,
+	13, 12, 11, 12,
+	13, 12, 11, 10,
+	11, 12, 13, 10,
+	11, 10, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	0, 0, 1, 1,
+	2, 2, 3, 3,
+	4, 4, 5, 5,
+	6, 6, 7, 7,
+	8, 8, 9, 9,
+	10, 10, 11, 11,
+	12, 12, 11, 12,
+	12, 13, 12, 12,
+	12, 13, 13, 12,
+	13, 12, 11, 10,
+	10, 11, 12, 13,
+	12, 12, 13, 10,
+	11, 10, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	10, 11, 12, 13,
+	12, 12, 13, 10,
+	11, 10, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	10, 11, 12, 13,
+	12, 12, 13, 10,
+	11, 10, 10, 10,
+	11, 11, 12, 12,
+	11, 12, 12, 13,
+	12, 12, 12, 13,
+	13, 12, 13, 12,
+	11, 10, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	10, 11, 12, 13,
+	12, 12, 13, 10,
+	11, 10, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	10, 10, 11, 11,
+	12, 12, 11, 12,
+	12, 13, 12, 12,
+	12, 13, 13, 12,
+	13, 12, 11, 10,
+	0, 1, 2, 3,
+	4, 5, 6, 7,
+	8, 9, 10, 11,
+	12, 13, 12, 12,
+	13, 10, 11, 10,
+	0, 0, 0, 0,
+	0, 0, 0, 0,
+	0, 0
+};
+
+void Animation::keeperanim() {
+	g_engine->_cursor.showCursor(false);
+	_player->loadAnimations("keeper.nsp");
+	g_engine->showFullscreenPic("keeper.pic");
+	_animIndexTbl[0] = 0;
+	_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
+
+	g_engine->_console->printTosText(913);
+
+	uint8 dialogIdx = 73;
+	uint8 lipsIdx = 0;
+	while (g_engine->_sound->isPlayingSpeech() || dialogIdx < 76) {
+		g_engine->_sprites.clearSpriteDrawList();
+
+		g_engine->drawFullscreenPic();
+
+		advanceAnimationFrame(0);
+		const Sprite &keeperSprite = _player->_animations.getSpriteAt(keeperList[lipsIdx]);
+		g_engine->_sprites.addSpriteToDrawList(254, 117, &keeperSprite, 255, keeperSprite._width, keeperSprite._height, false);
+		g_engine->_sprites.drawSprites();
+
+		g_engine->_console->draw();
+		g_engine->_screen->makeAllDirty();
+		g_engine->_screen->update();
+
+		lipsIdx++;
+		if (lipsIdx == 250) {
+			lipsIdx = 0;
+		}
+
+		if (!g_engine->_sound->isPlayingSpeech()) {
+			dialogIdx++;
+			if (dialogIdx == 74) {
+				g_engine->_console->printTosText(914);
+			} else if (dialogIdx == 75) {
+				g_engine->_console->printTosText(915);
+			}
+		}
+		g_engine->waitxticks(1);
+	}
+	g_engine->removeFullscreenPic();
+	g_engine->_cursor.showCursor(true);
+}
+
+void Animation::stuffPlayer() {
+	g_engine->_cursor.showCursor(false);
+	_player->loadAnimations("labparts.nsp");
+	g_engine->showFullscreenPic("lab.pic");
+	const Sprite &alienSprite = _player->_animations.getSpriteAt(8);
+
+	bool updateCounter = false;
+	int counter = 0;
+	while (counter < 8) {
+		g_engine->_sprites.clearSpriteDrawList();
+
+		g_engine->drawFullscreenPic();
+
+		const Sprite &mikeSprite = _player->_animations.getSpriteAt(counter);
+		g_engine->_sprites.addSpriteToDrawList(103, 93, &mikeSprite, 255, mikeSprite._width, mikeSprite._height, false);
+		g_engine->_sprites.addSpriteToDrawList(226, 100, &alienSprite, 255, alienSprite._width, alienSprite._height, false);
+
+		g_engine->_sprites.drawSprites();
+
+		g_engine->_console->draw();
+		g_engine->_screen->makeAllDirty();
+		g_engine->_screen->update();
+
+		updateCounter = !updateCounter;
+		if (updateCounter) {
+			counter++;
+		}
+		g_engine->waitxticks(1);
+	}
+	g_engine->waitxticks(3);
+	g_engine->removeFullscreenPic();
+	g_engine->_sprites.clearSpriteDrawList();
+	g_engine->_cursor.showCursor(true);
+	g_engine->_cutscene.play('Z');
+}
+
+static constexpr uint8 libList[100] = {
+	5, 6, 7, 8,
+	9, 10, 9, 8,
+	7, 6, 5, 6,
+	7, 6, 7, 8,
+	7, 6, 5, 6,
+	5, 6, 7, 8,
+	9, 10, 9, 8,
+	7, 6, 5, 6,
+	7, 6, 7, 8,
+	7, 6, 5, 6,
+	5, 6, 7, 8,
+	9, 10, 9, 8,
+	7, 6, 5, 6,
+	5, 6, 7, 6,
+	7, 8, 7, 6,
+	5, 6, 7, 6,
+	7, 8, 7, 6,
+	5, 6, 5, 6,
+	5, 6, 7, 6,
+	7, 8, 7, 6,
+	5, 6, 7, 8,
+	9, 10, 9, 8,
+	7, 6, 5, 6,
+	7, 8, 9, 10,
+	9, 8, 7, 6
+};
+
+void Animation::libanim(bool pickingUpReservedBook) {
+	_player->loadAnimations("libparts.nsp");
+	g_engine->showFullscreenPic("libinlib.pic");
+
+	g_engine->_console->printTosText(pickingUpReservedBook ? 928 : 924);
+
+	_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
+	uint8 lipsIdx = 0;
+	while (g_engine->_sound->isPlayingSpeech()) {
+		g_engine->_sprites.clearSpriteDrawList();
+		g_engine->_frame.draw();
+		g_engine->drawFullscreenPic();
+		g_engine->_console->draw();
+
+		advanceAnimationFrame(0);
+		const Sprite &eyesSprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]);
+		g_engine->_sprites.addSpriteToDrawList(255, 114, &eyesSprite, 255, eyesSprite._width, eyesSprite._height, false);
+		advanceAnimationFrame(1);
+
+		const Sprite &mouthSprite = _player->_animations.getSpriteAt(libList[lipsIdx]);
+		g_engine->_sprites.addSpriteToDrawList(255, 154, &mouthSprite, 255, mouthSprite._width, mouthSprite._height, false);
+
+		g_engine->_sprites.drawSprites();
+
+		g_engine->_screen->makeAllDirty();
+		g_engine->_screen->update();
+
+		lipsIdx++;
+		if (lipsIdx == 100) {
+			lipsIdx = 0;
+		}
+
+		for (int i = 0; i < 6; i++) {
+			g_engine->wait();
+		}
+	}
+
+	g_engine->removeFullscreenPic();
+
+	if (pickingUpReservedBook) {
+		_objectVar[49] = 1;
+		_objectVar[62] = 0;
+		g_engine->_cutscene.play('G');
+	}
+}
+
 } // End of namespace Darkseed
diff --git a/engines/darkseed/animation.h b/engines/darkseed/animation.h
index 8c4845d4fcf..67eaf13bda5 100644
--- a/engines/darkseed/animation.h
+++ b/engines/darkseed/animation.h
@@ -47,6 +47,12 @@ public:
 
 	void advanceAnimationFrame(int nspAminIdx);
 
+	void dcopanim();
+	void sargoanim();
+	void keeperanim();
+	void stuffPlayer();
+	void libanim(bool pickingUpReservedBook);
+
 public:
 	explicit Animation(Player *player, Objects &objectVar) : _player(player), _objectVar(objectVar) {}
 	void setupOtherNspAnimation(int nspAnimIdx, int animId);
diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index c967fb1fdae..adde97e79e8 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -85,6 +85,8 @@ void Cutscene::update() {
 			g_engine->newGame();
 		} else if (_cutsceneId == 'Y') {
 			play('I');
+		} else if (_cutsceneId == 'G') {
+			g_engine->_cursor.showCursor(true);
 		}
 	}
 }
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index b63ef5c9359..0ebe15381f3 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -193,10 +193,10 @@ void DarkseedEngine::gameloop() {
 					if (_objectVar[56] == 6) {
 //						LoadModeSong(7);
 						playSound(0, 6, -1);
-						stuffPlayer();
+						_animation->stuffPlayer();
 					}
 				} else {
-					dcopanim();
+					_animation->dcopanim();
 					changeToRoom(59, true);
 					_player->_position = {320, 200};
 					_player->updateSprite();
@@ -1775,7 +1775,7 @@ void DarkseedEngine::lookCode(int objNum) {
 		}
 	}
 	if (objNum == 48 && _objectVar[48] == 0) {
-		sargoanim();
+		_animation->sargoanim();
 		return;
 	}
 	if (objNum == 35 && _cursor.getY() < 40) {
@@ -1805,7 +1805,7 @@ void DarkseedEngine::lookCode(int objNum) {
 		} else if (_objectVar[51] == 0) {
 			_console->printTosText(853);
 			_objectVar[51] = 1;
-			keeperanim();
+			_animation->keeperanim();
 			_objectVar.setObjectRunningCode(72, 1);
 			_inventory.addItem(24);
 			_console->printTosText(959);
@@ -1908,8 +1908,14 @@ void DarkseedEngine::showFullscreenPic(const Common::Path &filename) {
 	Common::Path palFilename = Common::Path(filePathStr.substr(0, filePathStr.size() - 4) + ".pal");
 	Pal pal;
 	pal.load(g_engine->getPictureFilePath(palFilename));
-	_fullscreenPic->draw(0x45, 0x28);
-	_screen->addDirtyRect({{0x45, 0x28}, 501, 200});
+	drawFullscreenPic();
+}
+
+void DarkseedEngine::drawFullscreenPic() {
+	if (_fullscreenPic) {
+		_fullscreenPic->draw(0x45, 0x28);
+		_screen->addDirtyRect({{0x45, 0x28}, 501, 200});
+	}
 }
 
 void DarkseedEngine::getPackageObj(int packageType) {
@@ -2493,366 +2499,6 @@ void DarkseedEngine::leavepackage() {
 	_objectVar._objectRunningCode[140] = 0;
 }
 
-static constexpr uint8 libList[100] = {
-	5, 6, 7, 8,
-	9, 10, 9, 8,
-	7, 6, 5, 6,
-	7, 6, 7, 8,
-	7, 6, 5, 6,
-	5, 6, 7, 8,
-	9, 10, 9, 8,
-	7, 6, 5, 6,
-	7, 6, 7, 8,
-	7, 6, 5, 6,
-	5, 6, 7, 8,
-	9, 10, 9, 8,
-	7, 6, 5, 6,
-	5, 6, 7, 6,
-	7, 8, 7, 6,
-	5, 6, 7, 6,
-	7, 8, 7, 6,
-	5, 6, 5, 6,
-	5, 6, 7, 6,
-	7, 8, 7, 6,
-	5, 6, 7, 8,
-	9, 10, 9, 8,
-	7, 6, 5, 6,
-	7, 8, 9, 10,
-	9, 8, 7, 6
-};
-
-void DarkseedEngine::libanim(bool pickingUpReservedBook) {
-	_player->loadAnimations("libparts.nsp");
-	showFullscreenPic("libinlib.pic");
-
-	_console->printTosText(pickingUpReservedBook ? 928 : 924);
-
-	_animation->_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
-	uint8 lipsIdx = 0;
-	while (_sound->isPlayingSpeech()) {
-		_sprites.clearSpriteDrawList();
-		_frame.draw();
-		if (_fullscreenPic) {
-			_fullscreenPic->draw(0x45, 0x28);
-		}
-		_console->draw();
-
-		_animation->advanceAnimationFrame(0);
-		const Sprite &eyesSprite = _player->_animations.getSpriteAt(_player->_animations.getAnimAt(0)._frameNo[_animation->_animIndexTbl[0]]);
-		g_engine->_sprites.addSpriteToDrawList(255, 114, &eyesSprite, 255, eyesSprite._width, eyesSprite._height, false);
-		_animation->advanceAnimationFrame(1);
-
-		const Sprite &mouthSprite = _player->_animations.getSpriteAt(libList[lipsIdx]);
-		g_engine->_sprites.addSpriteToDrawList(255, 154, &mouthSprite, 255, mouthSprite._width, mouthSprite._height, false);
-
-		_sprites.drawSprites();
-
-		_screen->makeAllDirty();
-		_screen->update();
-
-		lipsIdx++;
-		if (lipsIdx == 100) {
-			lipsIdx = 0;
-		}
-
-		for (int i = 0; i < 6; i++) {
-			wait();
-		}
-	}
-
-	removeFullscreenPic();
-
-	if (pickingUpReservedBook) {
-		_objectVar[49] = 1;
-		_objectVar[62] = 0;
-		_cutscene.play('G');
-	}
-}
-
-static constexpr uint8 dcopList[100] = {
-	0, 1, 2, 3,
-	2, 1, 2, 3,
-	2, 1, 0, 1,
-	2, 3, 2, 3,
-	2, 3, 2, 1,
-	0, 1, 2, 1,
-	2, 1, 2, 3,
-	2, 1, 0, 1,
-	2, 3, 2, 1,
-	2, 3, 2, 1,
-	0, 1, 2, 3,
-	2, 3, 2, 3,
-	2, 1, 0, 1,
-	2, 1, 2, 1,
-	2, 3, 2, 1,
-	0, 1, 2, 1,
-	2, 1, 2, 3,
-	2, 1, 0, 1,
-	2, 3, 2, 3,
-	2, 3, 2, 1,
-	0, 1, 2, 1,
-	2, 1, 2, 3,
-	2, 1, 0, 1,
-	2, 1, 2, 1,
-	2, 3, 2, 1
-};
-
-void DarkseedEngine::dcopanim() {
-	_player->loadAnimations("dcopb.nsp");
-	showFullscreenPic("dcopb.pic");
-	_animation->_animIndexTbl[0] = 0;
-	_animation->_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
-
-	_sprites.clearSpriteDrawList();
-	_console->printTosText(923);
-
-	uint8 lipsIdx = 0;
-	while (_sound->isPlayingSpeech()) {
-		_sprites.clearSpriteDrawList();
-
-		if (_fullscreenPic) {
-			_fullscreenPic->draw(0x45, 0x28);
-		}
-		_animation->advanceAnimationFrame(0);
-		const Sprite &dcopSprite = _player->_animations.getSpriteAt(dcopList[lipsIdx]);
-		g_engine->_sprites.addSpriteToDrawList(310, 180, &dcopSprite, 255, dcopSprite._width, dcopSprite._height, false);
-		_sprites.drawSprites();
-
-		_console->draw();
-		_screen->makeAllDirty();
-		_screen->update();
-
-		lipsIdx++;
-		if (lipsIdx == 100) {
-			lipsIdx = 0;
-		}
-
-		for (int i = 0; i < 6; i++) {
-			wait();
-		}
-	}
-	removeFullscreenPic();
-}
-
-static constexpr uint8 keeperList[250] = {
-	10, 11, 12, 13,
-	12, 12, 13, 10,
-	11, 10, 10, 11,
-	12, 13, 12, 12,
-	13, 10, 11, 10,
-	10, 10, 11, 11,
-	12, 12, 11, 12,
-	12, 13, 12, 12,
-	12, 13, 13, 12,
-	13, 12, 11, 12,
-	13, 12, 11, 10,
-	11, 12, 13, 10,
-	11, 10, 10, 11,
-	12, 13, 12, 12,
-	13, 10, 11, 10,
-	0, 0, 1, 1,
-	2, 2, 3, 3,
-	4, 4, 5, 5,
-	6, 6, 7, 7,
-	8, 8, 9, 9,
-	10, 10, 11, 11,
-	12, 12, 11, 12,
-	12, 13, 12, 12,
-	12, 13, 13, 12,
-	13, 12, 11, 10,
-	10, 11, 12, 13,
-	12, 12, 13, 10,
-	11, 10, 10, 11,
-	12, 13, 12, 12,
-	13, 10, 11, 10,
-	10, 11, 12, 13,
-	12, 12, 13, 10,
-	11, 10, 10, 11,
-	12, 13, 12, 12,
-	13, 10, 11, 10,
-	10, 11, 12, 13,
-	12, 12, 13, 10,
-	11, 10, 10, 10,
-	11, 11, 12, 12,
-	11, 12, 12, 13,
-	12, 12, 12, 13,
-	13, 12, 13, 12,
-	11, 10, 10, 11,
-	12, 13, 12, 12,
-	13, 10, 11, 10,
-	10, 11, 12, 13,
-	12, 12, 13, 10,
-	11, 10, 10, 11,
-	12, 13, 12, 12,
-	13, 10, 11, 10,
-	10, 10, 11, 11,
-	12, 12, 11, 12,
-	12, 13, 12, 12,
-	12, 13, 13, 12,
-	13, 12, 11, 10,
-	0, 1, 2, 3,
-	4, 5, 6, 7,
-	8, 9, 10, 11,
-	12, 13, 12, 12,
-	13, 10, 11, 10,
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0
-};
-
-void DarkseedEngine::keeperanim() {
-	_cursor.showCursor(false);
-	_player->loadAnimations("keeper.nsp");
-	showFullscreenPic("keeper.pic");
-	_animation->_animIndexTbl[0] = 0;
-	_animation->_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
-
-	_console->printTosText(913);
-
-	uint8 dialogIdx = 73;
-	uint8 lipsIdx = 0;
-	while (_sound->isPlayingSpeech() || dialogIdx < 76) {
-		_sprites.clearSpriteDrawList();
-
-		if (_fullscreenPic) {
-			_fullscreenPic->draw(0x45, 0x28);
-		}
-		_animation->advanceAnimationFrame(0);
-		const Sprite &keeperSprite = _player->_animations.getSpriteAt(keeperList[lipsIdx]);
-		g_engine->_sprites.addSpriteToDrawList(254, 117, &keeperSprite, 255, keeperSprite._width, keeperSprite._height, false);
-		_sprites.drawSprites();
-
-		_console->draw();
-		_screen->makeAllDirty();
-		_screen->update();
-
-		lipsIdx++;
-		if (lipsIdx == 250) {
-			lipsIdx = 0;
-		}
-
-		if (!_sound->isPlayingSpeech()) {
-			dialogIdx++;
-			if (dialogIdx == 74) {
-				_console->printTosText(914);
-			} else if (dialogIdx == 75) {
-				_console->printTosText(915);
-			}
-		}
-		waitxticks(1);
-	}
-	removeFullscreenPic();
-	_cursor.showCursor(true);
-}
-
-void DarkseedEngine::stuffPlayer() {
-	_cursor.showCursor(false);
-	_player->loadAnimations("labparts.nsp");
-	showFullscreenPic("lab.pic");
-	const Sprite &alienSprite = _player->_animations.getSpriteAt(8);
-
-	bool updateCounter = false;
-	int counter = 0;
-	while (counter < 8) {
-		_sprites.clearSpriteDrawList();
-
-		if (_fullscreenPic) {
-			_fullscreenPic->draw(0x45, 0x28);
-		}
-		const Sprite &mikeSprite = _player->_animations.getSpriteAt(counter);
-		g_engine->_sprites.addSpriteToDrawList(103, 93, &mikeSprite, 255, mikeSprite._width, mikeSprite._height, false);
-		g_engine->_sprites.addSpriteToDrawList(226, 100, &alienSprite, 255, alienSprite._width, alienSprite._height, false);
-
-		_sprites.drawSprites();
-
-		_console->draw();
-		_screen->makeAllDirty();
-		_screen->update();
-
-		updateCounter = !updateCounter;
-		if (updateCounter) {
-			counter++;
-		}
-		waitxticks(1);
-	}
-	waitxticks(3);
-	removeFullscreenPic();
-	_sprites.clearSpriteDrawList();
-	_cursor.showCursor(true);
-	_cutscene.play('Z');
-}
-
-static constexpr uint8 sargoList[100] = {
-	0, 1, 2, 3,
-	4, 3, 2, 1,
-	0, 1, 0, 1,
-	2, 3, 2, 3,
-	2, 3, 2, 1,
-	0, 1, 2, 3,
-	4, 3, 4, 3,
-	2, 1, 0, 1,
-	2, 3, 4, 3,
-	2, 1, 0, 1,
-	0, 1, 2, 3,
-	2, 3, 2, 3,
-	2, 1, 0, 1,
-	2, 3, 2, 1,
-	0, 4, 3, 2,
-	1, 1, 2, 3,
-	4, 3, 2, 1,
-	0, 1, 0, 1,
-	2, 3, 2, 3,
-	2, 3, 2, 1,
-	2, 1, 0, 0,
-	1, 2, 3, 2,
-	1, 0, 1, 2,
-	3, 4, 3, 2,
-	3, 2, 1, 1
-};
-
-void DarkseedEngine::sargoanim() {
-	_cursor.showCursor(false);
-	_player->loadAnimations("sargo.nsp");
-	showFullscreenPic("sargo.pic");
-	_animation->_animIndexTbl[0] = 0;
-	_animation->_spriteAnimCountdownTimer[0] = _player->_animations.getAnimAt(0)._frameDuration[0];
-
-	_console->printTosText(916);
-
-	uint8 dialogIdx = 79;
-	uint8 lipsIdx = 0;
-	while (_sound->isPlayingSpeech() || dialogIdx < 81) {
-		_sprites.clearSpriteDrawList();
-
-		if (_fullscreenPic) {
-			_fullscreenPic->draw(0x45, 0x28);
-		}
-		_animation->advanceAnimationFrame(0);
-		const Sprite &sargoSprite = _player->_animations.getSpriteAt(sargoList[lipsIdx]);
-		g_engine->_sprites.addSpriteToDrawList(334, 160, &sargoSprite, 255, sargoSprite._width, sargoSprite._height, false);
-		_sprites.drawSprites();
-
-		_console->draw();
-		_screen->makeAllDirty();
-		_screen->update();
-
-		lipsIdx++;
-		if (lipsIdx == 100) {
-			lipsIdx = 0;
-		}
-
-		if (!_sound->isPlayingSpeech()) {
-			dialogIdx++;
-			if (dialogIdx == 80) {
-				_console->printTosText(917);
-			}
-		}
-		waitxticks(1);
-	}
-	removeFullscreenPic();
-	_cursor.showCursor(true);
-}
-
 void DarkseedEngine::removeFullscreenPic() {
 	if (_fullscreenPic) {
 		delete _fullscreenPic;
@@ -2920,7 +2566,6 @@ void DarkseedEngine::newGame() {
 	} else if (_currentDay == 3) {
 		_console->printTosText(0xe);
 	}
-
 }
 
 } // End of namespace Darkseed
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index 2256a4407a6..e74416975aa 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -151,6 +151,10 @@ public:
 
 	void wongame();
 
+	void removeFullscreenPic();
+
+	void wait();
+
 public:
 	DarkseedEngine(OSystem *syst, const ADGameDescription *gameDesc);
 	~DarkseedEngine() override;
@@ -221,17 +225,15 @@ public:
 	void updateDisplay();
 	void debugTeleportToRoom(int newRoomNumber, int entranceNumber);
 	void showFullscreenPic(const Common::Path &filename);
+	void drawFullscreenPic();
 	void lookCode(int objNum);
 	void handleObjCollision(int targetObjNum);
 	void playSound(int16 unk, uint8 unk1, int16 unk2);
 	void nextFrame(int nspAminIdx);
-	void stuffPlayer();
-	void dcopanim();
 
 	void throwmikeinjail();
 	void runObjects();
 	void getPackageObj(int packageType);
-	void libanim(bool pickingUpReservedBook);
 	void printTime();
 	void changeToRoom(int newRoomNumber, bool placeDirectly = false);
 	void waitxticks(int ticks);
@@ -241,13 +243,9 @@ private:
 	void gameloop();
 	void updateEvents();
 	void handleInput();
-	void wait();
 	void handlePointerAction();
 	void loadRoom(int roomNumber);
 
-	void keeperanim();
-	void sargoanim();
-
 	void gotosleepinjail();
 
 	void updateHeadache();
@@ -257,8 +255,6 @@ private:
 	void rundrekethsequence();
 	void delthrowstick(int16 spriteNum);
 	void leavepackage();
-
-	void removeFullscreenPic();
 };
 
 extern DarkseedEngine *g_engine;
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 8f195898cb5..e4395e9e1d1 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -843,7 +843,7 @@ void Room::runRoomObjects() {
 						g_engine->_objectVar[79] = 3;
 					}
 					if (g_engine->_objectVar[79] == 2) {
-						g_engine->stuffPlayer();
+						g_engine->_animation->stuffPlayer();
 					}
 				}
 			} else {
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index df1bcfd7dae..5c8c6e1a310 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -1098,7 +1098,7 @@ void UseCode::useCodeLibraryCard(int16 targetObjNum) {
 	if (targetObjNum == 46) {
 		g_engine->_cursor.setCursorType(Pointer);
 		_inventory.removeItem(10);
-		g_engine->libanim(false);
+		g_engine->_animation->libanim(false);
 		_objectVar[10] = 1;
 	} else if (targetObjNum == 113) {
 		putobjunderpillow(10);


Commit: b8e571a0ea51096ff77b38d395ad8883239e735c
    https://github.com/scummvm/scummvm/commit/b8e571a0ea51096ff77b38d395ad8883239e735c
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix whitespace in some case statements.

Changed paths:
    engines/darkseed/animation.cpp
    engines/darkseed/darkseed.cpp
    engines/darkseed/player.cpp


diff --git a/engines/darkseed/animation.cpp b/engines/darkseed/animation.cpp
index 469c07a624f..8f30880b0b6 100644
--- a/engines/darkseed/animation.cpp
+++ b/engines/darkseed/animation.cpp
@@ -73,19 +73,19 @@ void Animation::setupOtherNspAnimation(int nspAnimIdx, int animId) {
 	case 65:
 		_scaleSequence = 1;
 		break;
-	case 6 : // stairs
+	case 6: // stairs
 		_nsp_sprite_scaling_y_position = 0xbe;
 		_scaleSequence = true;
 		break;
-	case 7 : // stairs down
+	case 7: // stairs down
 		_nsp_sprite_scaling_y_position = 0xbe;
 		_scaleSequence = true;
 		break;
-	case 8 :
+	case 8:
 		_player->_position.x = 249;
 		_player->_position.y = 92;
 		break;
-	case 16 :
+	case 16:
 		_player->_position.x = 324;
 		_player->_position.y = 50;
 		break;
@@ -158,7 +158,7 @@ void Animation::updateAnimation() {
 	switch (_otherNspAnimationType_maybe) {
 	case 0:
 		break;
-	case 1 : // sleep wake anim
+	case 1: // sleep wake anim
 		advanceAnimationFrame(0);
 		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
@@ -693,31 +693,31 @@ void Animation::updateAnimation() {
 			g_engine->playSound(42, 5, -1);
 		}
 		break;
-	case 53 :
-	case 54 :
-	case 55 :
-	case 56 :
+	case 53:
+	case 54:
+	case 55:
+	case 56:
 		advanceAnimationFrame((_otherNspAnimationType_maybe - 53) & 1);
 		if (!_objRestarted) {
 			_player->_frameIdx = _player->_animations.getAnimAt(0)._frameNo[_player->_animations.getAnimAt(0)._frameNo[_animIndexTbl[0]]];
 		} else {
 			switch (_otherNspAnimationType_maybe) {
-			case 53 :
+			case 53:
 				g_engine->_previousRoomNumber = g_engine->_room->_roomNumber;
 				g_engine->changeToRoom(6);
 				break;
-			case 54 :
+			case 54:
 				_player->_position.x = 322;
 				_player->_position.y = 220;
 				_player->_walkTarget = _player->_position;
 				_player->_direction = 2;
 				_player->updateSprite();
 				break;
-			case 55 :
+			case 55:
 				g_engine->_previousRoomNumber = g_engine->_room->_roomNumber;
 				g_engine->changeToRoom(15);
 				break;
-			case 56 :
+			case 56:
 				_player->_position.x = 162;
 				_player->_position.y = 206;
 				_player->_walkTarget = _player->_position;
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 0ebe15381f3..987712c8c06 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1640,9 +1640,6 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 	}
 }
 
-
-
-
 void DarkseedEngine::lookCode(int objNum) {
 	if (objNum == 71 && _objectVar[71] == 2) {
 		_console->addTextLine("You see the car keys in the ignition.");
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 3684fe84d11..c6be694cad0 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -96,22 +96,22 @@ void Player::changeDirection(int16 oldDir, int16 newDir) {
 		_playerWalkFrameDeltaOffset = 1;
 		if (oldDir < 4) {
 			switch (oldDir) {
-			case 0 :
+			case 0:
 				if (newDir == 3) {
 					_playerWalkFrameDeltaOffset = -1;
 				}
 				break;
-			case 1 :
+			case 1:
 				if (newDir == 0) {
 					_playerWalkFrameDeltaOffset = -1;
 				}
 				break;
-			case 2 :
+			case 2:
 				if (newDir == 1) {
 					_playerWalkFrameDeltaOffset = -1;
 				}
 				break;
-			case 3 :
+			case 3:
 				if (newDir == 2) {
 					_playerWalkFrameDeltaOffset = -1;
 				}


Commit: 4f55a0a223c2852593b6d0d0d9e57be02cc78eb4
    https://github.com/scummvm/scummvm/commit/4f55a0a223c2852593b6d0d0d9e57be02cc78eb4
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix array formatting, clean up some types. Added better implementation of array reverse.

Changed paths:
    engines/darkseed/animation.cpp
    engines/darkseed/console.cpp
    engines/darkseed/pic.h
    engines/darkseed/player.cpp
    engines/darkseed/room.cpp
    engines/darkseed/usecode.cpp


diff --git a/engines/darkseed/animation.cpp b/engines/darkseed/animation.cpp
index 8f30880b0b6..609db394d85 100644
--- a/engines/darkseed/animation.cpp
+++ b/engines/darkseed/animation.cpp
@@ -986,11 +986,11 @@ static constexpr uint8 keeperList[250] = {
 	11, 10, 10, 11,
 	12, 13, 12, 12,
 	13, 10, 11, 10,
-	0, 0, 1, 1,
-	2, 2, 3, 3,
-	4, 4, 5, 5,
-	6, 6, 7, 7,
-	8, 8, 9, 9,
+	 0,  0,  1,  1,
+	 2,  2,  3,  3,
+	 4,  4,  5,  5,
+	 6,  6,  7,  7,
+	 8,  8,  9,  9,
 	10, 10, 11, 11,
 	12, 12, 11, 12,
 	12, 13, 12, 12,
@@ -1026,14 +1026,14 @@ static constexpr uint8 keeperList[250] = {
 	12, 13, 12, 12,
 	12, 13, 13, 12,
 	13, 12, 11, 10,
-	0, 1, 2, 3,
-	4, 5, 6, 7,
-	8, 9, 10, 11,
+	 0,  1,  2,  3,
+	 4,  5,  6,  7,
+	 8,  9, 10, 11,
 	12, 13, 12, 12,
 	13, 10, 11, 10,
-	0, 0, 0, 0,
-	0, 0, 0, 0,
-	0, 0
+	 0,  0,  0,  0,
+	 0,  0,  0,  0,
+	 0,  0
 };
 
 void Animation::keeperanim() {
@@ -1117,31 +1117,31 @@ void Animation::stuffPlayer() {
 }
 
 static constexpr uint8 libList[100] = {
-	5, 6, 7, 8,
-	9, 10, 9, 8,
-	7, 6, 5, 6,
-	7, 6, 7, 8,
-	7, 6, 5, 6,
-	5, 6, 7, 8,
-	9, 10, 9, 8,
-	7, 6, 5, 6,
-	7, 6, 7, 8,
-	7, 6, 5, 6,
-	5, 6, 7, 8,
-	9, 10, 9, 8,
-	7, 6, 5, 6,
-	5, 6, 7, 6,
-	7, 8, 7, 6,
-	5, 6, 7, 6,
-	7, 8, 7, 6,
-	5, 6, 5, 6,
-	5, 6, 7, 6,
-	7, 8, 7, 6,
-	5, 6, 7, 8,
-	9, 10, 9, 8,
-	7, 6, 5, 6,
-	7, 8, 9, 10,
-	9, 8, 7, 6
+	5,  6, 7,  8,
+	9, 10, 9,  8,
+	7,  6, 5,  6,
+	7,  6, 7,  8,
+	7,  6, 5,  6,
+	5,  6, 7,  8,
+	9, 10, 9,  8,
+	7,  6, 5,  6,
+	7,  6, 7,  8,
+	7,  6, 5,  6,
+	5,  6, 7,  8,
+	9, 10, 9,  8,
+	7,  6, 5,  6,
+	5,  6, 7,  6,
+	7,  8, 7,  6,
+	5,  6, 7,  6,
+	7,  8, 7,  6,
+	5,  6, 5,  6,
+	5,  6, 7,  6,
+	7,  8, 7,  6,
+	5,  6, 7,  8,
+	9, 10, 9,  8,
+	7,  6, 5,  6,
+	7,  8, 9, 10,
+	9,  8, 7,  6
 };
 
 void Animation::libanim(bool pickingUpReservedBook) {
diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index e5770ca5c90..aa1e3049b3e 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -36,7 +36,7 @@ Console::Console(TosText *tosText, Sound *sound) : _tosText(tosText), _sound(sou
 
 void Console::printTosText(int tosIndex) {
 	const Common::String &text = _tosText->getText(tosIndex);
-	debug(text.c_str());
+	debug("%s", text.c_str());
 	addLine(" ");
 	addTextLine(text);
 	_sound->playTosSpeech(tosIndex);
@@ -78,7 +78,7 @@ Common::StringArray Console::wrapText(const Common::String &text) {
 	Common::String word;
 	int lineLength = 0;
 
-	for (unsigned int i = 0; i < text.size(); i++) {
+	for (int i = 0; i < text.size(); i++) {
 		if (text[i] != '\r') {
 			word += text[i];
 		}
diff --git a/engines/darkseed/pic.h b/engines/darkseed/pic.h
index 097b2716271..34923c9c868 100644
--- a/engines/darkseed/pic.h
+++ b/engines/darkseed/pic.h
@@ -25,7 +25,6 @@
 #include "common/array.h"
 #include "common/file.h"
 #include "common/rect.h"
-#include "common/scummsys.h"
 
 namespace Darkseed {
 
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index c6be694cad0..fb4ef7ce625 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -405,15 +405,8 @@ void Player::draw() {
 }
 
 void Player::reverseConnectorList() {
-	Common::Array<Common::Point> tempList;
-	tempList.resize(_numConnectorsInWalkPath);
-
-	for (int i = 0; i < _numConnectorsInWalkPath; i++) {
-		tempList[i] = _connectorList[_numConnectorsInWalkPath - 1 - i];
-	}
-
-	for (int i = 0; i < _numConnectorsInWalkPath; i++) {
-		_connectorList[i] = tempList[i];
+	for (int i = 0; i < _numConnectorsInWalkPath / 2; i++) {
+		SWAP(_connectorList[i], _connectorList[_numConnectorsInWalkPath - 1 - i]);
 	}
 }
 
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index e4395e9e1d1..79993a6334e 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -59,9 +59,9 @@ Room::Room(int roomNumber) : _roomNumber(roomNumber) {
 }
 
 void Room::initRoom() {
-	for (int iVar1 = 0; iVar1 < 30; iVar1 = iVar1 + 1) {
-		_locObjFrame[iVar1] = 0;
-		g_engine->_animation->_animIndexTbl[iVar1] = 0;
+	for (int i = 0; i < 30; i++) {
+		_locObjFrame[i] = 0;
+		g_engine->_animation->_animIndexTbl[i] = 0;
 	}
 	if (g_engine->_objectVar[141] == 10) {
 		g_engine->_objectVar[141] = 11;
@@ -703,7 +703,7 @@ static const uint8 room_sprite_related_2c85_4303[] = {
 	20,            15,            25,            30,
 	20,            20,            30,            40,
 	40,            60,            20,            15,
-	5,            20,            10,            35,
+	 5,            20,            10,            35,
 	40,            15,            45,            10,
 	34,            20,            25,             5,
 	15,            25,            10,            10,
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 5c8c6e1a310..9cca32e03ba 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -1759,4 +1759,4 @@ void UseCode::startdigging(int16 targetObjNum) {
 	g_engine->playSound(14, 5, -1);
 }
 
-}
\ No newline at end of file
+} // End of namespace Darkseed


Commit: 7082c41de3f14b3f30d2b087bb59b6437523ab80
    https://github.com/scummvm/scummvm/commit/7082c41de3f14b3f30d2b087bb59b6437523ab80
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Fix naming for style guide

Changed paths:
    engines/darkseed/cutscene.cpp


diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index adde97e79e8..b9312e1b793 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -91,7 +91,7 @@ void Cutscene::update() {
 	}
 }
 
-static constexpr int _CREDITS_DELAY = 25;
+static constexpr int CREDITS_DELAY = 25;
 
 bool Cutscene::introScene() {
 	switch (_movieStep) {
@@ -238,7 +238,7 @@ bool Cutscene::introScene() {
 		break;
 	}
 	case 25:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -248,7 +248,7 @@ bool Cutscene::introScene() {
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 27:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -262,7 +262,7 @@ bool Cutscene::introScene() {
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 29:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -275,7 +275,7 @@ bool Cutscene::introScene() {
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 31:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -288,7 +288,7 @@ bool Cutscene::introScene() {
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 33:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -302,7 +302,7 @@ bool Cutscene::introScene() {
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 35:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -314,7 +314,7 @@ bool Cutscene::introScene() {
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 37:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -326,7 +326,7 @@ bool Cutscene::introScene() {
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 39:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -338,7 +338,7 @@ bool Cutscene::introScene() {
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 41:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -350,7 +350,7 @@ bool Cutscene::introScene() {
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 43:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -362,7 +362,7 @@ bool Cutscene::introScene() {
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 45:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -376,7 +376,7 @@ bool Cutscene::introScene() {
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 47:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;
@@ -388,7 +388,7 @@ bool Cutscene::introScene() {
 		g_engine->_screen->makeAllDirty();
 		break;
 	case 49:
-		if (waitTime(_CREDITS_DELAY)) {
+		if (waitTime(CREDITS_DELAY)) {
 			return true;
 		}
 		break;


Commit: f3ec14a93ff4a1735bd53e4685eb1aa451e50438
    https://github.com/scummvm/scummvm/commit/f3ec14a93ff4a1735bd53e4685eb1aa451e50438
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Sort module.mk alphabetically

Changed paths:
    engines/darkseed/module.mk


diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
index bf7c55e5c15..4a36874ef67 100644
--- a/engines/darkseed/module.mk
+++ b/engines/darkseed/module.mk
@@ -1,28 +1,28 @@
 MODULE := engines/darkseed
 
 MODULE_OBJS = \
+	animation.o \
+	anm.o \
+	console.o \
+	cursor.o \
+	cutscene.o \
 	darkseed.o \
 	debugconsole.o \
-	console.o \
-	anm.o \
+	gamefont.o \
 	img.o \
+	inventory.o \
+	metaengine.o \
 	nsp.o \
-	pic.o \
+	objects.o \
 	pal.o \
-	titlefont.o \
-	gamefont.o \
-	tostext.o \
-	metaengine.o \
-	room.o \
-	cursor.o \
+	pic.o \
 	player.o \
-	sprites.o \
-	objects.o \
-	inventory.o \
+	room.o \
 	sound.o \
-	usecode.o \
-	cutscene.o \
-	animation.o
+	sprites.o \
+	titlefont.o \
+	tostext.o \
+	usecode.o
 
 # This module can be built as a plugin
 ifeq ($(ENABLE_DARKSEED), DYNAMIC_PLUGIN)


Commit: 49b69cd5b1998580d87a953df9c08f6a9d513055
    https://github.com/scummvm/scummvm/commit/49b69cd5b1998580d87a953df9c08f6a9d513055
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Rename ActionMode values to respect style convention. Remove unnecessary includes. Use typedefs

Changed paths:
    engines/darkseed/darkseed.cpp
    engines/darkseed/darkseed.h
    engines/darkseed/detection.cpp
    engines/darkseed/detection.h
    engines/darkseed/gamefont.cpp
    engines/darkseed/inventory.cpp
    engines/darkseed/player.cpp
    engines/darkseed/room.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 987712c8c06..05d49aab9c5 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -497,7 +497,7 @@ void DarkseedEngine::handleInput() {
 					_player->updateSprite();
 				}
 				if (_isLeftMouseClicked && _cursor.getY() > 0x28 && !_player->_actionToPerform) { // prevLeftMouseButtonState == 0 &&
-					if (_actionMode == PointerAction) {
+					if (_actionMode == kPointerAction) {
 						_player->calculateWalkTarget();
 						_player->playerFaceWalkTarget();
 					} else {
@@ -537,12 +537,12 @@ void DarkseedEngine::handleInput() {
 							} else if (objNum == 51 || objNum == 187) {
 								_player->_sequenceRotation = 1;
 								_cursor.updatePosition(380, 211);
-							} else if (objNum == 116 && _actionMode == Unk19Action) {
+							} else if (objNum == 116 && _actionMode == kUseStickAction) {
 								_player->_sequenceRotation = 1;
 								_cursor.updatePosition(285, 233);
 							} else if (objNum == 137) {
 								_player->_sequenceRotation = 1;
-								if (_actionMode == Unk27Action) {
+								if (_actionMode == kUseHammerAction) {
 									_cursor.updatePosition(354, 175);
 								} else {
 									_cursor.updatePosition(409, 173);
@@ -567,7 +567,7 @@ void DarkseedEngine::handleInput() {
 								}
 							}
 
-							if (objNum == 102 && _objectVar[23] != 0 && _actionMode == HandAction) {
+							if (objNum == 102 && _objectVar[23] != 0 && _actionMode == kHandAction) {
 								_player->_sequenceRotation = 0;
 								_cursor.updatePosition(331, 195);
 							} else if (objNum < 104 || objNum > 108) {
@@ -608,14 +608,14 @@ void DarkseedEngine::handleInput() {
 				int yDistToTarget = ABS(_player->_walkTarget.y - _player->_position.y);
 
 				if (_isRightMouseClicked && !_player->_actionToPerform) {
-					if (_actionMode == LookAction) {
-						_actionMode = PointerAction;
-					} else if (_actionMode == PointerAction) {
-						_actionMode = HandAction;
-					} else if (_actionMode == HandAction) {
-						_actionMode = LookAction;
+					if (_actionMode == kLookAction) {
+						_actionMode = kPointerAction;
+					} else if (_actionMode == kPointerAction) {
+						_actionMode = kHandAction;
+					} else if (_actionMode == kHandAction) {
+						_actionMode = kLookAction;
 					} else {
-						_actionMode = PointerAction;
+						_actionMode = kPointerAction;
 					}
 					_cursor.setCursorType((CursorType)_actionMode);
 				}
@@ -814,12 +814,12 @@ void DarkseedEngine::handleInput() {
 					if (objIdx == -1) {
 						_console->printTosText(938);
 						if (_actionMode > 3) {
-							_actionMode = PointerAction;
+							_actionMode = kPointerAction;
 							_cursor.setCursorType((CursorType)_actionMode);
 						}
 					} else {
 						if (_actionMode > 3) {
-							_actionMode = PointerAction;
+							_actionMode = kPointerAction;
 							_cursor.setCursorType((CursorType)_actionMode);
 						}
 					}
@@ -1452,8 +1452,8 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 	if (targetObjNum == 35 && _objectVar[22] < 2 && _cursor.getY() > 40) {
 		targetObjNum = 22;
 	}
-	if (_actionMode == LookAction || _actionMode == HandAction || targetObjNum != 115) {
-		if (_cursor.getY() < 40 && _actionMode > LookAction) {
+	if (_actionMode == kLookAction || _actionMode == kHandAction || targetObjNum != 115) {
+		if (_cursor.getY() < 40 && _actionMode > kLookAction) {
 			if (_objectVar[80] < 2 ||
 				((_actionMode != 25 || targetObjNum != 19) && (_actionMode != 19 || targetObjNum != 25))) {
 				if ((_actionMode == 25 && targetObjNum == 20) || (_actionMode == 20 && targetObjNum == 25)) {
@@ -1477,10 +1477,10 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
 			return;
 		} else {
 			switch (_actionMode) {
-			case HandAction:
+			case kHandAction:
 				_useCode->useCode(targetObjNum);
 				break;
-			case LookAction:
+			case kLookAction:
 				lookCode(targetObjNum);
 				break;
 			case 5:
@@ -1898,7 +1898,7 @@ void DarkseedEngine::showFullscreenPic(const Common::Path &filename) {
 	if (!_fullscreenPic->load(filename)) {
 		delete _fullscreenPic;
 		_fullscreenPic = nullptr;
-		error("Failed to load %s", filename.toString().c_str());
+		error("DarkseedEngine::showFullscreenPic(): Failed to load %s", filename.toString().c_str());
 	}
 	Common::String filePathStr = filename.toString();
 	debug("Loaded %s", filePathStr.c_str());
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index e74416975aa..dc630b0f01e 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -54,11 +54,11 @@ namespace Darkseed {
 struct DarkseedGameDescription;
 
 enum ActionMode : uint8 {
-	PointerAction = 0,
-	HandAction = 2,
-	LookAction = 3,
-	Unk19Action = 19,
-	Unk27Action = 27,
+	kPointerAction = 0,
+	kHandAction = 2,
+	kLookAction = 3,
+	kUseStickAction = 19,
+	kUseHammerAction = 27,
 };
 
 enum class FadeDirection : uint8 {
@@ -101,7 +101,7 @@ public:
 	TosText *_tosText = nullptr;
 	Console *_console = nullptr;
 	Room *_room = nullptr;
-	int _actionMode = PointerAction;
+	int _actionMode = kPointerAction;
 	Player *_player = nullptr;
 	Sprites _sprites;
 	Objects _objectVar;
diff --git a/engines/darkseed/detection.cpp b/engines/darkseed/detection.cpp
index 39ccbbf73c2..947bfa20c5b 100644
--- a/engines/darkseed/detection.cpp
+++ b/engines/darkseed/detection.cpp
@@ -20,12 +20,8 @@
  */
 
 #include "base/plugins.h"
-#include "common/config-manager.h"
 #include "common/file.h"
-#include "common/md5.h"
-#include "common/str-array.h"
 #include "common/translation.h"
-#include "common/util.h"
 #include "darkseed/detection.h"
 #include "darkseed/detection_tables.h"
 
diff --git a/engines/darkseed/detection.h b/engines/darkseed/detection.h
index 36c7e3a3a5d..324960379d5 100644
--- a/engines/darkseed/detection.h
+++ b/engines/darkseed/detection.h
@@ -27,11 +27,11 @@
 namespace Darkseed {
 
 enum DarkseedDebugChannels {
-	kDebugGraphics = 1 << 0,
-	kDebugPath     = 1 << 1,
-	kDebugScan     = 1 << 2,
-	kDebugFilePath = 1 << 3,
-	kDebugScript   = 1 << 4,
+	kDebugGraphics = 1,
+	kDebugPath,
+	kDebugScan,
+	kDebugFilePath,
+	kDebugScript,
 };
 
 extern const PlainGameDescriptor darkseedGames[];
diff --git a/engines/darkseed/gamefont.cpp b/engines/darkseed/gamefont.cpp
index de1c8cf4a6a..f4d690fd245 100644
--- a/engines/darkseed/gamefont.cpp
+++ b/engines/darkseed/gamefont.cpp
@@ -33,7 +33,7 @@ bool GameFont::load() {
 }
 
 void GameFont::displayString(uint16 x, uint16 y, const Common::String &text) {
-	for (unsigned int i = 0; i < text.size(); i++) {
+	for (uint i = 0; i < text.size(); i++) {
 		auto letter = getCharacterSprite(text[i]);
 		if (letter) {
 			letter->draw(x, y);
@@ -44,7 +44,7 @@ void GameFont::displayString(uint16 x, uint16 y, const Common::String &text) {
 
 int GameFont::stringLength(const Common::String &text) {
 	int width = 0;
-	for (unsigned int i = 0; i < text.size(); i++) {
+	for (uint i = 0; i < text.size(); i++) {
 		const Sprite *sprite = getCharacterSprite(text[i]);
 		if (sprite) {
 			width += sprite->_width + 1;
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 7f18349aea3..8eff0b4ec2b 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -150,10 +150,10 @@ void Inventory::handleClick() {
 			   (g_engine->_actionMode == 20 && icon == 25)
 			   ) {
 		g_engine->handleObjCollision(icon);
-	} else if (g_engine->_actionMode == HandAction && icon == 35) {
+	} else if (g_engine->_actionMode == kHandAction && icon == 35) {
 		g_engine->_objectVar[35] = 0x7080;
 		g_engine->_console->printTosText(669);
-	} else if (g_engine->_actionMode == LookAction) {
+	} else if (g_engine->_actionMode == kLookAction) {
 		g_engine->lookCode(icon);
 	} else {
 		g_engine->_actionMode = icon;
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index fb4ef7ce625..03ea31dcc9a 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -159,7 +159,7 @@ void Player::calculateWalkTarget() {
 	_walkPathIndex = -1;
 	_numConnectorsInWalkPath = 0;
 	int selectedObjNum = 0;
-	if (g_engine->_actionMode == PointerAction) {
+	if (g_engine->_actionMode == kPointerAction) {
 		selectedObjNum = g_engine->_room->getRoomExitAtCursor();
 	}
 
diff --git a/engines/darkseed/room.cpp b/engines/darkseed/room.cpp
index 79993a6334e..fca7b8a7629 100644
--- a/engines/darkseed/room.cpp
+++ b/engines/darkseed/room.cpp
@@ -235,7 +235,7 @@ void Room::draw() {
 
 int Room::checkCursorAndMoveableObjects() {
 	int actionMode = g_engine->_actionMode;
-	const Sprite &cursorSprite = (actionMode == LookAction)
+	const Sprite &cursorSprite = (actionMode == kLookAction)
 									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
 									 : g_engine->_cursor.getSprite();
 	bool hasObject = false;
@@ -271,7 +271,7 @@ int Room::checkCursorAndMoveableObjects() {
 
 int Room::checkCursorAndStaticObjects(int x, int y) {
 	int actionMode = g_engine->_actionMode;
-	const Sprite &cursorSprite = (actionMode == LookAction)
+	const Sprite &cursorSprite = (actionMode == kLookAction)
 									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
 									 : g_engine->_cursor.getSprite();
 	bool hasObject = false;
@@ -283,11 +283,11 @@ int Room::checkCursorAndStaticObjects(int x, int y) {
 			&& _roomObj[i].yOffset <= cursorSprite._height + g_engine->_cursor.getY()
 			&& g_engine->_cursor.getY() <= _roomObj[i].height + _roomObj[i].yOffset
 		) {
-			if (actionMode != PointerAction && _roomObj[i].objNum >= 5) {
+			if (actionMode != kPointerAction && _roomObj[i].objNum >= 5) {
 				hasObject = true;
 			}
 
-			if (actionMode == PointerAction && _roomObj[i].objNum < 6) {
+			if (actionMode == kPointerAction && _roomObj[i].objNum < 6) {
 				hasObject = true;
 			}
 
@@ -321,7 +321,7 @@ int Room::checkCursorAndStaticObjects(int x, int y) {
 
 int Room::CheckCursorAndMovedObjects() {
 	int actionMode = g_engine->_actionMode;
-	const Sprite &cursorSprite = (actionMode == LookAction)
+	const Sprite &cursorSprite = (actionMode == kLookAction)
 									 ? g_engine->_cursor.getSpriteForType(ExclamationMark)
 									 : g_engine->_cursor.getSprite();
 	_collisionType = 1;
@@ -355,7 +355,7 @@ int Room::CheckCursorAndMovedObjects() {
 }
 
 void Room::update() {
-	if (g_engine->_actionMode == HandAction || g_engine->_actionMode > 4) {
+	if (g_engine->_actionMode == kHandAction || g_engine->_actionMode > 4) {
 		int moveableObj = checkCursorAndMoveableObjects();
 		if (moveableObj == -1) {
 			int objectUnderCursor = checkCursorAndStaticObjects(g_engine->_cursor.getX(), g_engine->_cursor.getY());
@@ -372,7 +372,7 @@ void Room::update() {
 		} else {
 			g_engine->_cursor.setCursorType(HandPointing);
 		}
-	} else if (g_engine->_actionMode == LookAction) {
+	} else if (g_engine->_actionMode == kLookAction) {
 		if (checkCursorAndMoveableObjects() != -1 || CheckCursorAndMovedObjects() != -1) {
 			g_engine->_cursor.setCursorType(ExclamationMark);
 		} else {
@@ -384,7 +384,7 @@ void Room::update() {
 			}
 		}
 	} else {
-		if (g_engine->_actionMode != PointerAction) {
+		if (g_engine->_actionMode != kPointerAction) {
 			g_engine->_cursor.setCursorType(Pointer);
 		}
 


Commit: a91b50f4f76e61dc1e081c9790c34a3f8cc7b6b3
    https://github.com/scummvm/scummvm/commit/a91b50f4f76e61dc1e081c9790c34a3f8cc7b6b3
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Change GameFont to extend Graphics::Font

Changed paths:
    engines/darkseed/console.cpp
    engines/darkseed/console.h
    engines/darkseed/gamefont.cpp
    engines/darkseed/gamefont.h
    engines/darkseed/nsp.cpp
    engines/darkseed/nsp.h


diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index aa1e3049b3e..64e9e0a745e 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -43,7 +43,8 @@ void Console::printTosText(int tosIndex) {
 }
 
 void Console::addTextLine(const Common::String &text) {
-	auto lines = wrapText(text);
+	Common::StringArray lines;
+	_font.wordWrapText(text, consoleArea.width(), lines);
 	for (auto &line : lines) {
 		addLine(line);
 	}
@@ -64,7 +65,7 @@ void Console::draw() {
 	int curIdx = _startIdx == 0 ? _text.size() - 1 : _startIdx - 1;
 	int y = 0x139;
 	for (int i = 0; i < 4 && curIdx != _startIdx && !_text[curIdx].empty(); i++) {
-		_font.displayString(0x70, y, _text[curIdx]);
+		_font.drawString(g_engine->_screen, _text[curIdx], 0x70, y, consoleArea.width(), 0);
 		y -= 11;
 		curIdx = curIdx == 0 ? _text.size() - 1 : curIdx - 1;
 	}
@@ -72,47 +73,6 @@ void Console::draw() {
 	g_engine->_screen->addDirtyRect(consoleArea);
 }
 
-Common::StringArray Console::wrapText(const Common::String &text) {
-	Common::StringArray lines;
-	Common::String line;
-	Common::String word;
-	int lineLength = 0;
-
-	for (int i = 0; i < text.size(); i++) {
-		if (text[i] != '\r') {
-			word += text[i];
-		}
-		if (text[i] == ' ' || text[i] == '\r') {
-			int wordLength = _font.stringLength(word);
-			if (lineLength + wordLength > consoleArea.width()) {
-				lines.push_back(line);
-				line = word;
-				lineLength = wordLength;
-			} else {
-				line += word;
-				lineLength += wordLength;
-			}
-			word = "";
-		}
-		if (text[i] == '\r') {
-			break;
-		}
-	}
-
-	if (!line.empty() || !word.empty()) {
-		int wordLength = _font.stringLength(word);
-		if (lineLength + wordLength > consoleArea.width()) {
-			lines.push_back(line);
-			lines.push_back(word);
-		} else {
-			line += word;
-			lines.push_back(line);
-		}
-	}
-
-	return lines;
-}
-
 void Console::addLine(const Common::String &line) {
 	_text[_startIdx] = line;
 	_startIdx = (_startIdx + 1) % _text.size();
diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
index 09693d037b6..2e1349dbe22 100644
--- a/engines/darkseed/console.h
+++ b/engines/darkseed/console.h
@@ -49,7 +49,6 @@ public:
 	void draw();
 
 private:
-	Common::StringArray wrapText(const Common::String &text);
 	void addLine(const Common::String &line);
 };
 
diff --git a/engines/darkseed/gamefont.cpp b/engines/darkseed/gamefont.cpp
index f4d690fd245..a43975c7f56 100644
--- a/engines/darkseed/gamefont.cpp
+++ b/engines/darkseed/gamefont.cpp
@@ -29,31 +29,14 @@ Darkseed::GameFont::GameFont() {
 }
 
 bool GameFont::load() {
-	return _letters.load("tosfont.nsp");
-}
-
-void GameFont::displayString(uint16 x, uint16 y, const Common::String &text) {
-	for (uint i = 0; i < text.size(); i++) {
-		auto letter = getCharacterSprite(text[i]);
-		if (letter) {
-			letter->draw(x, y);
-			x += letter->_width + 1;
-		}
-	}
-}
-
-int GameFont::stringLength(const Common::String &text) {
-	int width = 0;
-	for (uint i = 0; i < text.size(); i++) {
-		const Sprite *sprite = getCharacterSprite(text[i]);
-		if (sprite) {
-			width += sprite->_width + 1;
-		}
+	if (_letters.load("tosfont.nsp")) {
+		_maxWidth = _letters.getMaxSpriteWidth() + 1;
+		return true;
 	}
-	return width;
+    return false;
 }
 
-const Sprite *GameFont::getCharacterSprite(char c) {
+const Sprite *GameFont::getCharacterSprite(char c) const {
 	int letterIdx = 1000;
 	switch (c) {
 	case 0x20 :
@@ -119,4 +102,24 @@ const Sprite *GameFont::getCharacterSprite(char c) {
 	return nullptr;
 }
 
+int GameFont::getFontHeight() const {
+	return 10;
+}
+
+int GameFont::getMaxCharWidth() const {
+	return _maxWidth;
+}
+
+int GameFont::getCharWidth(uint32 chr) const {
+	auto letter = getCharacterSprite((char)chr);
+	return letter ? letter->_width + 1 : 0;
+}
+
+void GameFont::drawChar(Graphics::Surface *dst, uint32 chr, int x, int y, uint32 color) const {
+	auto letter = getCharacterSprite((char)chr);
+	if (letter) {
+	    letter->draw(dst, x, y);
+	}
+}
+
 } // namespace Darkseed
diff --git a/engines/darkseed/gamefont.h b/engines/darkseed/gamefont.h
index 62f4370e64b..2cc10066b8a 100644
--- a/engines/darkseed/gamefont.h
+++ b/engines/darkseed/gamefont.h
@@ -22,20 +22,28 @@
 #ifndef DARKSEED_GAMEFONT_H
 #define DARKSEED_GAMEFONT_H
 
+#include "graphics/font.h"
 #include "darkseed/nsp.h"
+#include "graphics/surface.h"
+
 namespace Darkseed {
 
-class GameFont {
+class GameFont : public Graphics::Font {
 private:
 	Nsp _letters;
+	int _maxWidth = 0;
 
 public:
 	GameFont();
 	bool load();
-	void displayString(uint16 x, uint16 y, const Common::String &text);
-	int stringLength(const Common::String &text);
+
+	int getFontHeight() const override;
+	int getMaxCharWidth() const override;
+	int getCharWidth(uint32 chr) const override;
+	void drawChar(Graphics::Surface *dst, uint32 chr, int x, int y, uint32 color) const override;
+
 private:
-	const Sprite *getCharacterSprite(char c);
+	const Sprite *getCharacterSprite(char c) const;
 };
 
 } // namespace Darkseed
diff --git a/engines/darkseed/nsp.cpp b/engines/darkseed/nsp.cpp
index dc64d3e5985..62572e4cafc 100644
--- a/engines/darkseed/nsp.cpp
+++ b/engines/darkseed/nsp.cpp
@@ -54,21 +54,34 @@ bool Sprite::loadData(Common::SeekableReadStream &readStream) {
 	return true;
 }
 
-void Sprite::draw(int x, int y, uint16 frameBottom) const {
-	uint16 clippedWidth = _width;
-	uint16 clippedHeight = _height;
+void Sprite::clipToScreen(int x, int y, uint16 frameBottom, uint16 *clippedWidth, uint16 *clippedHeight) const {
+	*clippedWidth = _width;
+	*clippedHeight = _height;
 	if (x + _width > g_engine->_screen->w) {
-		clippedWidth = g_engine->_screen->w - x;
+		*clippedWidth = g_engine->_screen->w - x;
 	}
 	if (frameBottom != 0 && y + _height > g_engine->_frameBottom) {
 		if (y >= frameBottom) {
 			return;
 		}
-		clippedHeight = frameBottom - y;
+		*clippedHeight = frameBottom - y;
 	}
+}
+
+void Sprite::draw(int x, int y, uint16 frameBottom) const {
+	uint16 clippedWidth = _width;
+	uint16 clippedHeight = _height;
+	clipToScreen(x, y, frameBottom, &clippedWidth, &clippedHeight);
 	g_engine->_screen->copyRectToSurfaceWithKey(_pixels.data(), _pitch, x, y, clippedWidth, clippedHeight, 0xf);
 }
 
+void Sprite::draw(Graphics::Surface *dst, int x, int y, uint16 frameBottom) const {
+	uint16 clippedWidth = _width;
+	uint16 clippedHeight = _height;
+	clipToScreen(x, y, frameBottom, &clippedWidth, &clippedHeight);
+	dst->copyRectToSurfaceWithKey(_pixels.data(), _pitch, x, y, clippedWidth, clippedHeight, 0xf);
+}
+
 void Sprite::drawScaled(int destX, int destY, int destWidth, int destHeight, bool flipX) const {
 	//TODO image isn't exactly the same when not scaling. It seems larger by about a pixel.
 	//TODO this logic is pretty messy. It should probably be re-written. It is trying to scale, clip and flip at once.
@@ -169,7 +182,7 @@ bool Nsp::load(Common::SeekableReadStream &readStream) {
 	return true;
 }
 
-const Sprite &Nsp::getSpriteAt(int index) {
+const Sprite &Nsp::getSpriteAt(int index) const {
 	if (index >= (int)_frames.size()) {
 		error("getSpriteAt: Invalid sprite index. %d", index);
 	}
@@ -213,6 +226,16 @@ const Obt &Nsp::getAnimAt(int index) {
 	return _animations[index];
 }
 
+int16 Nsp::getMaxSpriteWidth() {
+	int maxWidth = 0;
+	for (auto &frame : _frames) {
+		if (frame._width > maxWidth) {
+			maxWidth = frame._width;
+		}
+	}
+	return maxWidth;
+}
+
 Obt::Obt() {
 	_numFrames = 0;
 	_deltaX.reserve(20);
diff --git a/engines/darkseed/nsp.h b/engines/darkseed/nsp.h
index ca1777fe9ef..08961adbdb1 100644
--- a/engines/darkseed/nsp.h
+++ b/engines/darkseed/nsp.h
@@ -25,6 +25,7 @@
 #include "common/array.h"
 #include "common/scummsys.h"
 #include "common/file.h"
+#include "graphics/surface.h"
 
 namespace Darkseed {
 
@@ -39,7 +40,10 @@ public:
 	Sprite(uint16 width, uint16 height, uint16 pitch);
 	bool loadData(Common::SeekableReadStream &readStream);
 	void draw(int x, int y, uint16 frameBottom = 0) const;
+	void draw(Graphics::Surface *dst, int x, int y, uint16 frameBottom = 0) const;
 	void drawScaled(int x, int y, int destWidth, int destHeight, bool flipX) const;
+private:
+	void clipToScreen(int x, int y, uint16 frameBottom, uint16 *clippedWidth, uint16 *clippedHeight) const;
 };
 
 class Obt {
@@ -63,11 +67,12 @@ public:
 	bool containsSpriteAt(int index) {
 		return (int)_frames.size() > index;
 	}
-	const Sprite &getSpriteAt(int index);
+	const Sprite &getSpriteAt(int index) const;
 	const Obt &getAnimAt(int index);
 	int16 getTotalAnim() {
 		return (int16)_animations.size();
 	}
+	int16 getMaxSpriteWidth();
 
 private:
 	bool load(Common::SeekableReadStream &readStream);


Commit: 1608d38018ffc62fa5547743d4a6658763dcd569
    https://github.com/scummvm/scummvm/commit/1608d38018ffc62fa5547743d4a6658763dcd569
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Add early returns to input logic to simplify conditional nesting.

Changed paths:
    engines/darkseed/darkseed.cpp


diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 05d49aab9c5..41433e8e676 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -475,296 +475,315 @@ void DarkseedEngine::handleInput() {
 		_animation->setupOtherNspAnimation(1, 5);
 	}
 
-	if (!_animation->_isPlayingAnimation_maybe) {
-		if (!_player->_playerIsChangingDirection) {
-			if (currentRoomNumber == 0x39 && _previousRoomNumber == 0x36) {
-				_player->updateSprite();
-			} else {
-				if (_player->isAtWalkTarget() && !_player->_heroMoving) {
-					_player->updateSprite();
-				} else {
-					if (_counter_2c85_888b >= 0 && !_player->isAtWalkTarget()) {
-						_counter_2c85_888b = 0;
-						_player->_playerWalkFrameIdx = (_player->_playerWalkFrameIdx + 1) % 8;
-						if ((_player->_playerWalkFrameIdx == 0 || _player->_playerWalkFrameIdx == 4)
-							&& currentRoomNumber != 0x22 && currentRoomNumber != 0x13
-							&& currentRoomNumber != 0x14 && currentRoomNumber != 0x15
-							&& currentRoomNumber != 16) {
-							//TODO
-						//							FUN_1208_0dac_sound_related(0x5c,CONCAT11((char)(uVar7 >> 8),5));
-						}
-					}
-					_player->updateSprite();
-				}
-				if (_isLeftMouseClicked && _cursor.getY() > 0x28 && !_player->_actionToPerform) { // prevLeftMouseButtonState == 0 &&
-					if (_actionMode == kPointerAction) {
-						_player->calculateWalkTarget();
-						_player->playerFaceWalkTarget();
-					} else {
-						int roomObjIdx = _room->getObjectUnderCursor();
-						if (roomObjIdx != -1) {
-							// 2022:77ce
-							// TODO walk player to object.
-							_player->_walkToSequence = true;
-							_player->_walkToSequencePoint = _cursor.getPosition();
-							_player->_sequenceRotation = -1;
-							Common::Point currentCursorPos = _cursor.getPosition();
-							int objNum = _room->_roomObj[roomObjIdx].objNum;
-							if (walkToDirTbl[objNum] != 4) {
-								_player->_sequenceRotation = walkToDirTbl[objNum];
-								_cursor.updatePosition(walkToXTbl[objNum], walkToYTbl[objNum]);
-							}
-							if (objNum == 142 && _room->_roomNumber == 2) {
-								_player->_sequenceRotation = 0;
-								_cursor.updatePosition(347, 189);
-							} else if (objNum == 53 && _room->_roomNumber == 15) {
-								_player->_sequenceRotation = 0;
-								_cursor.updatePosition(369, 216);
-							} else if (objNum == 114) {
-								if (_cursor.getX() < 321) {
-									_player->_sequenceRotation = 3;
-									_cursor.updatePosition(169, 178);
-								} else {
-									_player->_sequenceRotation = 1;
-									_cursor.updatePosition(362, 198);
-								}
-							} else if (objNum == 189 || (objNum == 64 && _room->_roomNumber == 30)) {
-								_player->_sequenceRotation = 1;
-								_cursor.updatePosition(405, 208);
-							} else if (objNum == 50 || objNum == 85 || (objNum >= 163 && objNum <= 168)) {
-								_player->_sequenceRotation = 3;
-								_cursor.updatePosition(228, 211);
-							} else if (objNum == 51 || objNum == 187) {
-								_player->_sequenceRotation = 1;
-								_cursor.updatePosition(380, 211);
-							} else if (objNum == 116 && _actionMode == kUseStickAction) {
-								_player->_sequenceRotation = 1;
-								_cursor.updatePosition(285, 233);
-							} else if (objNum == 137) {
-								_player->_sequenceRotation = 1;
-								if (_actionMode == kUseHammerAction) {
-									_cursor.updatePosition(354, 175);
-								} else {
-									_cursor.updatePosition(409, 173);
-								}
-							} else if (objNum == 112 || objNum == 111) {
-								_player->_sequenceRotation = 1;
-								_cursor.updatePosition(464, 191);
-							} else if (objNum == 138 || objNum == 7 || objNum == 152) {
-								_player->_sequenceRotation = 1;
-								_cursor.updatePosition(292, 208);
-							} else if (objNum == 22 || objNum == 42 ||
-									   (objNum == 35 && _objectVar[22] < 2 && _cursor.getY() > 40)) {
-								_player->_sequenceRotation = 1;
-								if (_objectVar[22] == 0 || _objectVar[22] == 1) {
-									_cursor.updatePosition(437, 203);
-								}
-								if (_objectVar[22] == 2) {
-									_cursor.updatePosition(427, 196);
-								}
-								if (_objectVar[22] > 2) {
-									_cursor.updatePosition(394, 175);
-								}
-							}
+	if (_animation->_isPlayingAnimation_maybe) {
+		_animation->updateAnimation();
+		if (!_animation->_isPlayingAnimation_maybe && _player->_isAutoWalkingToBed) {
+			_player->setplayertowardsbedroom();
+		}
+		return;
+	}
 
-							if (objNum == 102 && _objectVar[23] != 0 && _actionMode == kHandAction) {
-								_player->_sequenceRotation = 0;
-								_cursor.updatePosition(331, 195);
-							} else if (objNum < 104 || objNum > 108) {
-								if (objNum == 78) {
-									if (_room->_roomNumber == 2) {
-										_player->_sequenceRotation = 3;
-										_cursor.updatePosition(152, 239);
-									} else {
-										_player->_sequenceRotation = 1;
-										_cursor.updatePosition(497, 220);
-									}
-								} else if (objNum == 59) {
-									if (_room->_roomNumber == 3) {
-										_player->_sequenceRotation = 3;
-										_cursor.updatePosition(145, 239);
-									} else {
-										_player->_sequenceRotation = 1;
-										_cursor.updatePosition(520, 229);
-									}
-								}
-							} else {
-								_player->_sequenceRotation = 3;
-								_cursor.updatePosition(_room->_roomObj[roomObjIdx].xOffset + 30, 206);
-							}
-							if (_room->_roomNumber == 34 || (_room->_roomNumber > 18 && _room->_roomNumber < 24)) {
-								_player->_walkTarget = _player->_position;
-							} else if (_cursor.getPosition() != _player->_position) {
-								_player->calculateWalkTarget();
-							}
+	if (_player->_playerIsChangingDirection) {
+		// turn player around.
+		_player->_playerSpriteWalkIndex_maybe = (int16)((_player->_playerSpriteWalkIndex_maybe + _player->_playerWalkFrameDeltaOffset) & 7);
+		if (_player->_playerSpriteWalkIndex_maybe == _player->_playerNewFacingDirection_maybe) {
+			_player->_playerIsChangingDirection = false;
+			_player->_direction = _player->_playerNewFacingDirection_maybe / 2;
+		}
+		_player->updateSprite();
+		return;
+	}
 
-							_cursor.updatePosition(currentCursorPos.x, currentCursorPos.y);
-							_player->playerFaceWalkTarget();
-							_player->_actionToPerform = true;
-						}
-					}
+	if (currentRoomNumber == 0x39 && _previousRoomNumber == 0x36) {
+		_player->updateSprite();
+		return;
+	}
+
+	if (_player->isAtWalkTarget() && !_player->_heroMoving) {
+		_player->updateSprite();
+	} else {
+		if (_counter_2c85_888b >= 0 && !_player->isAtWalkTarget()) {
+			_counter_2c85_888b = 0;
+			_player->_playerWalkFrameIdx = (_player->_playerWalkFrameIdx + 1) % 8;
+			if ((_player->_playerWalkFrameIdx == 0 || _player->_playerWalkFrameIdx == 4)
+				&& currentRoomNumber != 0x22 && currentRoomNumber != 0x13
+				&& currentRoomNumber != 0x14 && currentRoomNumber != 0x15
+				&& currentRoomNumber != 16) {
+				//TODO
+			//							FUN_1208_0dac_sound_related(0x5c,CONCAT11((char)(uVar7 >> 8),5));
+			}
+		}
+		_player->updateSprite();
+	}
+	if (_isLeftMouseClicked && _cursor.getY() > 0x28 && !_player->_actionToPerform) { // prevLeftMouseButtonState == 0 &&
+		if (_actionMode == kPointerAction) {
+			_player->calculateWalkTarget();
+			_player->playerFaceWalkTarget();
+		} else {
+			int roomObjIdx = _room->getObjectUnderCursor();
+			if (roomObjIdx != -1) {
+				// 2022:77ce
+				// TODO walk player to object.
+				_player->_walkToSequence = true;
+				_player->_walkToSequencePoint = _cursor.getPosition();
+				_player->_sequenceRotation = -1;
+				Common::Point currentCursorPos = _cursor.getPosition();
+				int objNum = _room->_roomObj[roomObjIdx].objNum;
+				if (walkToDirTbl[objNum] != 4) {
+					_player->_sequenceRotation = walkToDirTbl[objNum];
+					_cursor.updatePosition(walkToXTbl[objNum], walkToYTbl[objNum]);
 				}
-				int xDistToTarget = ABS(_player->_walkTarget.x - _player->_position.x);
-				int yDistToTarget = ABS(_player->_walkTarget.y - _player->_position.y);
-
-				if (_isRightMouseClicked && !_player->_actionToPerform) {
-					if (_actionMode == kLookAction) {
-						_actionMode = kPointerAction;
-					} else if (_actionMode == kPointerAction) {
-						_actionMode = kHandAction;
-					} else if (_actionMode == kHandAction) {
-						_actionMode = kLookAction;
+				if (objNum == 142 && _room->_roomNumber == 2) {
+					_player->_sequenceRotation = 0;
+					_cursor.updatePosition(347, 189);
+				} else if (objNum == 53 && _room->_roomNumber == 15) {
+					_player->_sequenceRotation = 0;
+					_cursor.updatePosition(369, 216);
+				} else if (objNum == 114) {
+					if (_cursor.getX() < 321) {
+						_player->_sequenceRotation = 3;
+						_cursor.updatePosition(169, 178);
+					} else {
+						_player->_sequenceRotation = 1;
+						_cursor.updatePosition(362, 198);
+					}
+				} else if (objNum == 189 || (objNum == 64 && _room->_roomNumber == 30)) {
+					_player->_sequenceRotation = 1;
+					_cursor.updatePosition(405, 208);
+				} else if (objNum == 50 || objNum == 85 || (objNum >= 163 && objNum <= 168)) {
+					_player->_sequenceRotation = 3;
+					_cursor.updatePosition(228, 211);
+				} else if (objNum == 51 || objNum == 187) {
+					_player->_sequenceRotation = 1;
+					_cursor.updatePosition(380, 211);
+				} else if (objNum == 116 && _actionMode == kUseStickAction) {
+					_player->_sequenceRotation = 1;
+					_cursor.updatePosition(285, 233);
+				} else if (objNum == 137) {
+					_player->_sequenceRotation = 1;
+					if (_actionMode == kUseHammerAction) {
+						_cursor.updatePosition(354, 175);
 					} else {
-						_actionMode = kPointerAction;
+						_cursor.updatePosition(409, 173);
+					}
+				} else if (objNum == 112 || objNum == 111) {
+					_player->_sequenceRotation = 1;
+					_cursor.updatePosition(464, 191);
+				} else if (objNum == 138 || objNum == 7 || objNum == 152) {
+					_player->_sequenceRotation = 1;
+					_cursor.updatePosition(292, 208);
+				} else if (objNum == 22 || objNum == 42 ||
+						   (objNum == 35 && _objectVar[22] < 2 && _cursor.getY() > 40)) {
+					_player->_sequenceRotation = 1;
+					if (_objectVar[22] == 0 || _objectVar[22] == 1) {
+						_cursor.updatePosition(437, 203);
+					}
+					if (_objectVar[22] == 2) {
+						_cursor.updatePosition(427, 196);
+					}
+					if (_objectVar[22] > 2) {
+						_cursor.updatePosition(394, 175);
 					}
-					_cursor.setCursorType((CursorType)_actionMode);
 				}
-				if (_player->isAtWalkTarget() && _player->_heroMoving && _player->_walkPathIndex != -1) {
-					_player->walkToNextConnector();
+
+				if (objNum == 102 && _objectVar[23] != 0 && _actionMode == kHandAction) {
+					_player->_sequenceRotation = 0;
+					_cursor.updatePosition(331, 195);
+				} else if (objNum < 104 || objNum > 108) {
+					if (objNum == 78) {
+						if (_room->_roomNumber == 2) {
+							_player->_sequenceRotation = 3;
+							_cursor.updatePosition(152, 239);
+						} else {
+							_player->_sequenceRotation = 1;
+							_cursor.updatePosition(497, 220);
+						}
+					} else if (objNum == 59) {
+						if (_room->_roomNumber == 3) {
+							_player->_sequenceRotation = 3;
+							_cursor.updatePosition(145, 239);
+						} else {
+							_player->_sequenceRotation = 1;
+							_cursor.updatePosition(520, 229);
+						}
+					}
+				} else {
+					_player->_sequenceRotation = 3;
+					_cursor.updatePosition(_room->_roomObj[roomObjIdx].xOffset + 30, 206);
 				}
-				if (_isLeftMouseClicked && _cursor.getY() < 41) {
-					_inventory.handleClick();
+				if (_room->_roomNumber == 34 || (_room->_roomNumber > 18 && _room->_roomNumber < 24)) {
+					_player->_walkTarget = _player->_position;
+				} else if (_cursor.getPosition() != _player->_position) {
+					_player->calculateWalkTarget();
 				}
-				_room->calculateScaledSpriteDimensions(_player->getWidth(), _player->getHeight(), _player->_position.y);
 
-				if (_player->isAtWalkTarget() && _player->_heroMoving && !_player->_actionToPerform) {
-					if (_useDoorTarget) {
-						_player->changeDirection(_player->_direction, _targetPlayerDirection);
-						_useDoorTarget = false;
-						_doorEnabled = true;
+				_cursor.updatePosition(currentCursorPos.x, currentCursorPos.y);
+				_player->playerFaceWalkTarget();
+				_player->_actionToPerform = true;
+			}
+		}
+	}
+	int xDistToTarget = ABS(_player->_walkTarget.x - _player->_position.x);
+	int yDistToTarget = ABS(_player->_walkTarget.y - _player->_position.y);
+
+	if (_isRightMouseClicked && !_player->_actionToPerform) {
+		if (_actionMode == kLookAction) {
+			_actionMode = kPointerAction;
+		} else if (_actionMode == kPointerAction) {
+			_actionMode = kHandAction;
+		} else if (_actionMode == kHandAction) {
+			_actionMode = kLookAction;
+		} else {
+			_actionMode = kPointerAction;
+		}
+		_cursor.setCursorType((CursorType)_actionMode);
+	}
+	if (_player->isAtWalkTarget() && _player->_heroMoving && _player->_walkPathIndex != -1) {
+		_player->walkToNextConnector();
+	}
+	if (_isLeftMouseClicked && _cursor.getY() < 41) {
+		_inventory.handleClick();
+	}
+	_room->calculateScaledSpriteDimensions(_player->getWidth(), _player->getHeight(), _player->_position.y);
+
+	if (_player->isAtWalkTarget() && _player->_heroMoving && !_player->_actionToPerform) {
+		if (_useDoorTarget) {
+			_player->changeDirection(_player->_direction, _targetPlayerDirection);
+			_useDoorTarget = false;
+			_doorEnabled = true;
+			return;
+		}
+		_player->_heroMoving = false;
+		if (_useDoorTarget || _doorEnabled) {
+			for (unsigned int i = 0; i < _room->_room1.size(); i++) {
+				RoomExit &roomExit = _room->_room1[i];
+				if (roomExit.roomNumber != 0xff
+					&& roomExit.x < _scaledSpriteWidth / 2 + _player->_position.x
+					&& _player->_position.x - _scaledSpriteWidth / 2 < roomExit.x + roomExit.width
+					&& roomExit.y < _player->_position.y
+					&& _player->_position.y - _scaledSpriteHeight < roomExit.y + roomExit.height
+					&& roomExit.direction == _player->_direction) {
+					bool bVar = true;
+					if (currentRoomNumber == 64 && roomExit.roomNumber == 64) {
+						bVar = false;
+						_console->printTosText(703);
+					}
+					if (currentRoomNumber == 67 && roomExit.roomNumber == 0) {
+						bVar = false;
+						_console->printTosText(902);
+					}
+					if ((currentRoomNumber == 59 && _objectVar[190] < 2) ||
+						(currentRoomNumber == 61 && _objectVar[22] < 3 && roomExit.roomNumber == 13) ||
+						(currentRoomNumber == 7 && roomExit.roomNumber == 38 && _objectVar[137] == 0) ||
+						(currentRoomNumber == 46 && roomExit.roomNumber == 60 && _objectVar[57] == 1) ||
+						(currentRoomNumber == 7 && roomExit.roomNumber == 38 && _objectVar[57] == 1) ||
+						(currentRoomNumber == 13 && roomExit.roomNumber == 31 && _objectVar[23] != 1) ||
+						(currentRoomNumber == 2 && roomExit.roomNumber == 0 && _objectVar[78] != 2) ||
+						(currentRoomNumber == 0 && roomExit.roomNumber == 2 && _objectVar[78] != 2) ||
+						(currentRoomNumber == 32 && roomExit.roomNumber == 13 && _objectVar[23] != 1) ||
+						(currentRoomNumber == 13 && roomExit.roomNumber == 32 && _objectVar[23] != 1) ||
+						(currentRoomNumber == 39 && roomExit.roomNumber == 46 && _objectVar[117] == 0) ||
+						(currentRoomNumber == 3 && roomExit.roomNumber == 9 && _objectVar[59] != 2) ||
+						(currentRoomNumber == 9 && roomExit.roomNumber == 3 && _objectVar[59] != 2)) {
+						bVar = false;
+					}
+					if (_currentTimeInSeconds > 64800 &&
+						((currentRoomNumber == 11 && roomExit.roomNumber == 15) ||
+						 (currentRoomNumber == 11 && roomExit.roomNumber == 16) ||
+						 (currentRoomNumber == 12 && roomExit.roomNumber == 17))) {
+						bVar = false;
+						_console->printTosText(936);
+					}
+					if (currentRoomNumber == 7 && roomExit.roomNumber == 38 && bVar) {
+						_player->loadAnimations("mirror.nsp");
+						_animation->setupOtherNspAnimation(0, 27);
 						return;
 					}
-					_player->_heroMoving = false;
-					if (_useDoorTarget || _doorEnabled) {
-						for (unsigned int i = 0; i < _room->_room1.size(); i++) {
-							RoomExit &roomExit = _room->_room1[i];
-							if (roomExit.roomNumber != 0xff
-								&& roomExit.x < _scaledSpriteWidth / 2 + _player->_position.x
-								&& _player->_position.x - _scaledSpriteWidth / 2 < roomExit.x + roomExit.width
-								&& roomExit.y < _player->_position.y
-								&& _player->_position.y - _scaledSpriteHeight < roomExit.y + roomExit.height
-								&& roomExit.direction == _player->_direction) {
-								bool bVar = true;
-								if (currentRoomNumber == 64 && roomExit.roomNumber == 64) {
-									bVar = false;
-									_console->printTosText(703);
-								}
-								if (currentRoomNumber == 67 && roomExit.roomNumber == 0) {
-									bVar = false;
-									_console->printTosText(902);
-								}
-								if ((currentRoomNumber == 59 && _objectVar[190] < 2) ||
-									(currentRoomNumber == 61 && _objectVar[22] < 3 && roomExit.roomNumber == 13) ||
-									(currentRoomNumber == 7 && roomExit.roomNumber == 38 && _objectVar[137] == 0) ||
-									(currentRoomNumber == 46 && roomExit.roomNumber == 60 && _objectVar[57] == 1) ||
-									(currentRoomNumber == 7 && roomExit.roomNumber == 38 && _objectVar[57] == 1) ||
-									(currentRoomNumber == 13 && roomExit.roomNumber == 31 && _objectVar[23] != 1) ||
-									(currentRoomNumber == 2 && roomExit.roomNumber == 0 && _objectVar[78] != 2) ||
-									(currentRoomNumber == 0 && roomExit.roomNumber == 2 && _objectVar[78] != 2) ||
-									(currentRoomNumber == 32 && roomExit.roomNumber == 13 && _objectVar[23] != 1) ||
-									(currentRoomNumber == 13 && roomExit.roomNumber == 32 && _objectVar[23] != 1) ||
-									(currentRoomNumber == 39 && roomExit.roomNumber == 46 && _objectVar[117] == 0) ||
-									(currentRoomNumber == 3 && roomExit.roomNumber == 9 && _objectVar[59] != 2) ||
-									(currentRoomNumber == 9 && roomExit.roomNumber == 3 && _objectVar[59] != 2)) {
-									bVar = false;
-								}
-								if (_currentTimeInSeconds > 64800 &&
-									((currentRoomNumber == 11 && roomExit.roomNumber == 15) ||
-									 (currentRoomNumber == 11 && roomExit.roomNumber == 16) ||
-									 (currentRoomNumber == 12 && roomExit.roomNumber == 17))) {
-									bVar = false;
-									_console->printTosText(936);
-								}
-								if (currentRoomNumber == 7 && roomExit.roomNumber == 38 && bVar) {
-									_player->loadAnimations("mirror.nsp");
-									_animation->setupOtherNspAnimation(0, 27);
-									return;
-								}
-								if ((currentRoomNumber == 41 && roomExit.roomNumber == 44 && bVar) ||
-									(currentRoomNumber == 44 && roomExit.roomNumber == 41 && bVar)) {
-									_player->loadAnimations("beamer.nsp");
-									_animation->setupOtherNspAnimation(0, 57);
-									return;
-								}
-								if (currentRoomNumber == 10 && roomExit.roomNumber == 6 && bVar && !_player->_isAutoWalkingToBed) {
-									_player->loadAnimations("rm10strs.nsp");
-									_animation->setupOtherNspAnimation(0, 53);
-									return;
-								}
-								if (currentRoomNumber == 38 && roomExit.roomNumber == 7 && bVar) {
-									_player->loadAnimations("darkin.nsp");
-									_animation->setupOtherNspAnimation(0, 41);
-									return;
-								}
-								if (_objectVar[52] == 1 &&
-									((currentRoomNumber == 12 && roomExit.roomNumber == 17) || (currentRoomNumber == 11 && (roomExit.roomNumber == 15 || roomExit.roomNumber == 16)))
-									) {
-									_console->printTosText(437);
-									bVar = false;
-									// TODO the original sets roomExit to number 8 here.
-								} else if (currentRoomNumber == 11 && roomExit.roomNumber == 15 && bVar) {
-									_player->loadAnimations("rm11strs.nsp");
-									_animation->setupOtherNspAnimation(0, 55);
-									return;
-								}
-								if (currentRoomNumber == 14 && roomExit.roomNumber == 35 && _objectVar[99] != 1) {
-									bVar = false;
-									_console->printTosText(937);
-								}
-								if (bVar && (
-												(currentRoomNumber == 6 && roomExit.roomNumber == 10) ||
-												(currentRoomNumber == 11 && roomExit.roomNumber == 16) ||
-												(currentRoomNumber == 12 && roomExit.roomNumber == 17)
-												)
-									) {
-									_player->loadAnimations("opendoor.nsp");
-									_animation->setupOtherNspAnimation(0, 14);
-									// FUN_1208_0dac_sound_related(10,CONCAT11(extraout_AH,5));
-									return;
-								}
-								if (currentRoomNumber == 6 && roomExit.roomNumber == 5 && bVar) {
-									_player->_position.x = 346;
-									_player->_position.y = 176;
-									_player->loadAnimations("stairs.nsp");
-									_animation->setupOtherNspAnimation(1, 6);
-									return;
-								}
-								if (currentRoomNumber == 33 && roomExit.roomNumber == 34 && bVar) {
-									_player->loadAnimations("opendoor.nsp");
-									_animation->setupOtherNspAnimation(0, 25);
-									// FUN_1208_0dac_sound_related(24,CONCAT11(extraout_AH,5));
-									return;
-								}
-								if (currentRoomNumber == 5 && roomExit.roomNumber == 6 && bVar) {
-									if (_player->_position.x == 466 && _player->_position.y == 195) {
-										_player->loadAnimations("stairs.nsp");
-										_player->_position.x -= 35;
-										_animation->setupOtherNspAnimation(3, 7);
-										return;
-									}
-									bVar = false;
-								}
-								if (currentRoomNumber == 40 && roomExit.roomNumber == 41 && _objectVar[59] != 2) {
-									_console->printTosText(775);
-									bVar = false;
-								}
-								if (currentRoomNumber == 44 && roomExit.roomNumber == 43 && _objectVar[78] != 2) {
-									_console->printTosText(775);
-									bVar = false;
-								}
+					if ((currentRoomNumber == 41 && roomExit.roomNumber == 44 && bVar) ||
+						(currentRoomNumber == 44 && roomExit.roomNumber == 41 && bVar)) {
+						_player->loadAnimations("beamer.nsp");
+						_animation->setupOtherNspAnimation(0, 57);
+						return;
+					}
+					if (currentRoomNumber == 10 && roomExit.roomNumber == 6 && bVar && !_player->_isAutoWalkingToBed) {
+						_player->loadAnimations("rm10strs.nsp");
+						_animation->setupOtherNspAnimation(0, 53);
+						return;
+					}
+					if (currentRoomNumber == 38 && roomExit.roomNumber == 7 && bVar) {
+						_player->loadAnimations("darkin.nsp");
+						_animation->setupOtherNspAnimation(0, 41);
+						return;
+					}
+					if (_objectVar[52] == 1 &&
+						((currentRoomNumber == 12 && roomExit.roomNumber == 17) || (currentRoomNumber == 11 && (roomExit.roomNumber == 15 || roomExit.roomNumber == 16)))
+						) {
+						_console->printTosText(437);
+						bVar = false;
+						// TODO the original sets roomExit to number 8 here.
+					} else if (currentRoomNumber == 11 && roomExit.roomNumber == 15 && bVar) {
+						_player->loadAnimations("rm11strs.nsp");
+						_animation->setupOtherNspAnimation(0, 55);
+						return;
+					}
+					if (currentRoomNumber == 14 && roomExit.roomNumber == 35 && _objectVar[99] != 1) {
+						bVar = false;
+						_console->printTosText(937);
+					}
+					if (bVar && (
+									(currentRoomNumber == 6 && roomExit.roomNumber == 10) ||
+									(currentRoomNumber == 11 && roomExit.roomNumber == 16) ||
+									(currentRoomNumber == 12 && roomExit.roomNumber == 17)
+									)
+						) {
+						_player->loadAnimations("opendoor.nsp");
+						_animation->setupOtherNspAnimation(0, 14);
+						// FUN_1208_0dac_sound_related(10,CONCAT11(extraout_AH,5));
+						return;
+					}
+					if (currentRoomNumber == 6 && roomExit.roomNumber == 5 && bVar) {
+						_player->_position.x = 346;
+						_player->_position.y = 176;
+						_player->loadAnimations("stairs.nsp");
+						_animation->setupOtherNspAnimation(1, 6);
+						return;
+					}
+					if (currentRoomNumber == 33 && roomExit.roomNumber == 34 && bVar) {
+						_player->loadAnimations("opendoor.nsp");
+						_animation->setupOtherNspAnimation(0, 25);
+						// FUN_1208_0dac_sound_related(24,CONCAT11(extraout_AH,5));
+						return;
+					}
+					if (currentRoomNumber == 5 && roomExit.roomNumber == 6 && bVar) {
+						if (_player->_position.x == 466 && _player->_position.y == 195) {
+							_player->loadAnimations("stairs.nsp");
+							_player->_position.x -= 35;
+							_animation->setupOtherNspAnimation(3, 7);
+							return;
+						}
+						bVar = false;
+					}
+					if (currentRoomNumber == 40 && roomExit.roomNumber == 41 && _objectVar[59] != 2) {
+						_console->printTosText(775);
+						bVar = false;
+					}
+					if (currentRoomNumber == 44 && roomExit.roomNumber == 43 && _objectVar[78] != 2) {
+						_console->printTosText(775);
+						bVar = false;
+					}
 
-								if (bVar) {
-									if (currentRoomNumber != 0x22 && (currentRoomNumber < 0x13 || currentRoomNumber > 0x17)) {
-										_player->_playerIsChangingDirection = false;
-										_player->_heroMoving = false;
-										_player->updateSprite();
-										updateDisplay();
-										_previousRoomNumber = currentRoomNumber;
+					if (bVar) {
+						if (currentRoomNumber != 0x22 && (currentRoomNumber < 0x13 || currentRoomNumber > 0x17)) {
+							_player->_playerIsChangingDirection = false;
+							_player->_heroMoving = false;
+							_player->updateSprite();
+							updateDisplay();
+							_previousRoomNumber = currentRoomNumber;
 //										currentRoomNumber = *(byte *)((int)&roomExitTbl[0].roomNumber + iVar7 * 0xb);
 //										if (((isAutoWalkingToBed != False) && (DAT_2c85_8254 == 2)) && (currentRoomNumber == 10)) {
 //											FUN_171d_0c6e();
 //										}
-										changeToRoom(roomExit.roomNumber);
+							changeToRoom(roomExit.roomNumber);
 //										if ((isAutoWalkingToBed != False) &&
 //											((currentRoomNumber != 5 ||
 //											  (lVar9 = CONCAT22(playerSpriteX_long._2_2_,(uint)playerSpriteX_long),
@@ -776,224 +795,208 @@ void DarkseedEngine::handleInput() {
 //											lVar9 = CONCAT22(playerSpriteX_long._2_2_,(uint)playerSpriteX_long);
 //											lVar10 = CONCAT22(playerSpriteY_long._2_2_,(uint)playerSpriteY_long);
 //										}
-										return;
-									}
-								}
-							}
+							return;
 						}
 					}
 				}
-				if (_player->isAtWalkTarget() && _player->_actionToPerform) {
-					if (_player->_sequenceRotation != -1) {
-						_player->changeDirection(_player->_direction, _player->_sequenceRotation);
-						_player->updateSprite();
-						_player->_sequenceRotation = -1;
-						return;
-					}
-					_player->_heroMoving = false;
-					_player->_actionToPerform = false;
-					// TODO complete at final destination logic. 2022:879d
-					Common::Point currentCursorPos = _cursor.getPosition();
-					if (_player->_walkToSequence) {
-						_cursor.setPosition(_player->_walkToSequencePoint);
-						_player->_walkToSequence = false;
-					}
-					int objIdx = _room->getObjectUnderCursor();
-					_cursor.setPosition(currentCursorPos);
-					if (objIdx != -1) {
-						int objType = _room->_roomObj[objIdx].type;
-						int objNum = _room->_roomObj[objIdx].objNum;
-						if (((objType != 4 && objType != 0 && objType < 10) || objNum > 5 || _room->_collisionType != 0)) {
-							if (_room->_collisionType == 0) {
-								handleObjCollision(objNum);
-							} else {
-								handleObjCollision(objIdx); // TODO is this correct?
-							}
-						}
-					}
-					if (objIdx == -1) {
-						_console->printTosText(938);
-						if (_actionMode > 3) {
-							_actionMode = kPointerAction;
-							_cursor.setCursorType((CursorType)_actionMode);
-						}
+			}
+		}
+	}
+	if (_player->isAtWalkTarget() && _player->_actionToPerform) {
+		if (_player->_sequenceRotation != -1) {
+			_player->changeDirection(_player->_direction, _player->_sequenceRotation);
+			_player->updateSprite();
+			_player->_sequenceRotation = -1;
+			return;
+		}
+		_player->_heroMoving = false;
+		_player->_actionToPerform = false;
+		// TODO complete at final destination logic. 2022:879d
+		Common::Point currentCursorPos = _cursor.getPosition();
+		if (_player->_walkToSequence) {
+			_cursor.setPosition(_player->_walkToSequencePoint);
+			_player->_walkToSequence = false;
+		}
+		int objIdx = _room->getObjectUnderCursor();
+		_cursor.setPosition(currentCursorPos);
+		if (objIdx != -1) {
+			int objType = _room->_roomObj[objIdx].type;
+			int objNum = _room->_roomObj[objIdx].objNum;
+			if (((objType != 4 && objType != 0 && objType < 10) || objNum > 5 || _room->_collisionType != 0)) {
+				if (_room->_collisionType == 0) {
+					handleObjCollision(objNum);
+				} else {
+					handleObjCollision(objIdx); // TODO is this correct?
+				}
+			}
+		}
+		if (objIdx == -1) {
+			_console->printTosText(938);
+			if (_actionMode > 3) {
+				_actionMode = kPointerAction;
+				_cursor.setCursorType((CursorType)_actionMode);
+			}
+		} else {
+			if (_actionMode > 3) {
+				_actionMode = kPointerAction;
+				_cursor.setCursorType((CursorType)_actionMode);
+			}
+		}
+	}
+	if (!_animation->_isPlayingAnimation_maybe) {
+		// walk to destination point
+		int walkXDelta = 0;
+		int walkYDelta = 0;
+		int local_a = _scaledWalkSpeed_maybe * 16;
+		if (_player->_direction == 0 || _player->_direction == 2) {
+			local_a = local_a / 3;
+		}
+		if (local_a < 1000) {
+			local_a = 1000;
+		}
+		if (yDistToTarget < xDistToTarget) {
+			walkXDelta = local_a;
+			if (yDistToTarget == 0) {
+				walkYDelta = 0;
+			} else {
+				walkYDelta = (local_a * yDistToTarget) / xDistToTarget;
+			}
+		} else {
+			walkYDelta = local_a;
+			if (xDistToTarget == 0) {
+				walkXDelta = 0;
+			} else {
+				walkXDelta = (local_a * xDistToTarget) / yDistToTarget;
+			}
+		}
+		if (walkXDelta != 0) {
+			walkXDelta = walkXDelta / 1000;
+		}
+		if (walkYDelta != 0) {
+			walkYDelta = walkYDelta / 1000;
+		}
+		if (!_room->canWalkAtLocation(_player->_walkTarget.x, _player->_walkTarget.y) || _player->isAtWalkTarget()) {
+			bool bVar1 = false;
+			bool bVar2 = false;
+			if ((walkYDelta == 0 && _player->_position.y != _player->_walkTarget.y) ||
+				_player->_position.y == _player->_walkTarget.y) {
+				bVar2 = true;
+			}
+			if ((walkXDelta == 0 && _player->_position.x != _player->_walkTarget.x) ||
+				_player->_position.x == _player->_walkTarget.x) {
+				bVar1 = true;
+			}
+			int local_6 = 0;
+			int local_4 = 0;
+			if (_player->_walkTarget.x < _player->_position.x) {
+				if (_player->_position.x - _player->_walkTarget.x <= walkXDelta) {
+					local_6 = _player->_position.x - _player->_walkTarget.x;
+				} else {
+					local_6 = walkXDelta;
+				}
+				while (!bVar1 && local_6 > 0) {
+					if (!_room->canWalkAtLocation(_player->_position.x - local_6 - 1, _player->_position.y)) {
+						local_6--;
 					} else {
-						if (_actionMode > 3) {
-							_actionMode = kPointerAction;
-							_cursor.setCursorType((CursorType)_actionMode);
-						}
+						_player->_position.x -= local_6;
+						_player->_heroMoving = true;
+						bVar1 = true;
 					}
 				}
-				if (!_animation->_isPlayingAnimation_maybe) {
-					// walk to destination point
-					int walkXDelta = 0;
-					int walkYDelta = 0;
-					int local_a = _scaledWalkSpeed_maybe * 16;
-					if (_player->_direction == 0 || _player->_direction == 2) {
-						local_a = local_a / 3;
-					}
-					if (local_a < 1000) {
-						local_a = 1000;
-					}
-					if (yDistToTarget < xDistToTarget) {
-						walkXDelta = local_a;
-						if (yDistToTarget == 0) {
-							walkYDelta = 0;
-						} else {
-							walkYDelta = (local_a * yDistToTarget) / xDistToTarget;
-						}
+			} else if (_player->_position.x < _player->_walkTarget.x) {
+				if (_player->_walkTarget.x - _player->_position.x <= walkXDelta) {
+					local_6 = _player->_walkTarget.x - _player->_position.x;
+				} else {
+					local_6 = walkXDelta;
+				}
+				while (!bVar1 && local_6 > 0) {
+					if (!_room->canWalkAtLocation(_player->_position.x + local_6 + 1, _player->_position.y)) {
+						local_6--;
 					} else {
-						walkYDelta = local_a;
-						if (xDistToTarget == 0) {
-							walkXDelta = 0;
-						} else {
-							walkXDelta = (local_a * xDistToTarget) / yDistToTarget;
-						}
+						_player->_position.x += local_6;
+						_player->_heroMoving = true;
+						bVar1 = true;
 					}
-					if (walkXDelta != 0) {
-						walkXDelta = walkXDelta / 1000;
+				}
+			}
+			if (_player->_walkTarget.y < _player->_position.y) {
+				if (walkYDelta < _player->_position.y - _player->_walkTarget.y) {
+					local_4 = walkYDelta;
+				} else {
+					local_4 = _player->_position.y - _player->_walkTarget.y;
+				}
+				while (!bVar2 && local_4 > 0) {
+					int local_34 = (_player->_position.y - local_4) - 1;
+					if (local_34 > 0xee) {
+						local_34 = 0xee;
 					}
-					if (walkYDelta != 0) {
-						walkYDelta = walkYDelta / 1000;
+					if (!_room->canWalkAtLocation(_player->_position.x, (local_34 - local_4) - 2)) {
+						local_4--;
+					} else {
+						_player->_position.y -= local_4;
+						_player->_heroMoving = true;
+						bVar2 = true;
 					}
-					if (!_room->canWalkAtLocation(_player->_walkTarget.x, _player->_walkTarget.y) || _player->isAtWalkTarget()) {
-						bool bVar1 = false;
-						bool bVar2 = false;
-						if ((walkYDelta == 0 && _player->_position.y != _player->_walkTarget.y) ||
-							_player->_position.y == _player->_walkTarget.y) {
-							bVar2 = true;
-						}
-						if ((walkXDelta == 0 && _player->_position.x != _player->_walkTarget.x) ||
-							_player->_position.x == _player->_walkTarget.x) {
-							bVar1 = true;
-						}
-						int local_6 = 0;
-						int local_4 = 0;
-						if (_player->_walkTarget.x < _player->_position.x) {
-							if (_player->_position.x - _player->_walkTarget.x <= walkXDelta) {
-								local_6 = _player->_position.x - _player->_walkTarget.x;
-							} else {
-								local_6 = walkXDelta;
-							}
-							while (!bVar1 && local_6 > 0) {
-								if (!_room->canWalkAtLocation(_player->_position.x - local_6 - 1, _player->_position.y)) {
-									local_6--;
-								} else {
-									_player->_position.x -= local_6;
-									_player->_heroMoving = true;
-									bVar1 = true;
-								}
-							}
-						} else if (_player->_position.x < _player->_walkTarget.x) {
-							if (_player->_walkTarget.x - _player->_position.x <= walkXDelta) {
-								local_6 = _player->_walkTarget.x - _player->_position.x;
-							} else {
-								local_6 = walkXDelta;
-							}
-							while (!bVar1 && local_6 > 0) {
-								if (!_room->canWalkAtLocation(_player->_position.x + local_6 + 1, _player->_position.y)) {
-									local_6--;
-								} else {
-									_player->_position.x += local_6;
-									_player->_heroMoving = true;
-									bVar1 = true;
-								}
-							}
-						}
-						if (_player->_walkTarget.y < _player->_position.y) {
-							if (walkYDelta < _player->_position.y - _player->_walkTarget.y) {
-								local_4 = walkYDelta;
-							} else {
-								local_4 = _player->_position.y - _player->_walkTarget.y;
-							}
-							while (!bVar2 && local_4 > 0) {
-								int local_34 = (_player->_position.y - local_4) - 1;
-								if (local_34 > 0xee) {
-									local_34 = 0xee;
-								}
-								if (!_room->canWalkAtLocation(_player->_position.x, (local_34 - local_4) - 2)) {
-									local_4--;
-								} else {
-									_player->_position.y -= local_4;
-									_player->_heroMoving = true;
-									bVar2 = true;
-								}
-							}
-						} else if (_player->_position.y < _player->_walkTarget.y) {
-							if (walkYDelta < _player->_walkTarget.y - _player->_position.y) {
-								local_4 = walkYDelta;
-							} else {
-								local_4 = _player->_walkTarget.y - _player->_position.y;
-							}
-							while (!bVar2 && local_4 > 0) {
-								if (!_room->canWalkAtLocation(_player->_position.x, _player->_position.y + local_4 + 2)) {
-									local_4--;
-								} else {
-									_player->_position.y += local_4;
-									_player->_heroMoving = true;
-									bVar2 = true;
-								}
-							}
-						}
-
-						if (!bVar1 || !bVar2) {
-							_player->_walkTarget = _player->_position;
-						}
-						_doorEnabled = false;
-						if (_player->_isAutoWalkingToBed && _player->isAtWalkTarget()) {
-							_player->setplayertowardsbedroom();
-						}
+				}
+			} else if (_player->_position.y < _player->_walkTarget.y) {
+				if (walkYDelta < _player->_walkTarget.y - _player->_position.y) {
+					local_4 = walkYDelta;
+				} else {
+					local_4 = _player->_walkTarget.y - _player->_position.y;
+				}
+				while (!bVar2 && local_4 > 0) {
+					if (!_room->canWalkAtLocation(_player->_position.x, _player->_position.y + local_4 + 2)) {
+						local_4--;
 					} else {
-						if (_player->_walkTarget.x < _player->_position.x) {
-							if (_player->_position.x - _player->_walkTarget.x < walkXDelta) {
-								walkXDelta = _player->_position.x - _player->_walkTarget.x;
-							}
-							_player->_positionLong.x -= walkXDelta;
-						} else if (_player->_position.x < _player->_walkTarget.x) {
-							if (_player->_walkTarget.x - _player->_position.x < walkXDelta) {
-								walkXDelta = _player->_walkTarget.x - _player->_position.x;
-							}
-							_player->_positionLong.x += walkXDelta;
-						}
-						if (_player->_walkTarget.y < _player->_position.y) {
-							if (_player->_position.y - _player->_walkTarget.y < walkYDelta) {
-								walkYDelta = _player->_position.y - _player->_walkTarget.y;
-							}
-							_player->_positionLong.y -= walkYDelta;
-						} else if (_player->_position.y < _player->_walkTarget.y) {
-							if (_player->_walkTarget.y - _player->_position.y < walkYDelta) {
-								walkYDelta = _player->_walkTarget.y - _player->_position.y;
-							}
-							_player->_positionLong.y += walkYDelta;
-						}
-						if (!_room->canWalkAtLocation(_player->_positionLong.x, _player->_positionLong.y)) {
-							_player->_walkTarget = _player->_position;
-							_player->_positionLong = _player->_position;
-						} else {
-							_player->_position = _player->_positionLong;
-						}
+						_player->_position.y += local_4;
+						_player->_heroMoving = true;
+						bVar2 = true;
 					}
 				}
-//				else if (_isLeftMouseClicked) {
-//					// TODO do actions here.
-//					handlePointerAction();
-//				}
+			}
+
+			if (!bVar1 || !bVar2) {
+				_player->_walkTarget = _player->_position;
+			}
+			_doorEnabled = false;
+			if (_player->_isAutoWalkingToBed && _player->isAtWalkTarget()) {
+				_player->setplayertowardsbedroom();
 			}
 		} else {
-			// turn player around.
-			_player->_playerSpriteWalkIndex_maybe = (int16)((_player->_playerSpriteWalkIndex_maybe + _player->_playerWalkFrameDeltaOffset) & 7);
-			if (_player->_playerSpriteWalkIndex_maybe == _player->_playerNewFacingDirection_maybe) {
-				_player->_playerIsChangingDirection = false;
-				_player->_direction = _player->_playerNewFacingDirection_maybe / 2;
+			if (_player->_walkTarget.x < _player->_position.x) {
+				if (_player->_position.x - _player->_walkTarget.x < walkXDelta) {
+					walkXDelta = _player->_position.x - _player->_walkTarget.x;
+				}
+				_player->_positionLong.x -= walkXDelta;
+			} else if (_player->_position.x < _player->_walkTarget.x) {
+				if (_player->_walkTarget.x - _player->_position.x < walkXDelta) {
+					walkXDelta = _player->_walkTarget.x - _player->_position.x;
+				}
+				_player->_positionLong.x += walkXDelta;
+			}
+			if (_player->_walkTarget.y < _player->_position.y) {
+				if (_player->_position.y - _player->_walkTarget.y < walkYDelta) {
+					walkYDelta = _player->_position.y - _player->_walkTarget.y;
+				}
+				_player->_positionLong.y -= walkYDelta;
+			} else if (_player->_position.y < _player->_walkTarget.y) {
+				if (_player->_walkTarget.y - _player->_position.y < walkYDelta) {
+					walkYDelta = _player->_walkTarget.y - _player->_position.y;
+				}
+				_player->_positionLong.y += walkYDelta;
+			}
+			if (!_room->canWalkAtLocation(_player->_positionLong.x, _player->_positionLong.y)) {
+				_player->_walkTarget = _player->_position;
+				_player->_positionLong = _player->_position;
+			} else {
+				_player->_position = _player->_positionLong;
 			}
-			_player->updateSprite();
-		}
-	} else {
-		_animation->updateAnimation();
-		if (!_animation->_isPlayingAnimation_maybe && _player->_isAutoWalkingToBed) {
-			_player->setplayertowardsbedroom();
 		}
 	}
+//				else if (_isLeftMouseClicked) {
+//					// TODO do actions here.
+//					handlePointerAction();
+//				}
 }
 
 void DarkseedEngine::handlePointerAction() {


Commit: d764ca35f59d7287870ecdd47579cbe93e92ec54
    https://github.com/scummvm/scummvm/commit/d764ca35f59d7287870ecdd47579cbe93e92ec54
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2024-09-29T23:56:10+02:00

Commit Message:
DARKSEED: Whitespace fixes

Changed paths:
    engines/darkseed/debugconsole.h
    engines/darkseed/tostext.cpp
    engines/darkseed/tostext.h


diff --git a/engines/darkseed/debugconsole.h b/engines/darkseed/debugconsole.h
index 23e0b4a6cef..3ae67b32c00 100644
--- a/engines/darkseed/debugconsole.h
+++ b/engines/darkseed/debugconsole.h
@@ -1,4 +1,3 @@
-
 /* ScummVM - Graphic Adventure Engine
  *
  * ScummVM is the legal property of its developers, whose names
diff --git a/engines/darkseed/tostext.cpp b/engines/darkseed/tostext.cpp
index d95d996a249..2e0d9b9f6ca 100644
--- a/engines/darkseed/tostext.cpp
+++ b/engines/darkseed/tostext.cpp
@@ -1,4 +1,3 @@
-
 /* ScummVM - Graphic Adventure Engine
  *
  * ScummVM is the legal property of its developers, whose names
diff --git a/engines/darkseed/tostext.h b/engines/darkseed/tostext.h
index 4726e1f0af7..8f62589dad1 100644
--- a/engines/darkseed/tostext.h
+++ b/engines/darkseed/tostext.h
@@ -1,4 +1,3 @@
-
 /* ScummVM - Graphic Adventure Engine
  *
  * ScummVM is the legal property of its developers, whose names




More information about the Scummvm-git-logs mailing list