[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